मुझे वेबस्पेयर एमक्यू और जेएमएस के साथ एक अजीब समस्या है। एक पीएल 1 एप्लिकेशन है जो संदेशों को कतार में रखता है जो मेरे जावा एप्लिकेशन (टोमकैट में चल रहा है) द्वारा पढ़े जाते हैं। समस्या यह है कि जैसे ही PL1 एप्लिकेशन कतार में एक संदेश डालता है, जावा एप्लिकेशन अब उस कतार से कुछ भी नहीं पढ़ सकता है - जैसे कि कतार में कोई संदेश नहीं था। दूसरी ओर एमक्यू ब्राउज़र दिखाता है कि संदेश वास्तव में हैं। कतार व्यवस्थापक मुझे यह भी बताता है कि जब तक मैं संदेशों को लाने का प्रयास करता हूं, तब तक वह कतार में कोई त्रुटि नहीं देख सकता है।

मैंने जावा टॉमकैट एप्लिकेशन से श्रोता के साथ संदेशों को पढ़ने की कोशिश की है और जेएमएस क्यूईब्रोसर के माध्यम से संदेशों को पढ़ने वाले कस्टम क्लास के साथ भी। कोई रास्ता काम नहीं करता। QueueBrowser के लिए उदाहरण के लिए QueueBrowser.getEnumeration Method को कॉल करते समय मुझे अपवाद भी नहीं मिलता है।

मजेदार बात यह है कि जब कतार फिर से खाली हो जाती है और एक स्थानीय जावा परीक्षण एप्लिकेशन (और PL1 एप्लिकेशन नहीं) संदेशों को कतार में रखता है जिसे जावा टॉमकैट एप्लिकेशन द्वारा पढ़ा जा सकता है। जैसे ही PL1 एप्लिकेशन एक संदेश फिर से जोड़ता है, सभी संदेश अब जावा टोमैट एप्लिकेशन के लिए दृश्यमान नहीं हैं => यहां तक ​​कि वे भी जिन्हें स्थानीय जावा परीक्षण एप्लिकेशन द्वारा जोड़ा गया है और पहले काम किया गया है।

कहने के लिए एक महत्वपूर्ण बात: 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" "कोई नहीं" ("COMPAT" के बजाय) पर सेट है, तो जावा एप्लिकेशन PL1 से संदेशों को पढ़ सकता है लेकिन संदेश गुण दिखाई नहीं दे रहे हैं। हम उन संदेश गुणों का उपयोग करना चाहते हैं, इसलिए यह हमारे लिए एक विकल्प नहीं है। हमने PROPCTL के लिए अन्य संभावित विकल्पों को भी आजमाया जो काम नहीं आया।

क्या जावा क्लाइंट साइड से मैं कुछ भी कर सकता हूं? क्या जावा के लिए वेबस्पेयर एमक्यू कक्षाओं के लिए कोई संभावित सेटिंग्स हैं जिन्हें मैं आजमा सकता हूं?

वेबस्फीयर एमक्यू-संस्करण: 8

Java संस्करण के लिए Websphere MQ कक्षाएं (com.ibm.mq.allclient): 9.0.4.0

संपादित करें

यह 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 प्रारूप में संदेश गुण होते हैं। अन्यथा गणना खाली है।

0
JanTheGun 3 पद 2018, 13:23

1 उत्तर

सबसे बढ़िया उत्तर

PL1 एप्लिकेशन MQHRF2 के माध्यम से संदेश गुण सेट कर रहा है। मुझे लगता है कि यह किसी तरह मुद्दों का कारण है।

MQRFH2 संरचना बल्कि जटिल है और बहुत सीधे आगे नहीं है। मैं अनुमान लगा रहा हूँ कि जिसने भी PL/1 प्रोग्राम बनाया है, उसने MQRFH2 संरचना को सही ढंग से नहीं बनाया है, इसलिए, आपका Java/JMS एप्लिकेशन इसे नहीं पहचान पाएगा।

अपने PL/1 प्रोग्रामर को जाने और Jsmqput C प्रोग्राम को https://capitalware.com/mq_code_c.html यह दिखाता है कि MQRFH2 संरचना को सही तरीके से कैसे बनाया जाए। ध्यान देने योग्य बड़ी बात यह है कि सभी फ़ोल्डरों को 4-बाइट सीमा (रिक्त स्थान के साथ पैड) में संरेखित करना होगा।

0
Roger 4 पद 2018, 01:06