我正在通过 JMX 阅读消息。如果它是文本那么一切都OK,但是如果它是字节那么它给出这样的错误。我无法弄清楚我应该如何读取字节消息并在字符串中获取它的文本。
这是我的 Java 代码:
public static JMXMessage showMessage(QueueControl queueControl) {
JMXHeaders jmxHeaders;
JMXMessage jmxMessage;
String body;
String replyTo = null;
String correlationId = null;
try {
CompositeData[] messages = queueControl.browse();
j = queueLength - i;
if (j > queueLength - 1) {
i = 1;
j = queueLength - i;
}
if (j < 0) {
i = queueLength;
j = 0;
}
TabularData stringProps = (TabularData) messages[j].get(CompositeDataConstants.STRING_PROPERTIES);
for (CompositeData o : (Collection<CompositeData>) stringProps.values()) {
Object key = o.get("key");
if (key.equals("JMSReplyTo")) {
replyTo = o.get("value").toString();
}
if (key.equals("JMSCorrelationID")) {
correlationId = o.get("value").toString();
}
}
jmxHeaders = new JMXHeaders(messages[j].get(CompositeDataConstants.TYPE).toString(),
messages[j].get(CompositeDataConstants.EXPIRATION).toString(),
messages[j].get(CompositeDataConstants.DURABLE).toString(),
replyTo,
messages[j].get(CompositeDataConstants.MESSAGE_ID).toString(),
messages[j].get(CompositeDataConstants.TIMESTAMP).toString(),
correlationId,
messages[j].get(CompositeDataConstants.PRIORITY).toString());
body = (String) messages[j].get(CompositeDataConstants.TEXT_BODY);
jmxMessage = new JMXMessage(jmxHeaders, body);
return jmxMessage;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
错误代码:
Caused by: java.lang.RuntimeException: javax.management.openmbean.InvalidKeyException: Argument key="text" is not an existing item name for this CompositeData instance.
at jmxClientUIPConsole.BuildGet.showMessage(BuildGet.java:155)
at jmxClientUIPConsole.DConsoleFrameControllerGetMessage.viewMessage(DConsoleFrameControllerGetMessage.java:166)
... 62 more
Caused by: javax.management.openmbean.InvalidKeyException: Argument key="text" is not an existing item name for this CompositeData instance.
at java.management/javax.management.openmbean.CompositeDataSupport.get(CompositeDataSupport.java:270)
at jmxClientUIPConsole.BuildGet.showMessage(BuildGet.java:150)
... 63 more
就是这一行的错误:
body = (String) messages[j].get(CompositeDataConstants.TEXT_BODY);
然后我如何确定在这种方法中收到了什么消息(字节或文本)?我如何从队列中以字节为单位获取消息?
JMS
BytesMessage
和 TextMessage
的主体序列化不同,因为前者是 byte[]
而后者是 String
。您正试图从不存在的BytesMessage
中获取text正文,因此您收到
InvalidKeyException
.
但是,您可以检测消息的类型,然后相应地进行调整,例如:
QueueControl queueControl = ...
CompositeData[] messages = queueControl.browse();
for (CompositeData message : messages) {
if ((byte) message.get(CompositeDataConstants.TYPE) == (byte) 4) {
System.out.println("This is a BytesMessage");
} else {
System.out.println("This is a TextMessage");
}
}
如果你想获取消息的
byte[]
正文,你可以这样做:
byte[] body = (byte[]) message.get(CompositeDataConstants.BODY);
当然,为了实际decode他们
byte[]
成String
例如你需要知道它是如何编码的。 String
Java 中的对象可以用许多不同的方式编码,尽管最常见的可能是使用 UTF-8,在这种情况下,代码看起来像这样:
String body = Strings.getString((byte[]) message.get(CompositeDataConstants.BODY), StandardCharsets.UTF_8);