从MQ

时间:2018-01-31 14:00:15

标签: jms ibm-mq

我们有两个系统,A和B.这两个系统之间的通信通道是MQ。最近B版已升级到新版本,通讯失败。

该过程与先前版本类似:B将响应放入队列,A将从响应队列中读取并处理它。在较新的版本中,B将消息放入队列中,但A无法读取它。每次将响应放入队列时,响应队列的深度都会增加。

我们验证了消息的内容,它似乎与旧版本相同。当我们连接到B的旧版本时,它可以正常工作,A能够阅读该消息,但如果我们更改为较新版本未发生阅读

错误/ AMQERR01.LOG或应用程序日志中没有错误。不知道为什么新的B响应没有发生阅读信息。

我只是想知道这些 MQ值会影响这个 NOT READING问题:JMS_IBM_Character_Set,JMSMessageID,JMS_IBM_MsgType,JMSXUserID,JMS_IBM_Encoding,JMS_IBM_Report_Pass_Correl_ID,JMSXAppID,JMS_IBM_PutApplType, JMS_IBM_Format,JMS_IBM_PutDate,JMSXDeliveryCount,JMS_IBM_PutTime,JMSCorrelationID。

  

1 2018年

MQMessage mqMsg,MQGetMessageOptions mqGMO
以上参数用于从队列中读取消息 当我们现在连接到B的旧版本时,它工作正常,A能够阅读该消息,但如果我们更改为较新的版本,则不会发生读取。
MQ端没有升级。 " MQGetMessageOptions"不读书会有什么影响吗?

  

2014年2月6日   预期的MQOptions

  • processQMessage
  • mqMsg.format:MQSTR
  • mqMsg.characterSet:819
  • mqMsg.encoding:273
  • mqGMO.options:24581
  • msgAppId:txn_Risk
  • msgSenderRef:a6ac1633b6ca898e

protected byte[] readMQMessage(MQMessage argMQMsg, String argClient,
String argApp)
        throws IOException  
    {  
        String methodName = "readMQMessage";  
        Log.debug(argClient, 
                argApp,
                this,
                LogCategory.PRODUCTION,
                methodName + "getMessageLength");  

        int dataLength = argMQMsg.getMessageLength();  
        byte [] hostDataBuffer = new byte[dataLength];  

        argMQMsg.readFully(hostDataBuffer);  
        return hostDataBuffer;  
    }

这里有新版本的问题,在调试模式下,它没有进入这个循环
但是对于旧版本,在调试模式下,它按预期进入和执行任务。

