如何将接收JMS Message的代码适配为ActiveMQ Artemis代码?
问题描述
我有一段读取队列并接收JMS Message类对象的代码,但JMS的Message类缺少getPersistentSize这类getter方法。我已经找到自定义获取这些属性的方案,但现在想知道:能不能把代码改写成使用ActiveMQ Artemis的Message类,而非标准JMS的Message类?
我的代码如下:
connectQueueBrowser(); Enumeration<Message> messageEnumeration = queueBrowser.getEnumeration(); ArrayList<Message> messages = new ArrayList<>(); while (messageEnumeration.hasMoreElements()){ messages.add(messageEnumeration.nextElement()); } System.out.println(messages.get(0).getBody(String.class));
解决方案
完全可以改用ActiveMQ Artemis的Message类来实现,而且这样能直接获取getPersistentSize这类JMS标准Message没有的属性,具体实现如下:
- 类型转换:队列浏览器返回的JMS Message对象,底层是ActiveMQ Artemis的
CoreMessage实现类,可直接强转为org.apache.activemq.artemis.api.core.Message接口类型。 - 调用专属方法:转换完成后,就能直接调用
getPersistentSize()、getTimestamp()等Artemis专属的getter方法。
修改后的代码示例:
connectQueueBrowser(); Enumeration<Message> messageEnumeration = queueBrowser.getEnumeration(); ArrayList<org.apache.activemq.artemis.api.core.Message> artemisMessages = new ArrayList<>(); while (messageEnumeration.hasMoreElements()) { Message jmsMessage = messageEnumeration.nextElement(); // 将JMS Message转换为Artemis核心Message org.apache.activemq.artemis.api.core.Message artemisMessage = ((org.apache.activemq.artemis.jms.client.ActiveMQMessage) jmsMessage).getCoreMessage(); artemisMessages.add(artemisMessage); } // 调用Artemis专属方法并输出 if (!artemisMessages.isEmpty()) { System.out.println("消息内容:" + artemisMessages.get(0).getBodyBuffer().readString()); System.out.println("持久化大小:" + artemisMessages.get(0).getPersistentSize()); System.out.println("消息时间戳:" + artemisMessages.get(0).getTimestamp()); }
注意事项
- 确保项目依赖中包含ActiveMQ Artemis客户端Jar包,避免类转换异常。
- 该实现依赖Artemis的JMS底层细节,若后续切换其他JMS Provider,代码需对应调整。
- Artemis的
CoreMessage通过BodyBuffer处理消息体,读取字符串需用getBodyBuffer().readString(),和JMS的getBody()用法有区别。
内容的提问来源于stack exchange,提问作者user21871375
相关产品推荐
相关产品推荐

