我正在尝试设置一个队列,该队列将由一个轮询器线程轮询,并将其内容移交给通过调度程序调用的某个服务。 taskExecutor的。以下代码是我提出的
<int:channel id="dataInQueue">
<int:priority-queue capacity="100" />
</int:channel>
<int:bridge input-channel="dataInQueue" output-channel="dataInProcesingQueue">
<int:poller receive-timeout="5000" fixed-rate="500" task-executor="taskScheduler" />
</int:bridge>
<int:router input-channel="dataInProcesingQueue" expression="payload.runType.id">
<int:mapping value="1" channel="processingQ1"/>
</int:router>
<int:channel id="processingQ1" >
<int:dispatcher task-executor="taskExecutor"/>
</int:channel>
<int:chain input-channel="processingQ1" output-channel="outChannel">
<int:service-activator ref="myService" />
</int:chain>
<bean id="taskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="maxPoolSize" value="20" />
<property name="corePoolSize" value="20" />
<property name="threadNamePrefix" value="My-TaskExecutor" />
</bean>
<bean id="taskScheduler"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
<property name="poolSize" value="20" />
<property name="threadNamePrefix" value="My-TaskScheduler" />
</bean>
不幸的是,这不起作用。如果我在队列中放置一条消息,我看不到它正在被处理。另一方面,如果我更换taskExecutor&amp; taskScheduler与 org.springframework.core.task.SimpleAsyncTaskExecutor 实现然后一切都开始工作。 看起来问题出在我的线程池配置的某个地方,但我看不到任何错误。
答案 0 :(得分:2)
只需删除此task-executor="taskScheduler"
。
轮询器已在内部使用内置taskScheduler
; task-executor
属性适用于您希望立即切换到另一个线程的时间。
目前还不清楚为什么会导致您的应用无法正常工作,但调度程序交给自己是多余的。
只需删除它,调度程序将在路由器之后传递给执行程序。
或者,在轮询器上设置task-executor="taskExecutor"
并删除processingQ1
上的调度程序 - 您不需要两次切换。
修改强>
那就是说,我刚尝试了你的场景,它对我来说没问题(我看到双重切换)......
11:05:43.623 DEBUG [My-TaskScheduler4][org.springframework.integration.endpoint.SourcePollingChannelAdapter] Poll resulted in Message: GenericMessage [payload=foo, headers={id=a23d369b-a7c7-50d6-2209-6df83e51f380, timestamp=1422720343623}]
11:05:43.628 DEBUG [My-TaskScheduler15][org.springframework.integration.channel.PriorityChannel] postReceive on channel 'dataInQueue', message: GenericMessage [payload=foo, headers={id=a23d369b-a7c7-50d6-2209-6df83e51f380, timestamp=1422720343623}]
11:05:43.628 DEBUG [My-TaskScheduler4][org.springframework.integration.channel.PriorityChannel] postSend (sent=true) on channel 'dataInQueue', message: GenericMessage [payload=foo, headers={id=a23d369b-a7c7-50d6-2209-6df83e51f380, timestamp=1422720343623}]
11:05:43.629 DEBUG [My-TaskScheduler15][org.springframework.integration.endpoint.PollingConsumer] Poll resulted in Message: GenericMessage [payload=foo, headers={id=a23d369b-a7c7-50d6-2209-6df83e51f380, timestamp=1422720343623}]
11:05:43.629 DEBUG [My-TaskScheduler15][org.springframework.integration.handler.BridgeHandler] org.springframework.integration.handler.BridgeHandler#0 received message: GenericMessage [payload=foo, headers={id=a23d369b-a7c7-50d6-2209-6df83e51f380, timestamp=1422720343623}]
11:05:43.630 DEBUG [My-TaskScheduler15][org.springframework.integration.channel.ExecutorChannel] postSend (sent=true) on channel 'toRabbit', message: GenericMessage [payload=foo, headers={id=a23d369b-a7c7-50d6-2209-6df83e51f380, timestamp=1422720343623}]
11:05:43.631 DEBUG [My-TaskExecutor1][org.springframework.integration.amqp.outbound.AmqpOutboundEndpoint] org.springframework.integration.amqp.outbound.AmqpOutboundEndpoint#0 received message: GenericMessage [payload=foo, headers={id=a23d369b-a7c7-50d6-2209-6df83e51f380, timestamp=1422720343623}]
如果在我的建议之后它仍然不起作用,我建议你打开DEBUG记录(包括线程名称)并跟踪切换。