将TaskExecutor与PublishSubscribeChannel一起使用

时间:2016-06-27 15:24:43

标签: java spring spring-integration

我有这样的java spring boot配置:

@Bean
public SubscribableChannel channel(MessageHandler handler) {
   PublishSubscribeChannel channel = new PublishSubscribeChannel(Executors.newFixedThreadPool(2));
   channel.subscribe(handler);
   return channel;
}

我的处理程序代码:

@Service
public class SomeDataHandler implements MessageHandler {

    @Override
    public void handleMessage(Message<?> message) throws MessagingException {
        System.out.print(message.getPayload());
    }
}

还有一些客户端代码:

@Autowired
private SubscribableChannel channel
...
channel.send(...)

它不起作用。什么都没发生。 但是这个配置对我来说很好:

@Bean
public SubscribableChannel channel(MessageHandler handler) {
   PublishSubscribeChannel channel = new PublishSubscribeChannel();
   channel.subscribe(handler);
   return channel;
}

所以看起来我需要做更多的事情来将任务执行器应用到我的频道。有任何想法吗?感谢。

Spring集成版 - 4.2.5

1 个答案:

答案 0 :(得分:1)

“不起作用”并不多 - 显示您的执行器和处理程序bean配置。

启用DEBUG日志记录 - 它可以帮助您弄清楚发生了什么。

你不应该订阅bean声明中的频道;处理程序将由框架自动订阅(如果配置正确)。

修改

你并没有真正使用它设计的框架;当使用执行程序时,在bean创建期间替换调度程序 - 覆盖您的订阅。您在bean生命周期中订阅太早了。

虽然没有必要,但通常最好是继承AbstractMessageHandler并实施handleMessageInternal - 然后像这样配置它......

@ServiceActivator(inputChannel="channel")
@Bean
public MyAMHSubclass handler() {
    return new MyAMHSubclass();
}

并从通道bean声明中删除subscribe

@ServiceActivator将处理程序包装在消费者中,该消费者在初始化上下文时订阅该频道。