JMS 提供了一组用于消息传递的 API:将消息放在队列中,其他人在稍后的某个时间,可能在地理上很远的地方将消息从队列中取出并处理它。我们在时间和位置上解耦了消息提供者和消费者。即使消息消费者碰巧宕机了一段时间,我们也可以继续生产消息。
JMS 还提供发布/订阅功能,生产者将消息放入“主题”,任何感兴趣的各方都可以订阅该主题,在消息产生时接收消息,但目前只关注队列能力。
我们已经解耦了提供者和消费者之间关系的某些方面。然而,一些耦合仍然存在。首先,就目前情况而言,每条消息都以相同的方式处理。假设我们要为不同种类的消息引入不同种类的处理:
if ( message.customer.type == Platinum )
do something special
显然我们可以编写这样的代码,但另一种方法是拥有一个可以将不同消息发送到不同位置的消息传递系统,我们设置了三个队列:
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
然后我们需要的只是队列系统本身的一点点聪明,以便将消息从请求队列转移到白金队列或标准队列。
所以这是基于内容的路由功能,并且是 ESB 提供的东西。请注意,ESB 使用 JMS 提供的基本队列功能。
第二种耦合是消费者和生产者必须就消息格式达成一致。在简单的情况下,这很好。但是,当您开始让许多生产者都将消息放入同一个队列时,您就会开始遇到版本控制问题。引入了新的消息格式,但您不想更改所有现有的提供程序。
Request Version 1 Queue Existing providers write here
Request Version 2 Queue New provider write here, New Consumer Reads here
然后 ESB 拾取版本 1 队列消息并将它们转换为版本 2 消息并将它们放入版本 2 队列中。
消息转换是另一种可能的 ESB 功能。
看看 ESB 产品,看看它们能做什么。在 IBM 工作时,我最熟悉 WebSphere ESB