配置队列大小的TaskExecutor与AcceptOnceFileListFilter协作机制咨询
问题解答
关于被拒绝任务的重试问题
当线程池满且队列已满时,默认的AbortPolicy会直接拒绝新任务,但此时**AcceptOnceFileListFilter已经完成了文件接收标记**——因为文件筛选逻辑是在轮询阶段(获取文件列表时)就执行的,之后才会尝试将任务提交到线程池。这意味着被拒绝的文件会被标记为“已接收”,后续轮询不会自动重试处理这些文件,除非你手动清除过滤器的缓存,或者文件本身发生了修改(若使用带修改时间校验的过滤器变种)。
实现“等待空闲后再提交任务”的配置方案
要满足线程池+队列满时等待空闲再添加任务的需求,最直接的方式是修改线程池的拒绝策略为CallerRunsPolicy,具体Spring Integration XML配置如下:
1. 配置带自定义拒绝策略的线程池
<bean id="fileTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <property name="corePoolSize" value="10"/> <property name="maxPoolSize" value="10"/> <property name="queueCapacity" value="50"/> <!-- 当线程池和队列都满时,由轮询线程自行执行任务,阻塞后续轮询直到任务完成 --> <property name="rejectedExecutionHandler"> <bean class="java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy"/> </property> </bean>
2. 配置文件输入适配器并关联线程池
<int-file:inbound-channel-adapter id="txtFileInboundAdapter" directory="file:/your/target/directory" channel="fileProcessingChannel" filename-pattern="*.txt" task-executor="fileTaskExecutor"> <int:poller fixed-rate="2000" max-messages-per-poll="10"/> <int-file:filter> <bean class="org.springframework.integration.file.filters.AcceptOnceFileListFilter"/> </int-file:filter> </int-file:inbound-channel-adapter>
策略说明
CallerRunsPolicy的作用是:当线程池和队列都无法接收新任务时,由发起任务提交的线程(也就是轮询文件的线程)直接执行该任务。这会导致轮询线程被阻塞,直到当前任务处理完成,自然实现了“等待线程/队列空闲后再继续轮询添加任务”的效果,同时避免了任务被拒绝和丢失的问题。
内容的提问来源于stack exchange,提问作者rairai
相关产品推荐
相关产品推荐

