我正在使用JMX通过QueueControl类及其Browse方法连接到Artemis队列,该方法返回一个CompositeData数组,但我无法使用GET方法获得各个标头,因为没有任何标头.请告诉我如何通过Artemis上的JMX获取某些字段,而不是整个头部

我还try 了listMessage方法,但它提供了一个不完整的标头列表,并且不显示消息正文

推荐答案

CompositeData中获取消息详细信息的关键是CompositeDataConstants类.

如果我发送这样一条消息:

      ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
      Connection connection = connectionFactory.createConnection();
      Session session = connection.createSession();
      MessageProducer messageProducer = session.createProducer(session.createQueue("myQueue"));
      TextMessage message = session.createTextMessage();
      message.setJMSReplyTo(session.createQueue("myReplyTo"));
      message.setText("myText");
      message.setStringProperty("myKey1", "myValue1");
      message.setStringProperty("myKey2", "myValue2");
      messageProducer.send(message);
      connection.close();

您可以浏览队列并反序列化消息数据,例如:

      QueueControl queueControl = ...
      CompositeData[] messages = queueControl.browse();
      for (CompositeData message : messages) {
         System.out.println("JMSMessageID: " + message.get(CompositeDataConstants.USER_ID));
         System.out.println("Destination: " + message.get(CompositeDataConstants.ADDRESS));
         System.out.println("Text: " + message.get(CompositeDataConstants.TEXT_BODY));
         System.out.println("DeliveryMode: " + ((Boolean) message.get(CompositeDataConstants.DURABLE) ? "persistent" : "non-persistent"));
         TabularData stringProps = (TabularData) message.get(CompositeDataConstants.STRING_PROPERTIES);
         for (CompositeData o : (Collection<CompositeData>) stringProps.values()) {
            System.out.println(o.get("key") + ": " + o.get("value"));
         }
      }

它会打印出这样的内容:

JMSMessageID: ID:41171b0e-dfae-11ed-9217-3ce1a1d12939
Destination: myQueue
Text: myText
DeliveryMode: persistent
JMSReplyTo: queue://myReplyTo
myKey1: myValue1
myKey2: myValue2
__AMQ_CID: 41123909-dfae-11ed-9217-3ce1a1d12939

如果您不想直接使用常量,您可以找到它们各自的值here.

请记住,由于management-message-attribute-size-limit,返回的数据可能会被截断.The documentation解释此设置:

management-message-attribute-size-limit是从邮件中收集的用于浏览的字节数.这与队列控件上公开的browselist管理方法相关.长于该值的消息属性显示为截断.默认为256.使用-1关闭此限制.请注意,需要为在给定时刻可见的所有消息分配内存.由于浏览许多邮件可能需要大量内存,因此将此值设置得太高可能会影响浏览器的 solidity .

Java相关问答推荐

Java同步小服务器

如何从片段请求数据到活动?在主要活动中单击按钮请求数据?

编译期间错误(Java 0000)Android .Net MAUI

伪类focus-in不适用于PFA中的选项卡

Java字符串常数池困惑

方法没有用正确的值填充数组—而是将数组保留为null,'

同时运行JUnit测试和Selenium/Cucumber测试时出现问题

取消按钮,但没有任何操作方法引发和异常

对某一Hyroby控制器禁用@cacheable

为什么我的在一个范围内寻找素数的程序不能像S所期望的那样工作

对字符串长度进行排序,但颠倒了顺序(最长字符串在前)

在Eclipse中调试未导出的JDK模块的Java包

扩展视图高度,并将其拖动到较低的视图上,而不是将其向下推?

为什么在下面的Java泛型方法中没有类型限制?

何时调用密封层次 struct 的switch 中的默认情况

在线程Java中调用Interrupt()之后调用Join()

Java 17与Java 8双重表示法

没有Google Play服务,Firebase Auth无法工作

如何使用外部函数从Java中获取C++ struct 的返回值&;内存API

多线程、并发和睡眠未按预期工作