Как отправить сообщение jms с одного сервера, на котором размещено приложение, на другой сервер, на котором размещено другое приложение, оба размещены на серверах Websphere. - PullRequest
0 голосов
/ 25 марта 2019

Я понимаю, что если обе очереди сообщений (получатель и ответ) присутствуют на одном сервере, я могу использовать фабрику соединений JNDI и имя очереди JMS / myqueue_qcf1 jms / myqueue1, для подключения к очереди и отправки сообщения в jms / myqueue_qcf2, jms / myqueue2

Но в случае подключения к Interserver, это будет то же самое При включенном брандмауэре оба сервера открываются. MQ myqueue2 настроен как удаленный mq в Websphere.

Любая помощь со ссылкой на код будет полезна.

public void myAppListener extends MessageListener{ //getting message from MQ1 - 
                                 //sent by some other application - MQ1 is Local 
                                 //in appServer1  

private static final String JMS_LC_JNDI_NAME = "jms/liftcargo_lara_qcf";
private static final String JMS_LC_QUEUE_NAME = "jms/APP.OUT.REQUEST";

public void onMessage(Message msg){
     try{
       TextMessage requestMessage = (TextMessage) msg;
       String reqMessage = requestMessage.getText();
       String correlationId  = requestMessage.getJMSCorrelationID();

       sendXMLToNextAppMQ(reqMessage , correlationId)
     }
   }

   public static void sendXMLToNextAppMQ(String message, String correlID) throws JMSException { //The MQ to which the message is forwarded to is a Remote MQ, in different server appServer2

        try {
            InitialContext context = new InitialContext();


            QueueConnectionFactory queueConnectionFactory =
                    (QueueConnectionFactory)context.lookup(JMS_LC_JNDI_NAME);
            System.out.println("Connection Factory data :: "+queueConnectionFactory.toString());

            Queue queue = (Queue) context.lookup(JMS_LC_QUEUE_NAME);
            System.out.println("Check Queue Name :: "+queue.toString());

            QueueConnection queueConnection = queueConnectionFactory.createQueueConnection();

            QueueSession session = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

            QueueSender queueSender = session.createSender(queue);

            TextMessage message1 = session.createTextMessage();
            message1.setText(message);
            message1.setJMSType("Tunnel message from CCAM.LARA.OUT.REQUEST MQ to 
                                           LIFTCARGO.OUT.LARA.REQUEST MQ");
            message1.setJMSDestination(queue);
            message1.setJMSCorrelationID(correlID);
            queueSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
            queueSender.send(message1);



        } catch (NamingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }catch (JMSException e) {
            // TODO: handle exception
            e.printStackTrace();
        }
}
}

In Method sendXMLToNextAppMQ (i.e., tunnel the msg recieved in MQ1 in appServer1 to MQ2 in appServer2) is there any other jndi properties needed to mention to connect appServer1 to MQ2 in appServer2 (firewall is opened b/w appServer1 & appServer2)

1 Ответ

0 голосов
/ 25 марта 2019

Если ваша целевая очередь запросов находится на другом сервере, ваше приложение будет по-прежнему иметь тот же код, но имя, которое вы укажете, не будет именем QLOCAL в администраторе очередей, к которому вы подключены, а вместо этого будет QREMOTE. Если вы используете JNDI для обращения к своим очередям, вам даже не нужно менять имя очереди, нужно изменить только реальное имя очереди MQ, на которое есть ссылка.

Например, если вы используете инструмент командной строки JMSAdmin, вы измените имя только в атрибуте QUEUE: -

DEFINE Q(myqueue2) QUEUE(Q.FOR.REQUESTS)

Тогда в ваших двух администраторах очередей будут определения, которые выглядят примерно так: -

Местное управление качеством (QM1)

DEFINE QREMOTE(Q.FOR.REQUESTS) RNAME(WORK.QUEUE) RQMNAME(QM2) XMITQ(QM2)
DEFINE QLOCAL(QM2) USAGE(XMITQ) DESCR('Transmission queue for messages to QM2')
DEFINE QLOCAL(MY.REPLY.Q) DESCR('My application queue for responses')
DEFINE CHANNEL(TO.QM2) CHLTYPE(SDR) CONNAME('(qm2.machine.com(1414)') XMITQ(QM2)
DEFINE CHANNEL(TO.QM1) CHLTYPE(RCVR)

Удаленное управление качеством (QM2)

DEFINE QLOCAL(WORK.QUEUE)
DEFINE QLOCAL(QM1) USAGE(XMITQ) DESCR('Transmission queue for messages to QM1')
DEFINE CHANNEL(TO.QM2) CHLTYPE(RCVR)
DEFINE CHANNEL(TO.QM1) CHLTYPE(SDR) CONNAME('qm1.machine.com(1414)') XMITQ(QM1)

Кроме того, в приложении запроса / ответа рекомендуется указывать имя очереди, куда должен быть отправлен ответ, как часть сообщения запроса, и кодировать приложение-ответчик для чтения этих полей (поля ReplyTo). ) и использовать их для отправки ответного сообщения, таким образом, не требуя дополнительного определения QREMOTE на Remote QM (QM2 в моем примере).

...