如何将 Core 消息转换为 JMS 消息?
How to convert the Core message to a JMS message?
我需要将 org.apache.activemq.artemis.core.message.impl.CoreMessage
转换为 javax.jms.Message
。我怎样才能做到这一点?也许代码某处需要util方法,或者需要手动完成?
我要拦截以下事件:
- 发送后
- 交付后
- 消息过期
然后将消息发送到需要 javax.jms.Message
实例的直接端点 Camel 路由。
org.apache.activemq.artemis.jms.client.ActiveMQMessage
这看起来像是 javax.jms.Message 的实现,其底层 org.apache.activemq.artemis.api.core.client.ClientMessage 扩展了 CoreMessage
我的建议是简单地复制邮件并将副本发送到您选择的地址,例如:
public class MyPlugin implements ActiveMQServerMessagePlugin {
ActiveMQServer server;
@Override
public void registered(ActiveMQServer server) {
this.server = server;
}
@Override
public void afterSend(ServerSession session,
Transaction tx,
Message message,
boolean direct,
boolean noAutoCreateQueue,
RoutingStatus result) throws ActiveMQException {
Message copy = message.copy();
copy.setAddress("foo");
try {
server.getPostOffice().route(copy, false);
} catch (Exception e) {
e.printStackTrace();
}
}
}
然后 Camel 消费者可以获取消息并对其进行任何需要的操作。这种方法有几个优点:
- 简单。从技术上讲,可以将
org.apache.activemq.artemis.api.core.Message
实例转换为 javax.jms.Message
实例,但这并不是直截了当的。 javax.jms.Message
是一个 JMS 客户端 class。它没有在任何地方的服务器上使用,因此没有现成的工具来进行任何类型的转换 to/from 它。
- 速度很快。如果您使用
javax.jms.Message
,您还必须使用 JMS 客户端来发送它,这意味着创建和管理 JMS 资源,如 javax.jms.Connection
和 javax.jms.Session
。这并不是您真正想要在代理插件中执行的操作,因为它会增加相当多的延迟。这里展示的方法是使用broker自己的内部API来处理消息。不需要客户端资源。
- 它是异步的。通过发送消息并让 Camel 稍后接收它,您根本不必等待 Camel,这减少了插件增加的延迟。
我需要将 org.apache.activemq.artemis.core.message.impl.CoreMessage
转换为 javax.jms.Message
。我怎样才能做到这一点?也许代码某处需要util方法,或者需要手动完成?
我要拦截以下事件:
- 发送后
- 交付后
- 消息过期
然后将消息发送到需要 javax.jms.Message
实例的直接端点 Camel 路由。
org.apache.activemq.artemis.jms.client.ActiveMQMessage
这看起来像是 javax.jms.Message 的实现,其底层 org.apache.activemq.artemis.api.core.client.ClientMessage 扩展了 CoreMessage
我的建议是简单地复制邮件并将副本发送到您选择的地址,例如:
public class MyPlugin implements ActiveMQServerMessagePlugin {
ActiveMQServer server;
@Override
public void registered(ActiveMQServer server) {
this.server = server;
}
@Override
public void afterSend(ServerSession session,
Transaction tx,
Message message,
boolean direct,
boolean noAutoCreateQueue,
RoutingStatus result) throws ActiveMQException {
Message copy = message.copy();
copy.setAddress("foo");
try {
server.getPostOffice().route(copy, false);
} catch (Exception e) {
e.printStackTrace();
}
}
}
然后 Camel 消费者可以获取消息并对其进行任何需要的操作。这种方法有几个优点:
- 简单。从技术上讲,可以将
org.apache.activemq.artemis.api.core.Message
实例转换为javax.jms.Message
实例,但这并不是直截了当的。javax.jms.Message
是一个 JMS 客户端 class。它没有在任何地方的服务器上使用,因此没有现成的工具来进行任何类型的转换 to/from 它。 - 速度很快。如果您使用
javax.jms.Message
,您还必须使用 JMS 客户端来发送它,这意味着创建和管理 JMS 资源,如javax.jms.Connection
和javax.jms.Session
。这并不是您真正想要在代理插件中执行的操作,因为它会增加相当多的延迟。这里展示的方法是使用broker自己的内部API来处理消息。不需要客户端资源。 - 它是异步的。通过发送消息并让 Camel 稍后接收它,您根本不必等待 Camel,这减少了插件增加的延迟。