说到消息中间件,不得不提一下 JMS。JMS是java消息服务(Java Message Service)应用程序接口,是Java平台上有关面向消息中间件(MOM)的技术规范,是一套和厂商无关的API接口协议,只要遵循这套协议,哪个厂商都可以实现自己的JMS产品,比如Apache的ActiveMQ,JBoss的jbossMQ,OpenJMS,IBM的WebSphere MQ.等
JMS常用于在两个系统之间,或者分布式系统之间发送消息,进行异步通信。除此之外,消息中间件还能在复杂的应用系统中起到解耦分层的作用,降低系统模块之间的强依赖。
JMS的基本构件有连接工厂、连接、会话、目的地、生产者、消费者、消息等。下面依次介绍这些构件。
1.连接工厂:类名是javax.jms.ConnectionFactory,作用是创建连接Connection。在ActiveMQ中,相对应的实现是ActiveMQConnectionFactory。代码如下:
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD,
"tcp://localhost:61616");
2.连接:类名javax.jms.Connection,该类封装了客户与JMS Provider之间的一个虚拟连接。连接是由连接工厂生成的,代码如下:
Connection connection=connectionFactory.createConnection();
3.会话:类名javax.jms.Session,JMS Session是生产和消费消息的一个单线程上下文,用于创建消息生产者(producer)、消息消费者(consumer)、消息(message)等。会话提供了一个事务性的上下文,在这个上下文中,一组发送消息和接收消息被组合到了一个原子操作中。session是由连接创建的,代码如下:
Session session=connection.createSession(true,Session.AUTO_ACKNOWLEDGE);
在这个方法中有两个参数,第一个参数是布尔类型,表示是否支持事务。第二个参数表示用哪种确认方式。
4.目的地:类名javax.jms.Destination,目的地是客户用来指定它生产的消息的目标和它消费的消息的来源的对象。JMS规范中,定义了两种消息传递类型:点对点(PTP)和发布/订阅(publish/subscribe).
点对点模式有以下一些特点:
(a)每个消息只能有一个消费者
(b)消息生产者和消费者没有时间上的相关性,无论消费者在生产者发送消息的时候是否处于运行状态,消费者都可以提取消息并进行消费。
(c)在该模式下,目的地被称为消息队列queue
发布/订阅模式有以下一些特点:
(a)每个消息可以有多个消费者
(b)生产者和消费者之间有时间上的相关性,订阅一个主题的消费者只能消费自它订阅之后发布的消息。JMS规范允许客户创建持久订阅,它在一定程度上放松了时间上的相关性要求。持久订阅允许消费者消费它在未处于激活状态时发送的消息。
(c)在该模式下,目的地被称为主题topic
相应代码如下:
Destination destination=session.createQueue("queueName");//创建p2p模式的目的地
Destination destination=session.createTopic("topicName");//创建发布订阅模式的目的地
5.消息生产者:类名javax.jms.MessageProducer,是由会话创建的一个对象,用于把消息发到一个目的地。代码如下:
MessageProducer producer=session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//设置发送模式,非持久化
6.消息消费者:类名javax.jms.Consumer,也是有会话创建的一个对象,用于接收发送到目的地的消息。消息消费一般有两种方式:
(a)同步消费。通过调用消费者的receive方法,从目的地中显示提取消息。receive方法可以一直阻塞到消息到达。
(b)异步消费。客户可以为消费者注册一个消息监听器,以定义在消息到达时所采取的动作。
需要注意的是,同一个会话下的消费者,不能同时使用这两种方式进行消费。相关代码如下:
MessageConsumer consumer = session.createConsumer(destination);
7.消息:一个JMS消息分为三部分,消息头、消息属性、消息体。JMS预定义的消息类型有TextMessage、 MapMessage、 BytesMessage、StreamMessage 和 ObjectMessage