• 1. By LeoJMS—Java Message Service
  • 2. JMS即Java消息服务,是由Java官方提供的API,需要第三方Provider提供实现。类似于JDBC,它也是Java官方提供的API,需要其他数据库厂商提供实现。 JMS是面向消息的中间件(Message-Oriented Middleware),它提供了标准的产生、发送、接收消息的接口,简化企业应用的开发。What is JMS?
  • 3. 1.ConnectionFactory/Connection 接口:ConnectionFactory(连接工厂)用于提供Connection,类似于JDBC的Connection。JDBC的Connection是用于连接数据库,而JMS的Connection是用于连接消息服务器,比如ActiveMQ。 2.Session 接口:Session表示一次会话,也可以说是一个线程。JMS中的许多对象都需要通过Session创建。What make up JMS?
  • 4. 3.Destination 接口:表示消息要发送到的目标;可以是一个主题(Topic)或者一个队列(Queue)。好比是一个消息的通道,发送消息者需要把消息发送到这个通道,阅读消息者需要从这个通道读取消息,由Session创建。 4.MessageProducer 接口:表示发送消息者,由Session创建。 5.MessageConsumer 接口:表示接收消息者,由Session创建。 6.Message 接口:表示消息,由Session创建。
  • 5. 了解了JMS的基本接口,就已经会收发消息了。但是我们还需要一个收发消息的服务器——ActiveMQ。 ActiveMQ是apache的开源产品,它实现了JMS的ConnectionFactory/Connection 接口,所以我们需要通过它提供的Connection来连接上强大的ActiveMQ。 ActiveMQ官方下载地址: http://activemq.apache.org/download.htmlWhat is ActiveMQ?
  • 6. 还记得JDBC的基本步骤:Connection(连接数据库)->Statement(写SQL语句)->ResultSet(获得结果集),印象深刻吧 JMS只比它多了几个步骤:ConnectionFactory->Connection->Session->Destination-> MessageProducer/ MessageConsumer ->(Send/Receive)Message ,创建消息生产者和消费者的过程大致相同。下面看张图:How to use JMS?
  • 7. (本页无文本内容)
  • 8. JMS的收发Message的方式有两种: 1.Publish/subscribe:生产/订阅模式,这里是通过Topic,消息消费者可以共享这个主题,就好比论坛上的主题,大家都可以看到。 2. Point-to-point:点对点模式,这里是通过Queue,只能有一个消费者消费一条消息,并且谁先阅读了这条消息,该消息就会从Queue中删除。What about Message?
  • 9. (本页无文本内容)
  • 10. 下面展示了一个简单的收发消息的示例,首先需要启动ActiveMQ,然后分别运行发送端和接收端。需要注意的是,如果你创建的是一个Queue,那么只有一个接收端能收到消息;如果你创建的是一个Topic,消息可以被若干个接收端接收到。An Simple Example:
  • 11. (本页无文本内容)
  • 12. (本页无文本内容)
  • 13. MessageReceiver运行的结果是打印出了”哈喽!世界!”,看上去就跟Socket一样。当然,JMS的用处不仅仅是打印一个HELLOWORLD那么简单。 我们在浏览器上输入http://localhost:8161/admin/queues.jsp,初始帐号密码为admin。可以查看发送的消息:
  • 14. 是不是觉得好像很久没写过JDBC了?那是因为有Hibernate等框架帮你把这些枯燥而重复的步骤完成了,你只需要填写配置文件就可以了。 JMS也有其他框架封装,比如Spring。它提供了JmsTemplate,通过这个JMS模板,我们无需再去创建一大堆JMS对象,直接通过模板来收发消息。当然,配置文件是必需的。 下面是代码展示:Use JMS with Spring
  • 15. applicationContext.xmlMessageSender.java
  • 16. MessageReceiver.javalocalhost:8161/admin/queues.jsp
  • 17. 通过上面简单的示例,也许你压根体会不到JMS的优势。确实如此,如果可以直接把消息发送给对方,为何要通过中间件来帮我们传递消息,这不是多此一举吗? MOM(面向消息的中间件)的出现必然有其优越的地方,至少可以总结出下面几条显而易见的优点:Why is JMS?
  • 18. 1.无阻塞:在牛X网中是否觉得在允许资源的时候系统反应有点慢,那是因为在发RTX消息的时候需要请求远端的电脑,自然会有阻塞。但是如果通过本地的中间件(比如ActiveMQ),那你完全可以继续执行下面的操作,让客户从ActiveMQ中读消息。 2.去耦合:你在发送RTX的时候是否要明确指明接收方?可很多情况下,你无需知道接收消息的人是谁,而只需知道什么时候要发送消息。MOM能满足你这个需求。
  • 19. 3.更可靠:在发送消息的时候我们可能等了半天,终于等来了一个异常。可能仅仅是因为客户端断了一下网或者电源被踢掉了,这些情况在给大量客户发送消息的时候是不可避免的,总是出现异常不是一种友好的方式。那么请选择MOM。 4.支持多发送者和多接收者:如果一个聊天工具只支持一对一聊天的话,你会选择使用它吗?同样的道理,如果你每次只能发送一条消息给一个人,那是多么枯燥!MOM能帮你解决这个问题。
  • 20. 上面的示例用的都是JMS的父接口,相关Queue和Topic接口的继承关系如下图:Deep into JMS