Spring Integration:如何从队列中读取选定的消息

时间:2018-03-23 06:52:17

标签: java spring spring-integration

如果我有一个队列和多个订阅者,我如何对订阅者进行编码以仅删除他们感兴趣的消息?我可以使用PublishSubscribeChannel向所有订阅者发送消息,但它没有过滤功能,我不清楚消息是否在发送后被删除。另一个选择是读取所有消息,并在订阅者中进行过滤,但后来我需要发明一个Kafka-ish行为来进行消息索引,以防止已经看到的消息再次被处理。

1 个答案:

答案 0 :(得分:1)

嗯,确实在开发即用的Spring Integration中没有这样的Jms.publishSubscribeChannel()抽象。但是,既然您说需要内存解决方案,那么如何考虑启动嵌入式ActiveMQ并根据Topic目标使用selector?是的,即使对于MessageChannel这种类型的Spring Integration订阅者,仍然没有.filter(),但您仍然可以使用ITopic来丢弃您不感兴趣的邮件。

您可以通过Hazelcast @Bean public ITopic<Message<?>> siTopic() { return hazelcastInstance().getTopic("siTopic"); } @Bean public IntegrationFlow subscriber1() { return IntegrationFlows.from( Flux.create(messageFluxSink -> siTopic() .addMessageListener(message -> messageFluxSink.next(message.getMessageObject())))) .filter("headers.myHeader == foo") .get(); } @Bean public IntegrationFlow subscriber2() { return IntegrationFlows.from( Flux.create(messageFluxSink -> siTopic() .addMessageListener(message -> messageFluxSink.next(message.getMessageObject())))) .filter("headers.myHeader == bar") .get(); } 获得相同的内容:

QueueChannel

嗯,实际上在查看您的简单内存模型时,我甚至会说bridgePublishSubscribeChannel对于每个订阅者中提到的过滤器的 @Bean public PollableChannel queueChannel() { return new QueueChannel(); } @Bean @BridgeFrom("queueChannel") public MessageChannel publishSubscribeChannel() { return new PublishSubscribeChannel(); } @Bean public IntegrationFlow subscriber1() { return IntegrationFlows.from(publishSubscribeChannel()) .filter("headers.myHeader == foo") .get(); } @Bean public IntegrationFlow subscriber2() { return IntegrationFlows.from(publishSubscribeChannel()) .filter("headers.myHeader == bar") .get(); } 应该足够为你:

PublishSubscribeChannel

<强>更新

使用另一个选项而不是filterRecipientListRouter组合就像.column2 { }https://docs.spring.io/spring-integration/docs/5.0.3.RELEASE/reference/html/messaging-routing-chapter.html#router-implementations-recipientlistrouter