Ответный канал Spring Integration JMS Inbound Gateway не имеет подписчика - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть тест с входящим шлюзом JMS в Spring Integration 5.1.3 enter image description here

Но я получил следующее сообщение:

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;
}

Кстати, он работает, только если я удаляюoutputChannel = "outputChannel" в Service Activator.

Есть ли объяснение этой проблемы, есть ли у меня недопонимание?

1 Ответ

0 голосов
/ 27 февраля 2019

Вы не можете использовать фабрики DSL (Jms) подобным образом, они предназначены для использования в потоке DSL

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

Обработка DSL выполняет всю проводку.

Он работает без канала, потому что компонент без выходного канала направляет ответ на заголовок replyChannel.

Если вы не хотите использовать DSL, вы должны подключить входящий шлюз напрямую как компонентвместо использования фабрики Jms.

...