2014-11-19 2 views
1

У меня есть исходящий шлюз JMS, который отправляет сообщения через очередь запросов и получает сообщения через очередь ответов. Я хотел бы знать, что является самым простым способом применения дросселирования к принимающей части сообщений из очереди ответов. Я попытался установить Poller в исходящий шлюз, но, когда я его установил, ответные сообщения вообще не потребляются. Можно ли использовать Poller в исходящих шлюзах для дросселирования потребления сообщений? Если да, то как? Если нет, как я могу лучше всего использовать потребление ответа на сообщение?JMS Исходящий ответ отклика на ввод ответа

Мой стек:

o.s.i:spring-integration-java-dsl:1.0.0.RC1 
o.s.i:spring-integration-jms:4.0.4.RELEASE 

Мои IntegrationgConfig.class:

@Configuration 
@EnableIntegration 
public class IntegrationConfig { 

    ... 

    @Bean 
    public IntegrationFlow testFlow() { 

     return IntegrationFlows 
      .from("test.request.ch") 
      .handle(Jms.outboundGateway(connectionFactory) 
        .receiveTimeout(45000) 
        .requestDestination("REQUEST_QUEUE") 
        .replyDestination("RESPONSE_QUEUE") 
        .correlationKey("JMSCorrelationID"), e -> { 
        e.requiresReply(true); 
        e.poller(Pollers.fixedRate(1000).maxMessagesPerPoll(2)); // when this poller is set, response messages are not consumed at all... 
       }) 
      .handle("testService", 
        "testMethod") 
      .channel("test.response.ch").get(); 
    } 

    ... 
} 

Приветствия, PM

ответ

1

Поскольку вы собираетесь получать сообщения от response queue в .poller() не помочь тебе.

Нам нужен poller, если наш конечный пункт input-channel (в вашем случае test.request.ch) является PollableChannel. См. Документы по этому вопросу.

Там .replyContainer() вариант на Jms.outboundGateway для вас. С этим вы можете настроить параметры concurrentConsumers для достижения лучшей пропускной способности на response queue.

В противном случае JmsOutboundGateway создает MessageConsumer для каждого сообщения с запросом.

+0

Рассмотрев поток SI в целом, и в значительной степени в соответствии с тем, что вы говорите ... оказывается, на самом деле нам вообще не нужно дросселировать на JMS Outbound Gateway. Вместо этого мы теперь дросселируем начальный JMS Inbound Adapter в начале всего потока с помощью установки Poller, а также ThreadPoolExecutor (не показано в фрагменте кода выше!). Я полагаю, это синонимом того, что вы имели в виду, чтобы установить Poller на входном канале. Спасибо за удобный совет! –

+0

Исправить. Потому что 'inbound-channel-adapter' тоже' pollable'. См. 'AbstractPollingEndpoint' и его реализации. Они требуют «poller». –

Смежные вопросы