我已使用 IBM MQ 从队列中获取消息。我得到了对象 MQMessage 并解析它。这样,我就有了消息正文的字节流,也有 MQMD 属性。那么,我怎样才能在字节数组中获取这个属性呢?
//Getting MQMessage
MQQueue queue = ...
MQMessage msg = new MQMessage();
queue.get(msg, options, size);
//For example this prop
String replyQueue = msg.replyToQueueName;
我需要它,因为在某些情况下,某些 Prop 无法使用默认的“UTF-8”编码正确读取,但它应该可以。
因此,MQMessage.readFully(byte[] b)
只给我消息正文 byte[]
,我想获取消息头,例如 MQMD 和 RFH2。
最佳答案
所有 MQMD 属性都可以通过以下方式访问:
byte[] correlId = msg.correlationId;
byte[] msglId = msg.messageId;
String format = msg.format;
int expiry = msg.expiry;
String replyQueue = msg.replyToQueueName;
有两种方法处理 JMS(又名 MQRFH2)消息:
- 将其作为具有命名属性的消息进行检索
- 将其作为 MQRFH2 消息检索
要将 JMS 消息作为“具有命名属性的消息”获取,只需添加以下 MQGMO 选项:
gmo.options += CMQC.MQGMO_PROPERTIES_IN_HANDLE;
然后您可以使用 getter 方法检索任何命名属性。即要检索名为 StackOverflow 的字符串属性,您可以执行以下操作:
String someValue = msg.getStringProperty("StackOverflow")
要将 JMS 消息作为 MQRFH2 检索,只需添加 MQGMO(这是默认设置):
gmo.options += CMQC.MQGMO_PROPERTIES_FORCE_MQRFH2;
然后您需要将消息传递给 MQRFH2 类并从那里开始:
msg.seek(0);
MQRFH2 rfh2 = new MQRFH2(msg);
String format = rfh2.getFormat();
String[] folderStrings = rfh2.getFolderStrings();
for (String folder : folderStrings)
System.out.println("Folder: "+folder);
关于java - 获取 header 属性的字节流 IBM MQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57458190/