作业启动网关和持久队列
job-launching-gateway and persistent queue
我正在使用 spring-boot、spring-batch 和 spring-integration 开发一个项目。
我已经配置 spring-integration 以在收到新消息时启动 spring-批处理作业。
我向连接到 JobLaunchingGateway 的 spring 集成通道发送一条消息,对于每条消息,JobLaunchingGateway 尝试启动一个新的 TaskExecutor。
让通道由持久队列支持(以 ActiveMQ 为例)
让task-executor pool-size等于2。
我想配置系统,以便当执行程序池大小已被使用时,新消息不会被 JobLaunchingGateway 消耗,而是保留在持久队列中。
可能吗?有没有最佳实践。
如有任何反馈,我们将不胜感激。
提前致谢。
您可以向 TE 添加队列限制并使用 CallerBlocksPolicy' for the
RejectedExecutionHandler`。
但是,如果失败,您将丢失队列中的任务。
通常最好使用消息驱动的通道,将并发设置为两个并 运行 侦听器容器线程上的作业,而不是使用 TE 运行 作业。
额外的好处是如果作业失败或机器崩溃,您不会丢失该请求。一旦您移交给 TE,消息就会从队列中消失。
我正在使用 spring-boot、spring-batch 和 spring-integration 开发一个项目。
我已经配置 spring-integration 以在收到新消息时启动 spring-批处理作业。
我向连接到 JobLaunchingGateway 的 spring 集成通道发送一条消息,对于每条消息,JobLaunchingGateway 尝试启动一个新的 TaskExecutor。
让通道由持久队列支持(以 ActiveMQ 为例) 让task-executor pool-size等于2。
我想配置系统,以便当执行程序池大小已被使用时,新消息不会被 JobLaunchingGateway 消耗,而是保留在持久队列中。
可能吗?有没有最佳实践。
如有任何反馈,我们将不胜感激。 提前致谢。
您可以向 TE 添加队列限制并使用 CallerBlocksPolicy' for the
RejectedExecutionHandler`。
但是,如果失败,您将丢失队列中的任务。
通常最好使用消息驱动的通道,将并发设置为两个并 运行 侦听器容器线程上的作业,而不是使用 TE 运行 作业。
额外的好处是如果作业失败或机器崩溃,您不会丢失该请求。一旦您移交给 TE,消息就会从队列中消失。