JMS的消息模式有1.点对点的消息模式(Point to Point Messaging)
2.发布订阅模式(publish – subscribe Mode)
这里基于点对点的消息模式进行ActiveMQ发消息和收消息过程的分析,请看模型图:
点对点的消息发送方式主要建立在 Message Queue,Sender,reciever上,Message Queue 存贮消息,Sneder(客户端A) 发送消息,receive(客户端B)接收消息。具体点就是客户端A发送Message Queue ,而 客户端B从Queue中接收消息和"发送消息已接受"到Quere,确认消息接收。消息发送客户端与接收客户端没有时间上的依赖,发送客户端可以在 任何时刻发送信息到Queue,而不需要知道接收客户端是不是在运行 。
请看下面发消息和收消息的例子
001 | package com.activemq.queue; |
004 | import java.util.Date; |
007 | import javax.jms.Connection; |
008 | import javax.jms.ConnectionFactory; |
009 | import javax.jms.Destination; |
010 | import javax.jms.JMSException; |
011 | import javax.jms.Message; |
012 | import javax.jms.MessageConsumer; |
013 | import javax.jms.MessageListener; |
014 | import javax.jms.MessageProducer; |
015 | import javax.jms.Session; |
016 | import javax.jms.TextMessage; |
019 | import org.apache.activemq.ActiveMQConnection; |
020 | import org.apache.activemq.ActiveMQConnectionFactory; |
023 | public class ActiveMqTest { |
025 | private static String queueName = "activemq_queue_" ; |
028 | public static void main(String[] args) { |
029 | Receiver receiver= new Receiver(); |
030 | Sender sender = new Sender(); |
034 | } catch (Exception e) { |
040 | static class Receiver { |
041 | public static void receive() throws Exception { |
042 | ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); |
043 | Connection connection = connectionFactory.createConnection(); |
045 | Session session = connection.createSession(Boolean.TRUE, |
046 | Session.AUTO_ACKNOWLEDGE); |
047 | Destination destination = session.createQueue(queueName); |
048 | MessageConsumer consumer = session.createConsumer(destination); |
053 | TextMessage message = (TextMessage) consumer.receive(); |
057 | .println( "收到消息:" +message.getText()); |
086 | static class Sender { |
087 | public static void send() throws Exception { |
088 | ConnectionFactory connectionFactory = null ; |
089 | connectionFactory = new ActiveMQConnectionFactory( |
090 | ActiveMQConnection.DEFAULT_USER, |
091 | ActiveMQConnection.DEFAULT_PASSWORD, |
092 | "tcp://localhost:61616" ); |
095 | Connection connection = connectionFactory.createConnection(); |
099 | Session session = connection.createSession(Boolean.TRUE, |
100 | Session.AUTO_ACKNOWLEDGE); |
101 | Destination destination = session.createQueue(queueName); |
104 | MessageProducer producer = session.createProducer(destination); |
105 | for ( int i = 0 ; i < 3 ; i++) { |
106 | TextMessage message = session.createTextMessage( "count" + new Date().getTime()); |
109 | System.out.println( "发送消息" +i+ new Date()); |
110 | producer.send(message); |
Sender主要的作用是发送消息,Receiver主要的作用是接受消息,并且显示一下接收消息的内容,这里详细的解释接受消息的方法:
(1)第一种方法使用consumer.receive() 或 consumer.receive(int timeout)接受消息,消息的接收者会一直等待下去,直到有消息到达,或者超时。
其实第一种方法和第三种方法接受原理一样,区别是第一种知道要接受消息的条数,接受完消息,手动关系连接。而第三种不知道要接受多少条数据,所以使用while (true) 死循环直接在接受消息。
(2)第二种方法:消息消费者注册一个MessageListener,当有消息到达的时候,会回调它的onMessage()方法。
这里需要注意的是,你注册完成MessageListener,千万不要关闭连接session.close();和connection.close();因为你刚刚注册完成监听器,就把连接关闭,就不会受到消息,所以监听器中也不会有处理。(这个问题可把我整哭了,搞了半天,才弄明白)
请看ActiveMQ 页面上显示队列的信息
name是队列名称
Number Of Pending Messages 是队列中有多少个消息等待出队列
Number Of Consumers 是队列中有多少个消费者
Messages Enqueued 是队列共有多少个信息
Messages Dequeued 是队列中已经出列多少个消息