ASG
IBM
Zystems
Cressida
Icon
Netflexity
 
  MQSeries.net
Search  Search       Tech Exchange      Education      Certifications      Library      Info Center      SupportPacs      LinkedIn  Search  Search                                                                   FAQ  FAQ   Usergroups  Usergroups
 
Register  ::  Log in Log in to check your private messages
 
RSS Feed - WebSphere MQ Support RSS Feed - Message Broker Support

MQSeries.net Forum Index » IBM MQ Java / JMS » Browse messages + RFH2 data in case there is such..

Post new topic  Reply to topic
 Browse messages + RFH2 data in case there is such.. « View previous topic :: View next topic » 
Author Message
vasilev
PostPosted: Tue Mar 19, 2024 11:49 pm    Post subject: Browse messages + RFH2 data in case there is such.. Reply with quote

Acolyte

Joined: 31 Oct 2014
Posts: 71
Location: Germany

Hello,
I am reading messages and message data with PCF agent.
I also need to read the RFH2 header and data in case the message is in this format.
Can I use the same approach here and add some if clause or this is not possible and needs to be over JMS?

In such a case - how different messages can be read without deleting?


Code:

PCFMessageAgent agt = new PCFMessageAgent(qmgr);
....
MQQueue    browseQueue = null;
        int j = 0;
      int openOptionsReply = CMQC.MQOO_INQUIRE + CMQC.MQOO_BROWSE + CMQC.MQOO_FAIL_IF_QUIESCING + CMQC.MQOO_INPUT_SHARED;
        browseQueue = qmgr.accessQueue(Q, openOptionsReply, null, null, null);
      MQGetMessageOptions gmo = new MQGetMessageOptions();
        gmo.options = CMQC.MQGMO_BROWSE_NEXT + CMQC.MQGMO_NO_WAIT + CMQC.MQGMO_FAIL_IF_QUIESCING;
        try {
              MQMessage myMessage = null;
             while (true) {
                myMessage = new MQMessage();
                myMessage.correlationId = com.ibm.mq.constants.CMQC.MQCI_NONE;
                 myMessage.messageId     = com.ibm.mq.constants.CMQC.MQMI_NONE;
byte[] buffer = null;
                 myMessage.clearMessage();
                 browseQueue.get(myMessage, gmo);
                 buffer = new byte[myMessage.getDataLength()];
                 myMessage.readFully(buffer);
......



I have read:

https://stackoverflow.com/questions/49616262/issue-while-setting-mqrfh2-header-in-ibm-mq

https://stackoverflow.com/questions/55713782/how-to-retrieve-rfh-message-headers-from-a-message-coming-from-mq

and not sure if I can read all messages without a problem.


thank you
_________________
Regards
V.Vasilev
Back to top
View user's profile Send private message Visit poster's website
bruce2359
PostPosted: Wed Mar 20, 2024 6:56 am    Post subject: Reply with quote

Poobah

Joined: 05 Jan 2008
Posts: 9442
Location: US: west coast, almost. Otherwise, enroute.

Odd that you would not cite official IBM documentation. Did you search RFH2 format on google?
_________________
I like deadlines. I like to wave as they pass by.
ב''ה
Lex Orandi, Lex Credendi, Lex Vivendi. As we Worship, So we Believe, So we Live.
Back to top
View user's profile Send private message
vasilev
PostPosted: Wed Mar 20, 2024 9:01 am    Post subject: Reply with quote

Acolyte

Joined: 31 Oct 2014
Posts: 71
Location: Germany

The question is if i have to make CMQC.MQGMO_PROPERTIES_FORCE_MQRFH2 always or there is better way.

Ok i will test
_________________
Regards
V.Vasilev
Back to top
View user's profile Send private message Visit poster's website
RogerLacroix
PostPosted: Wed Mar 20, 2024 3:13 pm    Post subject: Re: Browse messages + RFH2 data in case there is such.. Reply with quote

Jedi Knight

Joined: 15 May 2001
Posts: 3258
Location: London, ON Canada

vasilev wrote:
I am reading messages and message data with PCF agent.
I also need to read the RFH2 header and data in case the message is in this format.
Can I use the same approach here and add some if clause or this is not possible and needs to be over JMS?

I have never seen the Command Server return an MQRFH2 format message. I'm 99% sure that it will never happen but someone from IBM can chime in.

As for handling MQRFH2 formatted messages, here is a fully functioning Java/MQ sample:
Code:

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.Hashtable;

import com.ibm.mq.MQException;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQGetMessageOptions;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;
import com.ibm.mq.constants.CMQC;
import com.ibm.mq.headers.MQDataException;
import com.ibm.mq.headers.MQRFH2;

/**
 * Program Name
 *  MQTest72
 *
 * Description
 *  This java class will connect to a remote queue manager with the
 *  MQ setting stored in a HashTable and get an MQRFH2 message from a queue.
 *
 * Sample Command Line Parameters
 *  -m MQA1 -h 127.0.0.1 -p 1414 -c TEST.CHL -q TEST.Q1 -u UserID -x Password
 *
 * @author Roger Lacroix
 */
public class MQTest72
{
   private static final SimpleDateFormat  LOGGER_TIMESTAMP = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");

   private Hashtable<String,String> params;
   private Hashtable<String,Object> mqht;
   private String qMgrName;
   private String inputQName;

   /**
    * The constructor
    */
   public MQTest72()
   {
      super();
      params = new Hashtable<String,String>();
      mqht = new Hashtable<String,Object>();
   }

   /**
    * Make sure the required parameters are present.
    * @return true/false
    */
   private boolean allParamsPresent()
   {
      boolean b = params.containsKey("-h") && params.containsKey("-p") &&
                  params.containsKey("-c") && params.containsKey("-m") &&
                  params.containsKey("-q") &&
                  params.containsKey("-u") && params.containsKey("-x");
      if (b)
      {
         try
         {
            Integer.parseInt((String) params.get("-p"));
         }
         catch (NumberFormatException e)
         {
            b = false;
         }
      }

      return b;
   }

   /**
    * Extract the command-line parameters and initialize the MQ HashTable.
    * @param args
    * @throws IllegalArgumentException
    */
   private void init(String[] args) throws IllegalArgumentException
   {
      int port = 1414;
      if (args.length > 0 && (args.length % 2) == 0)
      {
         for (int i = 0; i < args.length; i += 2)
         {
            params.put(args[i], args[i + 1]);
         }
      }
      else
      {
         throw new IllegalArgumentException();
      }

      if (allParamsPresent())
      {
         qMgrName = (String) params.get("-m");
         inputQName = (String) params.get("-q");

         try
         {
            port = Integer.parseInt((String) params.get("-p"));
         }
         catch (NumberFormatException e)
         {
            port = 1414;
         }

         mqht.put(CMQC.CHANNEL_PROPERTY, params.get("-c"));
         mqht.put(CMQC.HOST_NAME_PROPERTY, params.get("-h"));
         mqht.put(CMQC.PORT_PROPERTY, new Integer(port));
         mqht.put(CMQC.USER_ID_PROPERTY, params.get("-u"));
         mqht.put(CMQC.PASSWORD_PROPERTY, params.get("-x"));

         // I don't want to see MQ exceptions at the console.
         MQException.log = null;
      }
      else
      {
         throw new IllegalArgumentException();
      }
   }

   /**
    * Connect, open queue, get a message, close queue and disconnect.
    *
    */
   private void testReceive()
   {
      MQQueueManager qMgr = null;
      MQQueue queue = null;
      int openOptions = CMQC.MQOO_INPUT_AS_Q_DEF + CMQC.MQOO_INQUIRE + CMQC.MQOO_FAIL_IF_QUIESCING;
      MQGetMessageOptions gmo = new MQGetMessageOptions();
      gmo.options = CMQC.MQGMO_PROPERTIES_FORCE_MQRFH2 + CMQC.MQGMO_FAIL_IF_QUIESCING + CMQC.MQGMO_NO_WAIT;
//      gmo.options = CMQC.MQGMO_PROPERTIES_IN_HANDLE + CMQC.MQGMO_FAIL_IF_QUIESCING + CMQC.MQGMO_NO_WAIT;
     
      try
      {
         qMgr = new MQQueueManager(qMgrName, mqht);
         MQTest72.logger("successfully connected to "+ qMgrName);

         queue = qMgr.accessQueue(inputQName, openOptions);
         MQTest72.logger("successfully opened "+ inputQName);

         // Define a simple MQ message
         MQMessage receiveMsg = new MQMessage();
         receiveMsg.messageId = CMQC.MQMI_NONE;
         receiveMsg.correlationId = CMQC.MQCI_NONE;

         // get the message on the queue

         queue.get(receiveMsg, gmo);
         
         if (CMQC.MQFMT_RF_HEADER_2.equals(receiveMsg.format))
         {
            receiveMsg.seek(0);
            MQRFH2 rfh2 = new MQRFH2(receiveMsg);
         
            int strucLen = rfh2.getStrucLength();
            int encoding = rfh2.getEncoding();
            int CCSID    = rfh2.getCodedCharSetId();
            String format= rfh2.getFormat();
            int flags    = rfh2.getFlags();
            int nameValueCCSID = rfh2.getNameValueCCSID();
         
            String[] folderStrings = rfh2.getFolderStrings();
            for (String folder : folderStrings)
               MQTest72.logger("Folder: "+folder);
           
            if (CMQC.MQFMT_STRING.equals(format))
            {
               String msgStr = receiveMsg.readStringOfByteLength(receiveMsg.getDataLength());
               MQTest72.logger("Data: "+msgStr);
            }
            else if (CMQC.MQFMT_NONE.equals(format))
            {
               byte[] b = new byte[receiveMsg.getDataLength()];
               receiveMsg.readFully(b);
               MQTest72.logger("Data: "+new String(b));
            }
         }
         else if ( (CMQC.MQFMT_STRING.equals(receiveMsg.format)) ||
                   (CMQC.MQFMT_NONE.equals(receiveMsg.format))    )
         {
            Enumeration<String> props = receiveMsg.getPropertyNames("%");
            if (props != null)
            {
               MQTest72.logger("Named Properties:");
               while (props.hasMoreElements())
               {
                  String propName = props.nextElement();
                  Object o = receiveMsg.getObjectProperty(propName);
                  MQTest72.logger("   Name="+propName+" : Value="+o);
               }
            }

            if (CMQC.MQFMT_STRING.equals(receiveMsg.format))
            {
               String msgStr = receiveMsg.readStringOfByteLength(receiveMsg.getMessageLength());
               MQTest72.logger("Data: "+msgStr);
            }
            else
            {
               byte[] b = new byte[receiveMsg.getMessageLength()];
               receiveMsg.readFully(b);
               MQTest72.logger("Data: "+new String(b));
            }
         }
         else
         {
            byte[] b = new byte[receiveMsg.getMessageLength()];
            receiveMsg.readFully(b);
            MQTest72.logger("Data: "+new String(b));
         }
      }
      catch (MQException e)
      {
         MQTest72.logger("CC=" +e.completionCode + " : RC=" + e.reasonCode);
      }
      catch (IOException e)
      {
         MQTest72.logger("IOException:" +e.getLocalizedMessage());
      }
      catch (MQDataException e)
      {
         MQTest72.logger("CC=" +e.completionCode + " : RC=" + e.reasonCode);
      }
      finally
      {
         try
         {
            if (queue != null)
            {
               queue.close();
               MQTest72.logger("closed: "+ inputQName);
            }
         }
         catch (MQException e)
         {
            MQTest72.logger("CC=" +e.completionCode + " : RC=" + e.reasonCode);
         }
         try
         {
            if (qMgr != null)
            {
               qMgr.disconnect();
               MQTest72.logger("disconnected from "+ qMgrName);
            }
         }
         catch (MQException e)
         {
            MQTest72.logger("CC=" +e.completionCode + " : RC=" + e.reasonCode);
         }
      }
   }

   /**
    * A simple logger method
    * @param data
    */
   public static void logger(String data)
   {
      String className = Thread.currentThread().getStackTrace()[2].getClassName();

      // Remove the package info.
      if ( (className != null) && (className.lastIndexOf('.') != -1) )
         className = className.substring(className.lastIndexOf('.')+1);

      System.out.println(LOGGER_TIMESTAMP.format(new Date())+" "+className+": "+Thread.currentThread().getStackTrace()[2].getMethodName()+": "+data);
   }

   /**
    * main line
    * @param args
    */
   public static void main(String[] args)
   {
      MQTest72 write = new MQTest72();

      try
      {
         write.init(args);
         write.testReceive();
      }
      catch (IllegalArgumentException e)
      {
         MQTest72.logger("Usage: java MQTest72 -m QueueManagerName -h host -p port -c channel -q QueueName -u UserID -x Password");
         System.exit(1);
      }

      System.exit(0);
   }
}


later
Roger
_________________
Capitalware: Transforming tomorrow into today.
Connected to MQ!
Twitter
Back to top
View user's profile Send private message Visit poster's website
vasilev
PostPosted: Thu Mar 21, 2024 1:02 am    Post subject: Reply with quote

Acolyte

Joined: 31 Oct 2014
Posts: 71
Location: Germany

Thank you, @Roger!
_________________
Regards
V.Vasilev
Back to top
View user's profile Send private message Visit poster's website
Display posts from previous:   
Post new topic  Reply to topic Page 1 of 1

MQSeries.net Forum Index » IBM MQ Java / JMS » Browse messages + RFH2 data in case there is such..
Jump to:  



You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
Protected by Anti-Spam ACP
 
 


Theme by Dustin Baccetti
Powered by phpBB © 2001, 2002 phpBB Group

Copyright © MQSeries.net. All rights reserved.