如何将 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.Connectionjavax.jms.Session。这并不是您真正想要在代理插件中执行的操作,因为它会增加相当多的延迟。这里展示的方法是使用broker自己的内部API来处理消息。不需要客户端资源。
  • 它是异步的。通过发送消息并让 Camel 稍后接收它,您根本不必等待 Camel,这减少了插件增加的延迟。