JMSCode для отправки и получения сообщений по одному с использованием базы данных - PullRequest
0 голосов
/ 06 февраля 2019

После того, как я зашел на несколько сайтов и изучил JMS, я написал автономный клиент JMS для чтения сообщений из базы данных и отправки их одно за другим.Я также хочу получить сообщение одно за другим, а затем обновить базу данных.Мне нужно отправить сообщение в очередь и другое приложение, используя стандартный JMS, который будет использовать TextMessage и тело которого будет читаться как строка ISO-8859-1.Также они также отправят ответ как TextMessage.Я написал цикл for для чтения сообщения одно за другим из БД.

Я новичок в JMS, поэтому не могли бы вы исправить меня, работает ли мой код ниже для чтения и отправки сообщений в очередь иполучить и обновить БД.Есть ли что-то, что мне нужно изменить в JMS-типе или что-то, что мне нужно исправить.Работает ли петля for нормально?

/*MQ Configuration*/
MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
mqQueueConnectionFactory.setHostName(url);
mqQueueConnectionFactory.setChannel(channel);//communications link
mqQueueConnectionFactory.setPort(port);
mqQueueConnectionFactory.setQueueManager(qmgr);//service provider 
mqQueueConnectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);

/*Create Connection */
QueueConnection queueConnection = mqQueueConnectionFactory.createQueueConnection();
queueConnection.start();

/*Create session */
QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

/*Create response queue */
//   Queue queue = queueSession.createQueue("QUEUE.RESPONSE");

int messageCount = 0;

Queue queue = queueSession.createQueue(replytoQueueName);
QueueSender queueSender = null;
QueueReceiver queueReceiver=null;

for (Testbean testBean : testbeanList) {
    String testMessage = testBean.getMessage();                 
    /*Create text message */
    textMessage = queueSession.createTextMessage(testMessage);

    logger.info("Text messages sent: " + messageCount);

    textMessage.setJMSReplyTo(queue);
    textMessage.setJMSType("mcd://xmlns");//message type
    textMessage.setJMSExpiration(2*1000);//message expiration
    textMessage.setJMSDeliveryMode(DeliveryMode.PERSISTENT); //message delivery mode either persistent or non-persistemnt

    /*Create sender queue */
    //  QueueSender queueSender = queueSession.createSender(queueSession.createQueue("QUEUE.REQEST"));

    queueSender = queueSession.createSender(queueSession.createQueue(outputQName));
    queueSender.setTimeToLive(2*1000);
    queueSender.send(textMessage);

    /*After sending a message we get message id */
    System.out.println("after sending a message we get message id "+ textMessage.getJMSMessageID());
    String jmsCorrelationID = " JMSCorrelationID = '" + textMessage.getJMSMessageID() + "'";


    /*Within the session we have to create queue reciver */
    queueReceiver = queueSession.createReceiver(queue,jmsCorrelationID);

    /*Receive the message from*/
    Message message = queueReceiver.receive(60*1000);
    //   String responseMsg = ((TextMessage) message).getText();

    byte[] by = ((TextMessage) message).getText().getBytes("ISO-8859-1");

    logger.info(new String(by));
    String responseMsg = new String(by,"UTF-8");

    testDAO rmdao = new testDAO();
    rmdao.updateTest(responseMsg, jmsCorrelationID);        

    messageCount += 1;
}

queueSender.close();
queueReceiver.close();
queueSession.close();
queueConnection.close();

1 Ответ

0 голосов
/ 06 февраля 2019

Пара вещей:

  • Я бы создал объект QueueSender и Queue, который отправляет сообщения в вне цикла for, так как они этого не делаютпохоже, меняется.
  • Без соответствующего кода потребителя в конечном итоге невозможно определить, сработает ли селектор или нет, но не , вызывающий setCorrelationID() в отправляемом сообщении, выглядит немного странномне.Использование идентификатора сообщения, назначенного провайдером, может быть общим шаблоном для приложений запроса / ответа IBM MQ, но общий шаблон для использования идентификатора корреляции заключается в вызове setJMSCorrelationID() в отправленном сообщении.Это делает код более понятным, а также позволяет приложению напрямую контролировать уникальность идентификатора корреляции.Это потенциально важно для переносимости приложений (например, если вы мигрировали из IBM MQ в другого провайдера JMS), поскольку разные провайдеры JMS используют стили / форматы идентификатора сообщения, характерные для их конкретной реализации.Кроме того, в отношении идентификатора сообщения спецификация JMS гласит: «Точная область уникальности определяется поставщиком», что, на мой взгляд, не является достаточно сильной гарантией уникальности, особенно когда использование чего-то вроде java.util.UUID.randomUUID().toString() очень просто.
  • Вы должны убедиться, что вы используете транзакцию XA для работы JMS и базы данных, чтобы они были атомарными.
  • Закройте ресурсы JMS в блоке finally.
...