JMS两种消息方式

JMS的消息模式有1.点对点的消息模式(Point to Point Messaging)

2.发布订阅模式(publish – subscribe Mode)

这里基于点对点的消息模式进行ActiveMQ发消息和收消息过程的分析,请看模型图:

ActiveMQ发消息和收消息

点对点的消息发送方式主要建立在 Message Queue,Sender,reciever上,Message Queue 存贮消息,Sneder(客户端A) 发送消息,receive(客户端B)接收消息。具体点就是客户端A发送Message Queue ,而 客户端B从Queue中接收消息和"发送消息已接受"到Quere,确认消息接收。消息发送客户端与接收客户端没有时间上的依赖,发送客户端可以在 任何时刻发送信息到Queue,而不需要知道接收客户端是不是在运行 

请看下面发消息和收消息的例子

001 package com.activemq.queue;
002  
003  
004 import java.util.Date;
005  
006  
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;
017  
018  
019 import org.apache.activemq.ActiveMQConnection;
020 import org.apache.activemq.ActiveMQConnectionFactory;
021  
022  
023 public class ActiveMqTest {
024   
025  private static String queueName = "activemq_queue_";
026  
027  
028  public static void main(String[] args) {
029  Receiver receiver=new Receiver();
030  Sender sender =new Sender();
031  try {
032  sender.send();
033  receiver.receive();
034  catch (Exception e) {
035  e.printStackTrace();
036  }
037  }
038  
039  
040  static class Receiver {
041  public static void receive() throws Exception {
042  ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
043  Connection connection = connectionFactory.createConnection();
044  connection.start();
045  Session session = connection.createSession(Boolean.TRUE,
046  Session.AUTO_ACKNOWLEDGE);
047  Destination destination = session.createQueue(queueName);
048  MessageConsumer consumer = session.createConsumer(destination);
049  //第一种情况
050  int i = 0;
051  while (i < 3) {
052  i++;
053  TextMessage message = (TextMessage) consumer.receive();
054  session.commit();
055  // TODO something....
056  System.out
057  .println("收到消息:" +message.getText());
058  }
059  session.close();
060  connection.close();
061  //----------------第一种情况结束----------------------
062  //第二种方式
063 //          consumer.setMessageListener(new MessageListener() {
064 //              public void onMessage(Message arg0) {
065 //                  if(arg0 instanceof TextMessage){
066 //                      try {
067 //                          System.out.println("arg0="+((TextMessage)arg0).getText());
068 //                      } catch (JMSException e) {
069 //                          e.printStackTrace();
070 //                      }
071 //                  }
072 //              }
073 //          });
074  //第三种情况
075 //           while (true) {
076 //            Message msg = consumer.receive(1000);
077 //            TextMessage message = (TextMessage) msg;
078 //            if (null != message) {
079 //               System.out.println("收到消息:" + message.getText());
080 //            }
081 //        }
082  }
083  }
084  
085  
086  static class Sender {
087  public static void send() throws Exception {
088  ConnectionFactory connectionFactory = null;
089  connectionFactory = new ActiveMQConnectionFactory(
090                 ActiveMQConnection.DEFAULT_USER, //null
091                 ActiveMQConnection.DEFAULT_PASSWORD, //null
092                 "tcp://localhost:61616");
093  
094  
095  Connection connection = connectionFactory.createConnection();
096  connection.start();
097  
098  
099  Session session = connection.createSession(Boolean.TRUE,
100  Session.AUTO_ACKNOWLEDGE);
101  Destination destination = session.createQueue(queueName);
102  
103  
104  MessageProducer producer = session.createProducer(destination);
105  for (int i = 0; i < 3; i++) {
106  TextMessage message = session.createTextMessage("count"+new Date().getTime());
107  Thread.sleep(1000);
108  // 通过消息生产者发出消息
109  System.out.println("发送消息"+i+new Date());
110  producer.send(message);
111  }
112  session.commit();
113  session.close();
114  connection.close();
115  }
116  }
117 }
Sender主要的作用是发送消息,Receiver主要的作用是接受消息,并且显示一下接收消息的内容,这里详细的解释接受消息的方法:

(1)第一种方法使用consumer.receive() 或 consumer.receive(int timeout)接受消息,消息的接收者会一直等待下去,直到有消息到达,或者超时。

其实第一种方法和第三种方法接受原理一样,区别是第一种知道要接受消息的条数,接受完消息,手动关系连接。而第三种不知道要接受多少条数据,所以使用while (true) 死循环直接在接受消息

(2)第二种方法:消息消费者注册一个MessageListener当有消息到达的时候,会回调它的onMessage()方法。

这里需要注意的是,你注册完成MessageListener,千万不要关闭连接session.close();和connection.close();因为你刚刚注册完成监听器,就把连接关闭,就不会受到消息,所以监听器中也不会有处理。(这个问题可把我整哭了,搞了半天,才弄明白)

请看ActiveMQ 页面上显示队列的信息

ActiveMQ发消息和收消息name是队列名称

Number Of Pending Messages  是队列中有多少个消息等待出队列

Number Of Consumers  是队列中有多少个消费者

Messages Enqueued  队列共有多少个信息

Messages Dequeued  是队列中已经出列多少个消息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值