Spring Integration JMS Inbound Gateway 回复通道没有订阅者

Posted

技术标签:

【中文标题】Spring Integration JMS Inbound Gateway 回复通道没有订阅者【英文标题】:Spring Integration JMS Inbound Gateway reply channel has no subscriber 【发布时间】:2019-07-20 17:39:26 【问题描述】:

我在 Spring Integration 5.1.3 中使用 JMS 入站网关进行了测试

但我得到如下错误:

Caused by: org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers
at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:138) ~[spring-integration-core-5.1.3.RELEASE.jar:5.1.3.RELEASE]
at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:105) ~[spring-integration-core-5.1.3.RELEASE.jar:5.1.3.RELEASE]
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:73) ~[spring-integration-core-5.1.3.RELEASE.jar:5.1.3.RELEASE]

POM:

<dependencies>
    <dependency>
        <groupId>org.springframework.integration</groupId>
        <artifactId>spring-integration-jms</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-activemq</artifactId>
    </dependency>
</dependencies>

我将入站网关配置如下:

@Bean
JmsInboundGateway jmsInboundGateway(
    MessageChannel errorChannel,
    ConnectionFactory connectionFactory,
    DetailJmsProperties properties) 

    final Listener listener = properties.getListener();

    return Jms
        .inboundGateway(connectionFactory)
        .destination("request-queue")
        .requestChannel("inputChannel")
        .replyChannel("outputChannel")
        .defaultReplyQueueName("response-queue")
        .get();

还有,服务激活器:

@ServiceActivator(inputChannel = "inputChannel", outputChannel = "outputChannel")
public String process(String request) 
    String response = null;

    try 
        LOGGER.info("Received message content: []", request);
        response = request + " was processed";
    
    catch (Exception e) 
        LOGGER.error("Error", e);
    

    return response;

顺便说一句,它只有在我删除 Service Activator 中的 outputChannel = "outputChannel" 时才有效。

这个问题有什么解释吗,我有什么误解吗?

【问题讨论】:

所以我的理解是,一旦服务激活器处理了消息,它就会将消息放入输出通道,我看不到任何订阅者接收消息。请设置集成流程以接收来自 outputchannel 的消息并进行处理。 【参考方案1】:

您不能像那样使用 DSL 工厂 (Jms),它们旨在用于 DSL 流程

@Bean
IntegrationFLow flow()
    return IntegrationFlows.from(jmsInboundGateway())
            .handle("service", "process")
            .get();

DSL 处理完成所有布线。

它在没有通道的情况下工作,因为没有输出通道的组件将回复路由到 replyChannel 标头。

如果您不想使用 DSL,则必须将入站网关直接连接为 bean,而不是使用 Jms 工厂。

【讨论】:

以上是关于Spring Integration JMS Inbound Gateway 回复通道没有订阅者的主要内容,如果未能解决你的问题,请参考以下文章

Spring Integration JMS Inbound Gateway 回复通道没有订阅者

Spring Integration JMS 创建 ActiveMQ 队列而不是主题

在 java 1.7 中将 JMS 出站通道适配器转换为等效的 Spring Integration DSL

Spring Integration DSL 中的路由

Spring Integration的DefaultMessageListenerContainer和JPA中的事务

Spring-integration / ActiveMQ 在单个线程中订阅多个目的地