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

des*_*sad 2 activemq-classic jms tibco-ems ibm-mq

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

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

虽然示例很少,而且往往很少,因此我需要在我的类路径和桥接配置中包含来自每个此类实现(Weblogic,WebsphereMQ,TIBCO EMS等)的jms客户端jar,这一点令人困惑.没有任何这样的罐子可以做到这一点吗?

由于目标是连接到单独的组织MOM,我想避免使用任何第三方,可能是许可的jar.

T.R*_*Rob 5

......一个令人困惑的问题是我是否需要在我的类路径和网桥配置中包含来自每个此类实现(Weblogic,Websphere MQ,TIBCO EMS等)的JMS客户端jar.没有任何这样的罐子可以做到这一点吗?

TL; DR:您需要供应商的专有类.

JMS定义API并将有线格式和其他实现细节留给传输供应商.此外,在专有实现中,有线格式可以显着改变版本.(专有代码的一个优点是能够在这样做时进行如此大的结构更改,从而提高性能,可靠性或功能.)

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

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

这种方法当然有很多"陷阱".我将列出一些显而易见的:

  • 跨供应商的映射目的地是手动的
  • 身份传播不具有可执行性,并且要求网桥具有准管理权限或完全管理权限.
  • 提供商之间的交易最多是困难的,最糟糕的是不可能.
  • 如果相关标识符完全映射,则它们必须由桥映射.这使得桥更复杂,并要求它使用数据库或其他持久存储.
  • 特定于供应商的类通常具有JMS规范指定的属性和方法的超集.如果使用,则在复印期间将其剥离.
  • 由于消息分段,分组和其他亲和力,桥上可能没有1:1的相关性.
  • 由于高可用性等实现的差异,一个传输提供商的物理网络结构可能不会将1:1映射到另一个传输提供商的物理网络结构.这倾向于将桥功能限制为两个传输的最简单的公分母.
  • 通用桥梁提出的问题包括两方桥梁的所有问题,作为支持的运输数量的指数而提出.因此,如果双输电桥很难x,那么出于规划目的,假设一个输电桥很难(x)**5.

这并不是说"不编码桥",因为它们非常有用.请注意,这不是一项微不足道的任务.