2015-11-24 53 views
0

試圖在同一時刻向駱駝activemq路由發送多個請求,一個請求被服務,另一個請求未被服務並按原樣發回。該JMS消息過於發送類似下面下面Apache駝峯路由中的Activemq併發失敗

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"); 

多(試驗2個請求)發送到上述航線的同時不提供服務,除了一個請求之前設定JMScorrelationId。 servicemix.log顯示所有接收到的請求。但只有一個服務。

下面是在jboss 6.1中作爲Web應用程序的一部分發送請求的代碼。

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

在一個系統中部署了一個應用程序。該Web應用程序可以通過2個不同的系統使用IP地址訪問。這兩個系統一次發送請求。 –

+0

是的,但一次只有一條消息正在隊列TEST_QUEUE中排隊,其中路由選取消息。另外,當你開始時保持簡單。首先用一個系統進行測試,並確保兩者都能正常工作。然後切換到第二個,並確保工作。然後用兩者進行測試。如果一切都完全一樣,那麼沒有理由不應該工作。 –

回答

1

駱駝會自動發回的迴應,如果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

編輯了問題 - 添加了多個請求正在發送的代碼... –