java的JMS与spring的AMQP的理解心得

java的JMS与spring的AMQP的理解心得

相对比rpc消息的同步消息模式,jms和AMQP的异步消息模式也有非常大的用途。

1.JMS

JMS是一个java标准,定义了使用消息代理的通用API,在JMS出现之前,每个消息代理都有私有API,这就使得不同代理之间的消息代码很难通用,借助JMS,所有遵守规范的实现都使用通用的接口,类似于JDBC为数据库操作提供了通用的接口一样。
1.1 点对点消息模型:

在点对点模型中,每一条消息都有一个发送者和一个接收者,当消息代理得到消息时,它将消息放入一个队列中。
当接收者请求队列中的下一条消息时,消息会从队列中取出,并投递给接收者。因为消息投递后会从队列中删除,
这样就可以保证消息只能投递给一个接收者。

1.2 发布订阅消息模型:

在发布—订阅消息模型中,消息会发送给一个主题。与队列类似,多
个接收者都可以监听一个主题。但是,与队列不同的是,消息不再是
只投递给一个接收者,而是主题的所有订阅者都会接收到此消息的副
本

1.3 在Spring中搭建消息代理

典型消息代理:ActiveMQ
模板代码: JmsTemplate

1.4 创建消息驱动的POJO

使用JmsTemplate接收消息的最大缺点在于receive()和
receiveAndConvert()方法都是同步的。这意味着接收者必须耐
心等待消息的到来,因此这些方法会一直被阻塞,直到有可用消息
(或者直到超时)。同步接收异步发送的消息,这和异步消息模式的初衷有违,所以消息驱动就是来解决这个问题。

新建一个消息处理器类,可以实现官方建议的接口类MessageListener,为了低耦合可以不实现,这个类就是消息
驱动的POJO,在mvc文件中声明连接工厂,消息监听器(pojo),监听器中的方法和监听的消息队列。

2.AMQP

与JMS不同的是,AMQP的生产者并不会直接将消息发布到队列中。
AMQP在消息的生产者以及传递信息的队列之间引入了一种间接的机
制:Exchange。
四种标准的AMQP Exchange如下所示:

Direct:如果消息的routing key与binding的routing key直接匹配的
话,消息将会路由到该队列上;
Topic:如果消息的routing key与binding的routing key符合通配符匹
配的话,消息将会路由到该队列上;
Headers:如果消息参数表中的头信息和值都与bingding参数表中
相匹配,消息将会路由到该队列上;
Fanout:不管消息的routing key和参数表的头信息/值是什么,消
息将会路由到所有队列上。

借助这四种类型的Exchange,很容易就能想到我们可以定义任意数量
的路由模式,而不再仅限于点对点和发布-订阅的方式。[3]好消息
是,当发送和接收消息的时候,所涉及的路由算法对于如何编写消息
的生产者和消费者并没有什么影响。简单来讲,生产者将信息发送给
Exchange并带有一个routing key,消费者从队列中获取消息。

和JMS模式非常类似,除了典型消息代理是RabbitMQ,模板代码是RabbitTemplate。

3. 总结

异步消息通信与同步RPC相比有几个优点。间接通信带来了应用之间的松散耦合,因此减轻了其中任意一个应用崩溃所带来的影响。此外,因为消息转发给了收件人,因此发送者不必等待响应。很多情况下,这会提高应用的性能。虽然JMS为所有的Java应用程序提供了异步通信的标准API,但是它使用起来很繁琐。Spring消除了JMS样板式代码和异常捕获代码,让异步消息通信更易于使用。

在本文中,我们了解了Spring通过消息代理和JMS建立应用程序之间异步通信的几种方式。Spring的JMS模板消除了传统的JMS编程模型所必需的样板式代码,而基于Spring的消息驱动bean可以通过声明bean的方法允许方法响应来自于队列或主题中的消息。我们同样了解了如何通过Spring的JMS invoker为Spring bean提供基于消息的RPC。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值