Spring集成JMS入站网关回复通道没有订户

问题描述 投票:2回答:1

我在Spring Integration 5.1.3 enter image description here中使用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”时才有效。

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

spring jms spring-integration gateway
1个回答
1
投票

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

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

DSL处理完成所有布线。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.