我怀疑有两件事

  1. 较新版本中缺少MQOptions / MQ值
  2. MQMessage角色会影响阅读吗?
  3.   

    feb 22 2018

    • 当我调试时,eclipse指针将一直到“processQMessage'函数而不是内部函数,它应该在QM中读取消息
    /**  
     * Called by the port after a message is taken from the Q.  
     * @param mqMsg An IBM MQ message object pulled from the Queue, ready to be
     * processed.  
     * @param mqGMO The IBM MQGetMessageOptions object used during the GET  
     * operation that retrieved the message to be processed.  
     */  
    public void processQMessage( MQMessage mqMsg, MQGetMessageOptions mqGMO )  
    {  
    ---   
    ---  
    readMQMessage()
    ---  
    }
    

    我怀疑有两件事  1.较新版本中缺少MQOptions / MQ值
     2. MQMessage角色会影响阅读吗?

    我想了解MQMD和CCSID。问题是MQMD和CCSID吗?

      

    feb 26 2018

    从MQ读取消息的完整代码,不清楚在linux中查看标题

        /**
    * Called by the port after a message is taken from the Q.
    * @param mqMsg An IBM MQ message object pulled from the Queue, ready to be
    * processed.
    * @param mqGMO The IBM MQGetMessageOptions object used during the GET
    * operation that retrieved the message to be processed.
    */
    public void processQMessage( MQMessage mqMsg, MQGetMessageOptions mqGMO )
    {
    final String methodName = "processQMessage: ";
    long  safeStoreStatus       = 0;
    String msgSenderRef         = null;
    String msgAppId              = null;
    XMLTag checkXML         = new XMLTag();
    DispatchMessage m           = null;
    String msgClientID          = null; //ClientID for this message
    
    Log.debug(m_clientID,m_applicationID,this,LogCategory.PRODUCTION,methodName + "processQMessage");
    Log.debug(m_clientID, m_applicationID,this,LogCategory.PRODUCTION,methodName + "mqMsg.format:" + mqMsg.format);
    Log.debug(m_clientID, m_applicationID,this,LogCategory.PRODUCTION,methodName + "mqMsg.characterSet:" + mqMsg.characterSet);
    Log.debug(m_clientID, m_applicationID,this,LogCategory.PRODUCTION,methodName + "mqMsg.encoding:" + mqMsg.encoding);
    Log.debug(m_clientID, m_applicationID,this,LogCategory.PRODUCTION,methodName + "mqGMO.options:" + mqGMO.options);
    
    
    }
    
      

    2018年2月26日(2)

    在执行amqsbcg命令之前,我验证了深度如下

    display qstatus(TXN_RCV_FRM_SYS)
         1 : display qstatus(TXN_RCV_FRM_SYS)
    AMQ8450: Display queue status details.
       QUEUE(TXN_RCV_FRM_SYS)                 TYPE(QUEUE)
       CURDEPTH(1)                             IPPROCS(0)
       LGETDATE( )                             LGETTIME( )
       LPUTDATE( )                             LPUTTIME( )
       MEDIALOG( )                             MONQ(OFF)
       MSGAGE( )                               OPPROCS(0)
       QTIME( , )                              UNCOM(NO)
    

    但在命令dint下方显示任何标题..

    ./amqsbcg TXN_RCV_FRM_SYS NEWMQ850.QM
    
    AMQSBCG0 - starts here
    **********************
    
     MQOPEN - 'TXN_RCV_FRM_SYS'
    
    
    
     No more messages
     MQCLOSE
    
      

    2018年2月27日(1)

    当我执行时,通过./amqsput进行采样/预期响应,然后执行./amqsbcg,它显示所有值和消息数据。我不知道为什么当应用程序写入消息时,深度增加并且没有获得./amqsbcg的任何值。请帮忙

      

    2018年2月28日(1)

    <>您确定没有连接过程和" GET"你显示和运行amqsbcg之间队列中的消息?
    我将停止从QM读取消息的应用程序,这是深度显示为1的原因,否则它应该是0.来自新版本系统的不同之处,不是消息内容,导致问题的一些外部参数
    <>一种可能性是消息尚未提交 如何找到它?团队说新系统中没有任何改变
    <>但UNCOM(NO)表示队列中没有未提交的消息 我看到的其他差异是MQ7client到MQ7Server(旧sys)和MQ9Client到MQ7Server

      

    2018年2月28日(2)

       <1>Ensure that your application is not asking for a specific message ID or correlation ID when it should be processing all the messages on the queue.  
        <2>Although the current depth of the queue might show that there is an increasing number of messages on the queue, some messages on the queue might not be available to be got by an application, because they are not committed; the current depth includes the number of uncommitted MQPUTs of messages to the queue. Issue the following command:
        DISPLAY QSTATUS(Q1) TYPE(QUEUE) ALLcopy to clipboard
        In the output, look at the UNCOM field to see whether there are any uncommitted messages on the queue.  
       <3> If your application is attempting to get any messages from the queue, check whether the putting application is committing the messages correctly. Issue the following command to find out the names of applications that are putting messages to this queue:
        DISPLAY QSTATUS(Q1) TYPE(HANDLE) OPENTYPE(OUTPUT)  
        <4>Then issue the following command, inserting in appltag the APPLTAG value from the output of the previous command:
        DISPLAY CONN(*) WHERE(APPLTAG EQ appltag) UOWSTDA UOWSTTI  
        This shows when the unit of work was started and will help you discover whether the application is creating a long running unit of work. If the putting application is a channel, you might want to investigate why a batch is taking a long time to complete
    
      

    2018年3月1日(1)

    另一项关键测试结果如下

    1. 锻炼很简单,结果令人兴奋!!!! 。当我们向新系统发送请求时,我发现在NEWMQ850.QM中增加了队列TXN_RCV_FRM_SYS的深度。新的练习完成,清除队列TXN_RCV_FRM_SYS并通过MQ put命令[amqsput]并重新启动应用程序放置相同的消息。结果显示,我们的应用程序能够读取新消息,处理它并在UI中更新,并具有正确的状态作为下面的新系统响应。
    2. 当新系统​​应用程序写入TXN_RCV_FRM_SYS队列时,错过了一些事情,例如提交事务/错误放置消息标题/错误的MessageID和CorelationID / ......
    3. 本练习还表明,我们可以排除与消息内容无关的问题
    4.   

      2018年3月4日

      有人知道,如何调试此问题?
      在代码中看到的所有可能的原因是什么? 请帮忙

0 个答案:

没有答案