java - 获取 header 属性的字节流 IBM MQ

标签 java ibm-mq

我已使用 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/

相关文章:

java - 从字节数组创建私钥

java - WebSphere MQ 消息监听器线程

python - Pymqi 在库导入时抛出异常 ImportError

java - Spring MVC 中 Errors 对象的模型键是什么?

java - java中执行程序服务的范围?

具有不同用户权限的Java文件夹/文件创建

java - 自引用 MD5 文件

java - ClassCastException : javax. 命名。将 IBM MQ 配置为 Flume JMS 源时,引用无法转换为 javax.jms.ConnectionFactory

Spring JMS和Websphere MQ

java - 导入的 jar 文件创建空包