2015-11-24 2 views
0

Попытка отправить несколько запросов в один и тот же момент на маршрут camel activemq, один запрос обслуживается, а другой запрос не обслуживается и не отправляется обратно, как есть. Сообщения JMS устанавливаются с JMScorrelationId тоже перед отправкой, как показано ниже нижеОшибка параллелизма Activemq в маршруте верблюда Apache

textMessage.setJMSCorrelationID(UUID.randomUUID().toString()); 

мой ActiveMQ маршрут

from("activemq:queue:TEST_QUEUE?disableReplyTo=true") 
       .setExchangePattern(ExchangePattern.InOut) 
       .process(new Processor() { 
        public void process(Exchange e) throws Exception { 
         log.info("Request : " 
           + MessageHelper.extractBodyAsString(e.getIn())); 
         /*Processing Logic*/ 
        } 
       }) 
       .beanRef("testBean","postDetails") 
       .inOnly("activemq:queue:TEST_QUEUE"); 

Multiple (Test 2 запросов) запросы, посланные к вышеуказанному маршруту одновременно не обслуживал, кроме одного. Servicemix.log показывает все полученные запросы. Но обслуживается только один.

Ниже приведен код, который отправляет запрос, развернутый в jboss 6.1, как часть веб-приложения.

public Message receive(String message, String queueName) { 
     ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
       "tcp://localhost:61616"); 
     String userName = "smx"; 
     String password = "smx"; 
     Connection connection; 
     Message response =null; 
     try { 
      connection = connectionFactory.createConnection(userName, password); 
      connection.start(); 
      ((ActiveMQConnectionFactory) connectionFactory) 
        .setDispatchAsync(false); 
      Session session = connection.createSession(false, 
        Session.AUTO_ACKNOWLEDGE); 
      Queue destination = session.createQueue(queueName); 
      MessageProducer producer = session.createProducer(destination); 
      producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); 
      TextMessage textMessage = session.createTextMessage(message); 
      Queue tempQueue = session.createQueue(queueName); 
      textMessage.setJMSReplyTo(tempQueue); 
      producer.send(textMessage); 
      MessageConsumer consumer = session.createConsumer(tempQueue); 
      response = consumer.receive(); 
      response.acknowledge(); 

      session.close(); 
      connection.close(); 
     } catch (JMSException e) { 
      e.printStackTrace(); 
     } 
     return response; 
    } 

Есть ли какой-либо параметр, который отсутствует? пожалуйста, предложите.

+0

Точно как вы отправляете запросы одновременно? Вы собираете сообщения из очереди. В любой момент времени в передней части очереди есть только одно сообщение. –

+0

Приложение, развернутое в одной системе. Доступ к этому веб-приложению осуществляется с помощью IP-адреса двумя разными системами. Эти две системы отправляют запросы одновременно. –

+0

Да, но есть еще одно сообщение за один раз, чтобы попасть в очередь TEST_QUEUE, где маршрут берет сообщение. Кроме того, когда вы начинаете, пробуйте все. Сначала проверьте его на одну систему и убедитесь, что оба они работают. Затем переключитесь на второй и убедитесь, что это работает. Затем проверьте оба. Если все точно так же, то нет причин, по которым он не должен работать. –

ответ

1

Camel будет автоматически отправить обратно ответ, если сообщение JMS имеет заголовок JMSReplyTo, так что ваш маршрут должен быть просто

from("activemq:queue:TEST_QUEUE") 
       .process(new Processor() { 
        public void process(Exchange e) throws Exception { 
         log.info("Request : " 
           + MessageHelper.extractBodyAsString(e.getIn())); 
         /*Processing Logic*/ 
        } 
       }) 
       .beanRef("testBean","postDetails"); 

В конце маршрута (например, после вызова testBean), то содержание тело сообщения используется как ответное сообщение, которое отправляется обратно в очередь, указанную в заголовке JMSReplyTo.

+0

Да, спасибо за предложение, это работает. Но моя проблема с параллелизмом все еще не работает. Я убедился, что заголовок JMSReplyTo и JMSCorrelationID установлены в заголовке. Я вижу, что одновременные запросы регистрируются. Но реакция обмена и ответные потери случаются ... Все, что им не хватает ... –

+0

Ну, вы не говорите нам, что посылает и обрабатывает получение этих сообщений. Поэтому, если есть чередующиеся данные, это, скорее всего, проблема в этом коде/библиотеке или том, что вы используете. –

+0

Отредактирован вопрос - добавлен код, из которого отправляются несколько запросов ... –

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