Spring 为多个生产者和消费者集成一个渠道
Spring Integration one channel for multiple producers and consumers
我有这个直接频道:
@Bean
public DirectChannel emailingChannel() {
return MessageChannels
.direct( "emailingChannel")
.get();
}
我可以像这样为同一个通道定义多个流吗:
@Bean
public IntegrationFlow flow1FromEmailingChannel() {
return IntegrationFlows.from( "emailingChannel" )
.handle( "myService" , "handler1")
.get();
}
@Bean
public IntegrationFlow flow2FromEmailingChannel() {
return IntegrationFlows.from( "emailingChannel" )
.handle( "myService" , "handler2" )
.get();
}
编辑
@Service
public class MyService {
public void handler1(Message<String> message){
....
}
public void handler2(Message<List<String>> message){
....
}
}
每个流的 handle(...)
方法操作不同的 payload
数据类型,但目标是相同的,即从通道读取数据并调用相关处理程序。我想避免许多 if...else
在一个处理程序中检查数据类型。
附加问题:当多个线程调用同一个通道时会发生什么(无论其类型:Direct
、PubSub
或 Queue
) 同时(默认情况下 @Bean
具有单例作用域)?
非常感谢
使用直接频道,消息将循环分发给消费者。
对于队列通道,只有一个消费者会收到每条消息;分配将基于他们各自的投票者。
使用 pub/sub 渠道,两个消费者都会收到每条消息。
您需要提供更多信息,但听起来您需要向流中添加有效负载类型路由器以将消息定向到正确的消费者。
编辑
当处理程序方法在同一个 class 中时,您不需要两个流程;框架将检查这些方法,并且只要没有歧义)就会调用与负载类型匹配的方法。
.handle(myServiceBean())
我有这个直接频道:
@Bean
public DirectChannel emailingChannel() {
return MessageChannels
.direct( "emailingChannel")
.get();
}
我可以像这样为同一个通道定义多个流吗:
@Bean
public IntegrationFlow flow1FromEmailingChannel() {
return IntegrationFlows.from( "emailingChannel" )
.handle( "myService" , "handler1")
.get();
}
@Bean
public IntegrationFlow flow2FromEmailingChannel() {
return IntegrationFlows.from( "emailingChannel" )
.handle( "myService" , "handler2" )
.get();
}
编辑
@Service
public class MyService {
public void handler1(Message<String> message){
....
}
public void handler2(Message<List<String>> message){
....
}
}
每个流的 handle(...)
方法操作不同的 payload
数据类型,但目标是相同的,即从通道读取数据并调用相关处理程序。我想避免许多 if...else
在一个处理程序中检查数据类型。
附加问题:当多个线程调用同一个通道时会发生什么(无论其类型:Direct
、PubSub
或 Queue
) 同时(默认情况下 @Bean
具有单例作用域)?
非常感谢
使用直接频道,消息将循环分发给消费者。
对于队列通道,只有一个消费者会收到每条消息;分配将基于他们各自的投票者。
使用 pub/sub 渠道,两个消费者都会收到每条消息。
您需要提供更多信息,但听起来您需要向流中添加有效负载类型路由器以将消息定向到正确的消费者。
编辑
当处理程序方法在同一个 class 中时,您不需要两个流程;框架将检查这些方法,并且只要没有歧义)就会调用与负载类型匹配的方法。
.handle(myServiceBean())