无法在 ActiveMQ Artemis 中通过 JMX 读取字节消息

问题描述 投票:0回答:1

我正在通过 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);

然后我如何确定在这种方法中收到了什么消息(字节或文本)?我如何从队列中以字节为单位获取消息?

java jmx activemq-artemis
1个回答
0
投票

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);
© www.soinside.com 2019 - 2024. All rights reserved.