对我来说,JMS和ESB似乎是非常相关的东西,我试图了解它们究竟是如何相关的.
我已经看到JMS可以用作ESB的传输的句子 - 那么除了传输之外的其他什么应该存在于这样的ESB中?JMS是一个简单的ESB,或者如果不是,那么真正的ESB缺少什么?
djn*_*jna 31
JMS提供了一组用于消息传递的API:将消息放在队列中,其他人稍后,可能在地理上很远的地方将消息从队列中取出并处理它.我们已经将消息提供者和消费者的时间和位置分离.即使消息消费者恰好关闭了一段时间,我们也可以继续生成消息.
JMS还提供发布/订阅功能,生产者将消息放入"主题",任何感兴趣的人都可以订阅该主题,在生成消息时接收消息,但目前只关注队列功能.
我们已将提供者与消费者之间关系的某些方面脱钩.但是仍然有一些耦合.首先,就目前而言,每条消息都以相同的方式处理.假设我们想为不同类型的消息引入不同类型的处理:
if ( message.customer.type == Platinum )
do something special
Run Code Online (Sandbox Code Playgroud)
显然我们可以编写这样的代码,但另一种方法是使用一个消息传递系统,可以将不同的消息发送到我们设置三个队列的不同位置:
Request Queue, the producer(s) puts their requests here
Platinum Queue, platinum consumer processing reads from here
Standard Queue, a standard consumer reads messages from here
Run Code Online (Sandbox Code Playgroud)
然后我们需要的只是队列系统本身的一点点聪明才能将请求队列中的消息传输到白金队列或标准队列.
因此,这是基于内容的路由功能,是ESB提供的功能.请注意,ESB使用JMS提供的基本排队功能.
第二种类型的解决方案是消费者和制作者必须就消息格式达成一致.在简单的情况下,这很好.但是当你开始让许多生产者将消息放到同一个队列时,你就会开始遇到版本问题.引入了新的消息格式,但您不希望更改所有现有的提供程序.
Request Version 1 Queue Existing providers write here
Request Version 2 Queue New provider write here, New Consumer Reads here
Run Code Online (Sandbox Code Playgroud)
然后,ESB获取版本1队列消息并将其转换为版本2消息并将它们放入版本2队列.
消息转换是另一种可能的ESB功能.
看看ESB产品,看看他们能做些什么.当我在IBM工作时,我最熟悉WebSphere ESB