【发布时间】:2022-01-27 07:58:38
【问题描述】:
我使用 Spring Integration Java DSL 对 IntegrationFlow 进行了这个非常基本的设置:
@IntegrationComponentScan
@EnableIntegration
@Configuration
public class DummyConfig {
@MessagingGateway
public interface DummyGateway {
@Gateway(requestChannel = "dummyInChannel")
void echo(String payload);
}
@Bean(name = "dummyInChannel")
public MessageChannel dummyInChannel() {
return MessageChannels.direct().get();
}
@Bean
public IntegrationFlow dummyFlow() {
return IntegrationFlows.from(dummyInChannel())
.handle(String.class, (payload, headers) -> {
System.out.println(payload);
return "";
})
.get();
}
}
当我尝试向我的网关发布消息时
dummyGateway.echo("test");
我得到了异常:
Caused by: org.springframework.messaging.MessageDeliveryException:
Dispatcher has no subscribers for channel 'application.dummyInChannel'.; nested exception
is org.springframework.integration.MessageDispatchingException: Dispatcher
has no subscribers, failedMessage=GenericMessage [payload=test,
headers={replyChannel=nullChannel, id=6e4302e4-95f0-bf5a-c1a3-e8cd587c23fb, timestamp=1643269549272}]
我想,在我的流程中执行.handle() 就是订阅频道。那么,为什么我会得到这个异常?在这种情况下如何正确订阅我的频道?
【问题讨论】:
-
如果你改为
IntegrationFlows.from("dummyInChannel"),它会如何工作? -
@ArtemBilan 我遇到了与
IntegrationFlows.from("dummyInChannel")完全相同的异常。 -
哦!请告诉我们,你什么时候打电话给
dummyGateway.echo("test");。您不会在应用程序生命周期中过早地这样做吗?您真的要等到应用程序上下文完全准备好了吗? -
我在另一个
@Component的构造函数中执行此调用,它依赖于我的DummyConfig.DummyGateway,所以我假设应用程序上下文已经初始化。顺便说一句,如果我将频道类型更改为MessageChannels.queue().get()它可以工作。 -
这在上下文生命周期中还为时过早。
标签: java spring spring-integration spring-integration-dsl