设置 ActiveMQ 桥以连接到 MOM 的不同实现

Setting up ActiveMQ bridge to connect to different implementations of MOM

我想部署 ActiveMQ 以便与 jms 的其他 MOM 实现(例如 WebsphereMQ、Tibco EMS、Oracle WebLogic JMS 等)连接和通信

据我在线研究,这似乎可以通过在 activemq 之上构建一个所谓的桥接器来实现,该桥接器将能够与另一端通信,而不管每个 jms 实现使用的底层线路协议如何。

虽然示例很少,而且通常很少,所以令人困惑的一点是我是否需要在我的类路径和桥接配置中包含来自每个此类实现(Weblogic、WebsphereMQ、TIBCO EMS 等)的 jms 客户端 jar。没有这样的罐子可以完成吗?

由于目标是连接到单独的组织 MOM,因此我希望避免使用任何第 3 方、可能获得许可的 jar。

恐怕至少在 IBM MQ 端这是不可能的。 JMS 只是一个 API,每个提供者都可以按照他们认为合适的方式自由实施它(正如您所说的那样,它不是有线协议)。提供程序 jar 是连接到 JMS 产品所必需的。

...a point of confusion is whether I need to include JMS client jars from each such implementation (Weblogic, Websphere MQ, TIBCO EMS etc) in my classpath and bridge configuration. Can this be done without any such jars?

TL;DR:您需要供应商的专有 classes。

JMS 定义 API 并将有线格式和其他实现细节留给传输供应商。此外,在专有实现中,有线格式可以在版本之间发生显着变化。 (专有代码的优势之一是能够在提高性能、可靠性或功能时进行如此大的结构更改。)

两个 JMS 实现的共同点是当消息在内存中时。由于所有传输供应商的实现都继承自相同的 Java JMS classes,因此通常可以实例化来自两个不同传输供应商的消息对象并从一个传输供应商复制到另一个。为此,您必须拥有每个支持的传输提供商的 jar。

事实上,这就是我使用过的大多数 JMS 桥接产品的工作方式。桥代码使用完全限定的 class 名称来引用来自两个不同供应商的 classes。然后它创建两个连接工厂,每个连接工厂一个,每个运输一个,还有两个不同的目的地,每个运输也一个。然后它从一个提供程序上的队列中读取消息,将其复制到另一个传输提供程序上的消息对象,然后写入消息。

当然有很多"gotchas"采用这种方法。我将列出一些明显的:

  • 跨提供商映射目的地是手动的。
  • 身份传播不可强制执行,需要网桥具有准或完全管理员权限。
  • 提供者之间的交易充其量是困难的,最坏的情况是不可能的。
  • 相关标识符必须由网桥映射(如果完全映射的话)。这使得网桥更加复杂,并且需要它使用数据库或其他持久存储。
  • 特定于供应商的 classes 通常具有 JMS 规范指定的属性和方法的超集。如果使用,这些将在复制过程中被剥离。
  • 由于消息分段、分组和其他亲和性,桥接之间可能没有 1:1 关联。
  • 由于高可用性等方面的实施差异,一个传输提供商的物理网络结构可能无法映射 1:1 到另一个传输提供商的物理网络结构。这往往会将桥接功能限制为两种传输方式中最简单的公分母。
  • 通用网桥引发的问题包括 2 方网桥的所有问题,以支持的传输数量的指数形式提出。因此,如果 2 座运输桥有困难 x,那么出于规划目的,假设 5 座运输桥有困难 (x)**5

这并不是说 "don't code a bridge",因为事实证明这些非常有用。请注意,这不是一项微不足道的任务。

我们有一个叫做虚拟目的地的概念,试试看