Ibm mq 读取MQ分段消息时出现问题

Ibm mq 读取MQ分段消息时出现问题,ibm-mq,Ibm Mq,我编写了一个客户端来读取通过MQ发送的分段消息,但收到错误消息。下面的代码工作得非常好,但它每次只能读取一条消息,应用程序必须连接分段消息,这不是我想要的 public void getMessage(){ try { MQEnvironment.hostname = ""; MQEnvironment.channel = ""; MQEnvironment.port = ; MQQ

我编写了一个客户端来读取通过MQ发送的分段消息,但收到错误消息。下面的代码工作得非常好,但它每次只能读取一条消息,应用程序必须连接分段消息,这不是我想要的

public void getMessage(){

        try {

           MQEnvironment.hostname = ""; 
           MQEnvironment.channel = ""; 
           MQEnvironment.port = ;

           MQQueueManager QMgr = new MQQueueManager("MQManager");

           MQGetMessageOptions gmo = new MQGetMessageOptions();

           gmo.options =  MQConstants.MQOO_INPUT_AS_Q_DEF|
                         MQConstants.MQGMO_WAIT|
                         MQConstants.MQGMO_ALL_SEGMENTS_AVAILABLE|
                         MQConstants.MQGMO_LOGICAL_ORDER;

           gmo.matchOptions = MQConstants.MQMO_NONE;
           gmo.waitInterval = MQConstants.MQWI_UNLIMITED;

           MQMessage message = new MQMessage();
           MQQueue queue = QMgr.accessQueue("QName",
                                           gmo.options);

           while(true){

            queue.get(message, gmo);
            int dataLength = message.getDataLength();           
            System.out.println(message.readStringOfCharLength(dataLength));
            message.clearMessage();
           }
        } catch (Exception e) {

            e.printStackTrace();
        }
    }
当我将MQGMO_SYNCPOINT添加到选项时,它失败,出现com.ibm.mq.MQException:MQJE001:完成代码“2”,原因是“2046”

不知道为什么会失败,如果我至少可以让它工作,我将能够在安全地处理应用程序中的所有分段消息后提交

public void getMessage(){

        try {

           MQEnvironment.hostname = ""; 
           MQEnvironment.channel = ""; 
           MQEnvironment.port = ;

           MQQueueManager QMgr = new MQQueueManager("MQManager");

           MQGetMessageOptions gmo = new MQGetMessageOptions();

           gmo.options =  MQConstants.MQOO_INPUT_AS_Q_DEF|
                         MQConstants.MQGMO_WAIT|
                         MQConstants.MQGMO_ALL_SEGMENTS_AVAILABLE|
                         MQConstants.MQGMO_LOGICAL_ORDER|
                         MQConstants.MQGMO_SYNCPOINT;

           gmo.matchOptions = MQConstants.MQMO_NONE;
           gmo.waitInterval = MQConstants.MQWI_UNLIMITED;

           MQMessage message = new MQMessage();
           MQQueue queue = QMgr.accessQueue("QName",
                                           gmo.options);

           while(true){

               queue.get(message, gmo);
                int dataLength = message.getDataLength();           
                System.out.println(message.readStringOfCharLength(dataLength));
                QMgr.commit();
                message.clearMessage();
           }
        } catch (Exception e) {

            e.printStackTrace();
        }
    }
当我试图把分段的信息作为一条信息来阅读时;它失败了 com.ibm.mq.MQException:MQJE001:完成代码“2”,原因“2046”

如果有人能帮助解决这个问题,我将不胜感激;我不确定下面的代码到底出了什么问题。这是我阅读分段信息的首选方式

public void getMessage(){


        try {

           MQEnvironment.hostname = ""; 
           MQEnvironment.channel = ""; 
           MQEnvironment.port = ;

           MQQueueManager QMgr = new MQQueueManager("MQManager");

           MQGetMessageOptions gmo = new MQGetMessageOptions();

           gmo.options =  MQConstants.MQOO_INPUT_AS_Q_DEF|
                         MQConstants.MQGMO_WAIT|
                         MQConstants.MQGMO_COMPLETE_MSG;

           gmo.matchOptions = MQConstants.MQMO_NONE;
           gmo.waitInterval = MQConstants.MQWI_UNLIMITED;

           MQMessage message = new MQMessage();
           MQQueue queue = QMgr.accessQueue("QName",
                                           gmo.options);

           while(true){

               queue.get(message, gmo);
                int dataLength = message.getDataLength();           
                System.out.println(message.readStringOfCharLength(dataLength));
               message.clearMessage();
           }
        } catch (Exception e) {

            e.printStackTrace();
        }
    }

问题是您正在使用
gmo.options
作为
accessQueue
方法的打开选项,以及
get
的获取消息选项。您将打开选项和获取消息选项混合在此字段中

每个选项都由选项字段中的一个位表示。当您将该字段用作打开选项时,即使您指定了get message options,MQ也会将这些位解释为打开选项,反之,当您将该字段用作get message options时,MQ会将它们解释为get message options

MQGMO_WAIT                     0x00000001 //MQOO_INPUT_AS_Q_DEF
MQGMO_WAIT                     0x00000001

让我们看看您在示例中指定的每个选项的值,这些选项表示为十六进制,以及基于该值的等效打开或获取选项:

MQOO_INPUT_AS_Q_DEF            0x00000001
MQGMO_WAIT                     0x00000001

MQOO_INPUT_SHARED              0x00000002
MQGMO_SYNCPOINT                0x00000002

MQOO_RESOLVE_NAMES             0x00010000
MQGMO_COMPLETE_MSG             0x00010000

MQOO_BIND_NOT_FIXED            0x00008000
MQGMO_LOGICAL_ORDER            0x00008000

MQOO_RESOLVE_LOCAL_Q           0x00040000
MQOO_RESOLVE_LOCAL_TOPIC       0x00040000
MQGMO_ALL_SEGMENTS_AVAILABLE   0x00040000
因为您错误地将其用作
QMgr.accessQueue(“QName”,
gmo.options
)的开放式选项MQ正在以意外的方式对此进行解释


对于您的第一个“工作”示例,打开选项的解释如下所示,这些特定的打开选项一起不会对本地队列造成任何问题,这就是为什么它“工作”,即使它不正确:

MQOO_INPUT_AS_Q_DEF            0x00000001
MQOO_INPUT_AS_Q_DEF            0x00000001 //MQGMO_WAIT
MQOO_RESOLVE_LOCAL_Q           0x00040000 //MQGMO_ALL_SEGMENTS_AVAILABLE
MQOO_RESOLVE_LOCAL_TOPIC       0x00040000 //MQGMO_ALL_SEGMENTS_AVAILABLE
MQOO_BIND_NOT_FIXED            0x00008000 //MQGMO_LOGICAL_ORDER

在您的第二个示例中,由于
2046(MQRC\u OPTIONS\u ERROR)
而失败,这是因为选项的解释如下所述。在打开的选项中,不能将
MQOO_INPUT_作为_Q_DEF
MQOO_INPUT_共享
,这会导致
2046

MQOO_INPUT_AS_Q_DEF            0x00000001
MQOO_INPUT_AS_Q_DEF            0x00000001 //MQGMO_WAIT
MQOO_RESOLVE_LOCAL_Q           0x00040000 //MQGMO_ALL_SEGMENTS_AVAILABLE
MQOO_RESOLVE_LOCAL_TOPIC       0x00040000 //MQGMO_ALL_SEGMENTS_AVAILABLE
MQOO_BIND_NOT_FIXED            0x00008000 //MQGMO_LOGICAL_ORDER
MQOO_INPUT_SHARED              0x00000002 //MQGMO_SYNCPOINT

在第三个示例中,由于
2046(MQRC\u OPTIONS\u ERROR)
而失败,这是因为这些选项被解释为如下所述<代码> MQoOOReDeVIEWNEXION/COD>只在MQC++中被证明是有效的,这导致<代码> 2046代码/代码>:

MQOO_INPUT_AS_Q_DEF            0x00000001
MQOO_INPUT_AS_Q_DEF            0x00000001 //MQGMO_WAIT
MQOO_RESOLVE_NAMES             0x00010000 //MQGMO_COMPLETE_MSG

使用
MQOO_INPUT_AS_Q_DEF
作为get message选项不会导致任何问题,因为它与每个示例中已有的
MQGMO_WAIT
具有相同的值,这样做不会改变get message选项的行为

MQGMO_WAIT                     0x00000001 //MQOO_INPUT_AS_Q_DEF
MQGMO_WAIT                     0x00000001

基于您的第二个和第三个示例的以下内容应该有效:

public void getMessage(){


        try {

           MQEnvironment.hostname = ""; 
           MQEnvironment.channel = ""; 
           MQEnvironment.port = ;

           MQQueueManager QMgr = new MQQueueManager("MQManager");

           // Set up the options on the queue we wish to open
           int openOptions = MQConstants.MQOO_INPUT_AS_Q_DEF;

           MQGetMessageOptions gmo = new MQGetMessageOptions();

           gmo.options =  MQConstants.MQGMO_WAIT|
                          MQConstants.MQGMO_ALL_SEGMENTS_AVAILABLE|
                          MQConstants.MQGMO_LOGICAL_ORDER|
                          MQConstants.MQGMO_SYNCPOINT|
                          MQConstants.MQGMO_COMPLETE_MSG;

           gmo.matchOptions = MQConstants.MQMO_NONE;
           gmo.waitInterval = MQConstants.MQWI_UNLIMITED;

           MQMessage message = new MQMessage();
           MQQueue queue = QMgr.accessQueue("QName", openOptions);

           while(true){

               queue.get(message, gmo);
               int dataLength = message.getDataLength();           
               System.out.println(message.readStringOfCharLength(dataLength));
               QMgr.commit();
               message.clearMessage();
           }
        } catch (Exception e) {

            e.printStackTrace();
        }
    }

如果运行完整MQ客户端安装附带的
mqrc
实用程序,您可以找到错误代码的翻译:

$mqrc 2046

      2046  0x000007fe  MQRC_OPTIONS_ERROR

谢谢,成功了。我需要在上面的代码中将int openOptions=MQOO_INPUT_声明为_Q_DEF。