Spring 使用 Bean 名称与方法名称的集成通道
Spring Integration Channeling With Bean Name vs Method Name
我有这样的 PublishSubscribeChannel:
@Bean(name = {"publishCha.input", "publishCha2.input"}) //2 subscribers
public MessageChannel publishAction() {
PublishSubscribeChannel ps = MessageChannels.publishSubscribe().get();
ps.setMaxSubscribers(8);
return ps;
}
我也有订阅频道:
@Bean
public IntegrationFlow publishCha() {
return f -> f
.handle(m -> System.out.println("In publishCha channel..."));
}
@Bean
public IntegrationFlow publishCha2() {
return f -> f
.handle(m -> System.out.println("In publishCha2 channel..."));
}
最后是另一个订阅者:
@Bean
public IntegrationFlow anotherChannel() {
return IntegrationFlows.from("publishAction")
.handle(m -> System.out.println("ANOTHER CHANNEL IS HERE!"))
.get();
}
问题是,当我从另一个流调用方法名称为 "publishAction" 的通道时,它只打印 "ANOTHER CHANNEL HERE" 并忽略其他订阅者。但是,如果我打电话给
.channel("publishCha.input")
,这次进入publishCha和publishCha2订阅者,但忽略了第三个订阅者。
@Bean
public IntegrationFlow flow() {
return f -> f
.channel("publishAction");
}
我的问题是,为什么这两种不同的通灵方法会产生不同的结果?
.channel("publishAction") // channeling with method name executes third subscriber
.channel("publishCha.input") // channelling with bean name, executes first and second subscribers
编辑:narayan-sambireddy 请求我如何向频道发送消息。我通过网关发送:
@MessagingGateway
public interface ExampleGateway {
@Gateway(requestChannel = "flow.input")
void flow(Order orders);
}
主要内容:
Order order = new Order();
order.addItem("PC", "TTEL", 2000, 1)
ConfigurableApplicationContext ctx = SpringApplication.run(Start.class, args);
ctx.getBean(ExampleGateway.class).flow(order);
第三个订阅者的问题是您错过了 @Bean
中 name
的目的:
/**
* The name of this bean, or if several names, a primary bean name plus aliases.
* <p>If left unspecified, the name of the bean is the name of the annotated method.
* If specified, the method name is ignored.
* <p>The bean name and aliases may also be configured via the {@link #value}
* attribute if no other attributes are declared.
* @see #value
*/
@AliasFor("value")
String[] name() default {};
因此,在这种情况下,方法名称作为 bean 名称将被忽略,因此 Spring 集成 Java DSL 找不到具有 publishAction
的 bean 并创建一个 - DirectChannel
.
您可以使用 方法参考 不过:
IntegrationFlows.from(publishAction())
或者,如果它在不同的配置中 class,您可以重新使用其中一个预定义名称
IntegrationFlows.from(publishCha.input)
这样 DSL 将重新使用现有的 bean,并且只会向该 pub-sub 频道添加一个订阅者。
我有这样的 PublishSubscribeChannel:
@Bean(name = {"publishCha.input", "publishCha2.input"}) //2 subscribers
public MessageChannel publishAction() {
PublishSubscribeChannel ps = MessageChannels.publishSubscribe().get();
ps.setMaxSubscribers(8);
return ps;
}
我也有订阅频道:
@Bean
public IntegrationFlow publishCha() {
return f -> f
.handle(m -> System.out.println("In publishCha channel..."));
}
@Bean
public IntegrationFlow publishCha2() {
return f -> f
.handle(m -> System.out.println("In publishCha2 channel..."));
}
最后是另一个订阅者:
@Bean
public IntegrationFlow anotherChannel() {
return IntegrationFlows.from("publishAction")
.handle(m -> System.out.println("ANOTHER CHANNEL IS HERE!"))
.get();
}
问题是,当我从另一个流调用方法名称为 "publishAction" 的通道时,它只打印 "ANOTHER CHANNEL HERE" 并忽略其他订阅者。但是,如果我打电话给
.channel("publishCha.input")
,这次进入publishCha和publishCha2订阅者,但忽略了第三个订阅者。
@Bean
public IntegrationFlow flow() {
return f -> f
.channel("publishAction");
}
我的问题是,为什么这两种不同的通灵方法会产生不同的结果?
.channel("publishAction") // channeling with method name executes third subscriber
.channel("publishCha.input") // channelling with bean name, executes first and second subscribers
编辑:narayan-sambireddy 请求我如何向频道发送消息。我通过网关发送:
@MessagingGateway
public interface ExampleGateway {
@Gateway(requestChannel = "flow.input")
void flow(Order orders);
}
主要内容:
Order order = new Order();
order.addItem("PC", "TTEL", 2000, 1)
ConfigurableApplicationContext ctx = SpringApplication.run(Start.class, args);
ctx.getBean(ExampleGateway.class).flow(order);
第三个订阅者的问题是您错过了 @Bean
中 name
的目的:
/**
* The name of this bean, or if several names, a primary bean name plus aliases.
* <p>If left unspecified, the name of the bean is the name of the annotated method.
* If specified, the method name is ignored.
* <p>The bean name and aliases may also be configured via the {@link #value}
* attribute if no other attributes are declared.
* @see #value
*/
@AliasFor("value")
String[] name() default {};
因此,在这种情况下,方法名称作为 bean 名称将被忽略,因此 Spring 集成 Java DSL 找不到具有 publishAction
的 bean 并创建一个 - DirectChannel
.
您可以使用 方法参考 不过:
IntegrationFlows.from(publishAction())
或者,如果它在不同的配置中 class,您可以重新使用其中一个预定义名称
IntegrationFlows.from(publishCha.input)
这样 DSL 将重新使用现有的 bean,并且只会向该 pub-sub 频道添加一个订阅者。