Приложение JMS не может читать сообщения MQ, созданные приложением PL1 - PullRequest
0 голосов
/ 03 декабря 2018

У меня странная проблема с Websphere MQ и JMS.Есть приложение PL1, которое помещает в очередь сообщения, которые читаются моим Java-приложением (запущенным в tomcat).Проблема заключается в том, что как только приложение PL1 помещает сообщение в очередь, приложение Java больше не может читать что-либо из этой очереди - как будто в очереди не было никаких сообщений.С другой стороны, MQ Browser показывает, что сообщения действительно есть.Администратор очереди также сообщает мне, что он не видит никаких ошибок в очереди к тому времени, когда я пытаюсь получить сообщения.

Я пытался читать сообщения из приложения java tomcat с помощью прослушивателя итакже с пользовательским классом, читающим сообщения через JMS QueueBrowser.Ни один из способов не работает.Например, для QueueBrowser я даже не получаю исключение при вызове метода QueueBrowser.getEnumeration.

Самое смешное, когда очередь снова очищается и локальное тестовое Java-приложение (а не приложение PL1)помещает сообщения в очередь, они могут быть прочитаны приложением java tomcat.Как только приложение PL1 снова добавляет сообщение, все сообщения больше не отображаются для приложения java tomat => даже те, которые были добавлены локальным приложением java test и работали раньше.

Одна важная вещьсказать: приложение PL1 устанавливает свойства сообщения для дескриптора сообщения через MQSETMP:

Use the MQSETMP call to set or modify a property of a message handle.
Syntax

MQSETMP (Hconn, Hmsg, SetPropOpts, Name, PropDesc, Type, ValueLength, Value, Compcode, Reason)

https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_8.0.0/com.ibm.mq.ref.dev.doc/q101910_.htm).

Я полагаю, что это как-то причины проблем.Если для параметра «PROPCTL» очереди установлено значение «NONE» (вместо «COMPAT»), Java-приложение может читать сообщения из PL1, но свойства сообщения не отображаются.Мы хотим использовать эти свойства сообщения, поэтому для нас это не вариант.Мы также попробовали другие возможные варианты PROPCTL, которые также не работали.

Могу ли я что-нибудь сделать со стороны клиента Java?Есть ли какие-либо возможные настройки для классов Websphere MQ для Java, которые я могу попробовать?

Websphere MQ-Version: 8

Классы Websphere MQ для Java-версии(com.ibm.mq.allclient): 9.0.4.0

Редактировать

Это минимальный пример java-клиента, получающего сообщения через QueueBrowser:

package jmsminimal;

import java.util.Date;
import java.util.Enumeration;

import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueBrowser;
import javax.jms.Session;
import javax.jms.TextMessage;

import com.ibm.mq.jms.JMSC;
import com.ibm.mq.jms.MQQueueConnectionFactory;

public class JMSTest {

    public static void main(String[] args) throws JMSException {

        String hostname = "hostname";
        String channel = "channelname";
        int port = 1414;
        String queueMgr = "queuemgrname";
        String queueName = "queuename";
        String username = "username";
        String password = "";

        MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
        mqQueueConnectionFactory.setHostName(hostname);
        mqQueueConnectionFactory.setChannel(channel);
        mqQueueConnectionFactory.setPort(port);
        mqQueueConnectionFactory.setQueueManager(queueMgr);
        mqQueueConnectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);

        Connection connection = mqQueueConnectionFactory.createConnection(username, password);

        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Queue queue = session.createQueue(queueName);
        QueueBrowser browser = session.createBrowser(queue);

        connection.start();

        Enumeration entriesEnum = browser.getEnumeration();

        while (entriesEnum.hasMoreElements()) {

            Message message = (Message) entriesEnum.nextElement();
            TextMessage textMessage = (TextMessage) message;

            System.out.println("*********************************************************");
            System.out.println("JMSMessageID: " + textMessage.getJMSMessageID());
            System.out.println("JMSCorrelationID: " + textMessage.getJMSCorrelationID());
            System.out.println("JMSTimestamp: " + new Date(textMessage.getJMSTimestamp()).toString());

            System.out.println("\nProperties:");
            Enumeration propertiesEnum = textMessage.getPropertyNames();
            while (propertiesEnum.hasMoreElements()) {
                String propertyKey = (String) propertiesEnum.nextElement();
                String propertyValue = textMessage.getObjectProperty(propertyKey).toString();
                System.out.println(propertyKey + "=" + propertyValue);
            }

            System.out.println("\nText: \n" + textMessage.getText());

            System.out.println("*********************************************************\n");

        }

        connection.close();
        session.close();

    }

}

Здесь pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example.jms</groupId>
    <artifactId>jmsminimal</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>javax.jms</groupId>
            <artifactId>jms</artifactId>
            <version>1.1</version>
        </dependency>
        <dependency>
            <groupId>com.ibm.mq</groupId>
            <artifactId>com.ibm.mq.allclient</artifactId>
            <version>9.0.4.0</version>
        </dependency>
    </dependencies>
</project>

Как уже говорилось ранее - этот пример работает, только когда в очереди нет сообщений, отправленныхPL1 и содержат свойства сообщения в формате MQHRF2.В противном случае перечисление пусто.

1 Ответ

0 голосов
/ 03 декабря 2018

Приложение PL1 устанавливает свойства сообщения через MQHRF2.Я полагаю, что это как-то причина проблем.

Структура MQRFH2 довольно сложна и не очень прямолинейна.Я предполагаю, что тот, кто создал программу PL / 1, неправильно создал структуру MQRFH2, следовательно, ваше приложение Java / JMS не распознает его.

Скажите программисту PL / 1, чтобы он пошел и загрузил Jsmqput Программа на C https://capitalware.com/mq_code_c.html Показывает, как правильно создать структуру MQRFH2.Следует отметить, что все папки ДОЛЖНЫ быть выровнены по 4-байтовой границе (блок с пробелами).

...