2016-07-27 226 views
0

我正在使用IBM MQ在通過客戶端上的使用者接收消息時生成消息。要創建連接,我使用JmsConnectionFactory以及提供的屬性來設置與服務器的連接。所以從我的理解是,作爲消費者,識別服務器產生的消息的唯一方法是通過onMessage調用。我目前正在通過創建一個本地製作人和本地消費者來測試這一點,並確保製作人發送的每條消息都被消費者接收。IBM MQ未能發送/接收所有JMS消息

我遇到了以下問題:

  1. 我沒有收到所產生的所有消息。
  2. 根據消息的大小,如果它們較小,則會收到更多消息。

下面是創建生產者代碼:

JmsConnectionFactory cf = ff.createConnectionFactory(); 

cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, qm.getHost()); 

int port = ###; 
cf.setIntProperty(WMQConstants.WMQ_PORT, port); 
cf.setStringProperty(WMQConstants.WMQ_CHANNEL, qm.getChannel()); 
cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT); 
cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, qm.getQueueManagerName()); 

Connection connection = cf.createConnection(qm.getUser().getUsername(), qm.getUser().getPassword()); 
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 

Destination destination = session.createQueue(qm.getDestinationName()); 
LOG.debug("Destination Created at " +qm.getDestinationName()); 

msgSender = session.createProducer(destination); 
msgSender.setDeliveryMode(DeliveryMode.PERSISTENT); 

這是製片人是如何發送消息:

/** 
* msgSender is the MessageProducer object 
**/ 
private void produceMessages(int numOfMessages) throws JMSException, InterruptedException { 
    for (int i = 0; i < numOfMessages; i++) { 
     String text = "Message #" +i; 
     TextMessage message = session.createTextMessage(text); 
     msgSender.send(message); 
    } 
} 

在消費者方面,我只是打印接收消息和視覺驗證:

@Override 
public void onMessage(Message m) { 
    System.out.println(((TextMessage)m).getText()); 
} 

我不完全熟悉IBM MQ的工作方式。丟失消息的原因是否可以在MQ上完全忽略在消息完全發送之前生成的消息?

回答

0

我會說這個問題存在於你的消費者方面,而不是你的模擬生產者。您的消息生產者應該向MQ發送消息就好了,但多個消費者可能會競爭從您設置的連接中獲取這些消息(給定相同的隊列管理器屬性)。因此,除非沒有其他人試圖從您的IBM MQ中使用,否則您將會錯過一些消息。