2016-07-27 3 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, вас ждут некоторые сообщения.

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