我有这样的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
答案 0 :(得分:1)
“不起作用”并不多 - 显示您的执行器和处理程序bean配置。
启用DEBUG日志记录 - 它可以帮助您弄清楚发生了什么。
你不应该订阅bean声明中的频道;处理程序将由框架自动订阅(如果配置正确)。
修改强>
你并没有真正使用它设计的框架;当使用执行程序时,在bean创建期间替换调度程序 - 覆盖您的订阅。您在bean生命周期中订阅太早了。
虽然没有必要,但通常最好是继承AbstractMessageHandler
并实施handleMessageInternal
- 然后像这样配置它......
@ServiceActivator(inputChannel="channel")
@Bean
public MyAMHSubclass handler() {
return new MyAMHSubclass();
}
并从通道bean声明中删除subscribe
。
@ServiceActivator
将处理程序包装在消费者中,该消费者在初始化上下文时订阅该频道。