如果我有一个队列和多个订阅者,我如何对订阅者进行编码以仅删除他们感兴趣的消息?我可以使用PublishSubscribeChannel向所有订阅者发送消息,但它没有过滤功能,我不清楚消息是否在发送后被删除。另一个选择是读取所有消息,并在订阅者中进行过滤,但后来我需要发明一个Kafka-ish行为来进行消息索引,以防止已经看到的消息再次被处理。
答案 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
嗯,实际上在查看您的简单内存模型时,我甚至会说bridge
和PublishSubscribeChannel
对于每个订阅者中提到的过滤器的 @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
<强>更新强>
使用另一个选项而不是filter
和RecipientListRouter
组合就像.column2 {
}
:https://docs.spring.io/spring-integration/docs/5.0.3.RELEASE/reference/html/messaging-routing-chapter.html#router-implementations-recipientlistrouter