Интеграция Spring с JMS не работает должным образом

Привет, я пытался создать приложение загрузки Spring с интеграцией Spring

Приложение 1: Издатель

Jms Message -> Broker ->queue1

Приложение 2: подписчик и издатель

Broker->queue1->Transform->HTTP CALL->HTTP Response->JMS Message->Broker->queue2

Publisher Flow

@Configuration
public class EchoFlowOutBound {

    @Autowired
    private ConnectionFactory connectionFactory;

    @Bean
    public IntegrationFlow toOutboundQueueFlow() {
        return IntegrationFlows.from("requestChannel")
                .handle(Jms.outboundGateway(connectionFactory)
                    .requestDestination("amq.outbound1")).get();
           }
}

//Gateway

@MessagingGateway
public interface EchoGateway {
    @Gateway(requestChannel = "requestChannel")
    String echo(String message);
}

Подписчики и издатели

@Configuration
public class MainOrchestrationFlow {

    @Autowired
    private ConnectionFactory connectionFactory;

    @Autowired
    private QueueChannel jmsOutChannel;


     @Bean
        public IntegrationFlow orchestrationFlow() {
            return IntegrationFlows.from(
                    Jms.messageDrivenChannelAdapter(connectionFactory)
                            .destination("amq.outbound1")
                            .outputChannel(jmsOutChannel))
                    .<String, String>transform(s -> {
                        return s.toLowerCase();
                    })
                    // HTTP part goes here
                    .<String, HttpEntity>transform(HttpEntity::new)
                   .handle(            
Http.outboundChannelAdapter("http://localhost:8080/uppercase")
                                    .httpMethod(HttpMethod.POST)
                                    .extractPayload(true)
                                    .expectedResponseType(String.class)
                    )
                    // and here HTTP part ends
                    .handle(
                            Jms.outboundAdapter(connectionFactory)
.destination("amq.outbound2")
                    )
                    .get();
        }

}

Когда я запускаю приложение, я получаю сообщение об ошибке

Caused by: org.springframework.integration.MessageTimeoutException: failed to receive JMS response within timeout of: 5000ms at org.springframework.integration.jms.JmsOutboundGateway.handleRequestMessage(JmsOutboundGateway.java:762) ~[spring-integration-jms-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:109) ~[spring-integration-core-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:158) ~[spring-integration-core-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116) ~[spring-integration-core-5.0.6.RELEASE.jar:5.0.6.RELEASE]

Может кто-нибудь сказать мне, что я делаю не так,

@Gimby Спасибо, что указали на это, не беспокойтесь об URL-адресе, я просто поставил его как фиктивный, ошибка, которую я получаю, не является http

edwin 27.07.2018 13:52

Если HTTP-вызов выполнен и этот HTTP-вызов не завершен, но время ожидания превышает время ожидания обработчика сообщений JMS, то возникает эта проблема.

Gimby 27.07.2018 13:57

@Gimby Я тоже пробовал без http, это та же ошибка, которую я получаю

edwin 27.07.2018 14:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
455
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша проблема в том, что ваш потребитель не request-reply. Вы получаете сообщение от amq.outbound1 и отправляете его на amq.outbound2. Вот и все: больше ничего не происходит. У вас там поток one-way.

При этом ваш производитель - request-reply - handle(Jms.outboundGateway(connectionFactory). Этот исходящий шлюз действительно ожидает ответа в заголовке ReplyTo в соответствии с параметрами по умолчанию для сценариев запроса-ответа JMS.

Итак, вы должны определить для себя: или вам нужно отправить ответ производителю, или вам просто нужно отправить и забыть от этого производителя. См. Jms.outboundAdapter() если что.

В случае запроса-ответа вам не нужен Jms.outboundAdapter() на стороне потребителя: вы должны использовать Jms.inboundGateway() вместо Jms.messageDrivenChannelAdapter().

спасибо за помощь. Это решило проблему. Я прочитал эту информацию перед тем, как сформировать ваш собственный ответ, и пропустил ее.

edwin 27.07.2018 16:09

Другие вопросы по теме