深入掌握JMS 系列 1~12

深入掌握JMS(一):JMS基础

http://blog.csdn.net/zhangxs_3/archive/2009/03/29/4034713.aspx

深入掌握JMS(二):一个JMS例子

http://www.360doc.com/content/090712/20/18042_4241651.html

深入掌握JMS(三):MessageListener

http://www.ruanko.com:9090/uchome/space.php?uid=727&do=blog&id=7726

深入掌握JMS(四):实战Queue

http://www.360doc.com/content/090712/20/18042_4241594.html

深入掌握JMS(五):实战Topic

http://www.360doc.com/content/090712/20/18042_4241563.html

深入掌握JMS(六):消息头

http://www.ruanko.com:9090/uchome/space.php?uid=727&do=blog&id=7731

深入掌握JMS(七):DeliveryMode 例子

http://www.360doc.com/content/090712/20/18042_4241426.html

深入掌握JMS(八):JMSReplyTo   

http://www.360doc.com/content/090712/20/18042_4241367.html

深入掌握JMS(九):Selector   

http://www.360doc.com/content/090712/20/18042_4241298.html

深入掌握JMS(十):JMSCorrelationID&Selector   

http://www.360doc.com/content/090712/20/18042_4241252.html

深入掌握JMS(十一):TemporaryQueue&TemporaryTopic 

http://www.360doc.com/content/090712/21/18042_4241975.html

深入掌握JMS(十二):MDB 

http://www.360doc.com/content/090712/21/18042_4242116.html

 

jms服务器是 apache-activemq-5.2.0

需要倒入的包有 activemq-all-5.2.0.jar

http://www.360doc.com/content/090712/20/18042_4241298.html

Example 1

 

ConnectionFactory---->Connection--->Session--->Message
  Destination + Session------------------------------------>Producer
  Destination + Session------------------------------------>MessageConsumer

首先需要得到ConnectionFactoy和Destination,这里创建一个一对一的Queue作为Destination。
 ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");
  Queue queue = new ActiveMQQueue("testQueue");

然后又ConnectionFactory创建一个Connection, 再启动这个Connection:
  Connection connection = factory.createConnection();
  connection.start();

接下来需要由Connection创建一个Session:
  Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)
    现在暂且不用管参数的含义, 以后会详细讲到.

下面就可以创建Message了,这里创建一个TextMessage。
  Message message = session.createTextMessage("Hello JMS!");

要想把刚才创建的消息发送出去,需要由Session和Destination创建一个消息生产者:
  MessageProducer producer = session.createProducer(queue);

下面就可以发送刚才创建的消息了:
  producer.send(message);

消息发送完成之后,我们需要创建一个消息消费者来接收这个消息:
  MessageConsumer comsumer = session.createConsumer(queue);
  Message recvMessage = comsumer.receive();

消息消费者接收到这个消息之后,就可以得到它的内容:
  System.out.println(((TextMessage)recvMessage).getText());

 

import javax.jms.Connection;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;

public class MessageSendAndReceive {

    public static void main(String[] args) throws Exception {
       ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");
   
        Connection connection = factory.createConnection();
        connection.start();
       
        Queue queue = new ActiveMQQueue("testQueue");
       
        final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Message message = session.createTextMessage("Hello JMS!");
       
        MessageProducer producer = session.createProducer(queue);
        producer.send(message);
   
        System.out.println("Send Message Completed!");
       
        MessageConsumer comsumer = session.createConsumer(queue);
        Message recvMessage = comsumer.receive();
        System.out.println(((TextMessage)recvMessage).getText());
    }

}

 

Example 2 实战Queue

import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;

public class QueueTest {

    public static void main(String[] args) throws Exception {
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");
   
        Connection connection = factory.createConnection();
        connection.start();       

        // 创建一个 Queue
        Queue queue = new ActiveMQQueue("testQueue");

        // 创建一个 Session
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);       

        // 注册消费者 1
        MessageConsumer comsumer1 = session.createConsumer(queue);
        comsumer1.setMessageListener(new MessageListener(){
            public void onMessage(Message m) {
                try {
                    System.out.println("Consumer1 get " + ((TextMessage)m).getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });       

        // 注册消费者 2
        MessageConsumer comsumer2 = session.createConsumer(queue);
        comsumer2.setMessageListener(new MessageListener(){
            public void onMessage(Message m) {
                try {
                    System.out.println("Consumer2 get " + ((TextMessage)m).getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
           
        });       

        // 创建一个生产者,然后发送多个消息。
       
MessageProducer producer = session.createProducer(queue);
        for(int i=0; i<10; i++){
            producer.send(session.createTextMessage("Message:" + i));
        }
    }
}

  运行这个例子会得到下面的输出结果:

Consumer1 get Message:0
Consumer2 get Message:1
Consumer1 get Message:2
Consumer2 get Message:3
Consumer1 get Message:4
Consumer2 get Message:5
Consumer1 get Message:6
Consumer2 get Message:7
Consumer1 get Message:8
Consumer2 get Message:9

 
可以看出每个消息直被消费了一次,但是如果有多个消费者同时监听一个 Queue 的话,无法确定一个消息最终会被哪一个消费者消费。

 

Example 3 实战 Topic

mport javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQTopic;


public class TopicTest {

    public static void main(String[] args) throws Exception {
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");
   
        Connection connection = factory.createConnection();
        connection.start();
       
        //
创建一个
Topic
        Topic topic= new ActiveMQTopic("testTopic");
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        
        //
注册消费者
1
        MessageConsumer comsumer1 = session.createConsumer(topic);
        comsumer1.setMessageListener(new MessageListener(){
            public void onMessage(Message m) {
                try {
                    System.out.println("Consumer1 get " + ((TextMessage)m).getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
       
        //
注册消费者
2
        MessageConsumer comsumer2 = session.createConsumer(topic);
        comsumer2.setMessageListener(new MessageListener(){
            public void onMessage(Message m) {
                try {
                    System.out.println("Consumer2 get " + ((TextMessage)m).getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
           
        });
       
        //
创建一个生产者,然后发送多个消息。
        MessageProducer producer = session.createProducer(topic);
        for(int i=0; i<10; i++){
            producer.send(session.createTextMessage("Message:" + i));
        }
    }

}

运行后得到下面的输出结果:

Consumer1 get Message:0
Consumer2 get Message:0
Consumer1 get Message:1
Consumer2 get Message:1
Consumer1 get Message:2
Consumer2 get Message:2
Consumer1 get Message:3
Consumer2 get Message:3
Consumer1 get Message:4
Consumer2 get Message:4
Consumer1 get Message:5
Consumer2 get Message:5
Consumer1 get Message:6
Consumer2 get Message:6
Consumer1 get Message:7
Consumer2 get Message:7
Consumer1 get Message:8
Consumer2 get Message:8
Consumer1 get Message:9
Consumer2 get Message:9

说明每一个消息都会被所有的消费者消费。

 

消息头

     一个消息对象分为三部分:消息头 (Headers) ,属性( Properties )和消息体( Payload )。对于 StreamMessage MapMessage ,消息本身就有特定的结构,而对于 TextMessage ObjectMessage BytesMessage 是无结构的。 一个 消息可以包含一些重要的数据或者仅仅是一个事件的通知。

    消息的 Headers 部分通常包含一些消息的描述信息,它们都是标准的描述信息。包含下面一些值:

   JMSDestination
      
消息的目的地, Topic 或者是 Queue

   JMSDeliveryMode
       
消息的发送模式: persistent nonpersistent 前者表示消息在被消费之前,如果 JMS 提供者 DOWN 了,重新启动后消息仍然存在。后者在这种情况下表示消息会被丢失。可以通过下面的方式设置:
       Producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

       JMSTimestamp
      
当调用 send() 方法的时候, JMSTimestamp 会被自动设置为当前事件。可以通过下面方式得到这个值:

       long timestamp = message.getJMSTimestamp();

   JMSExpiration
       表示一个消息的有效期。只有在这个有效期内,消息消费者才可以消费这个消息。默认值为 0 ,表示消息永不过期。可以通过下面的方式设置:
       producer.setTimeToLive(3600000); // 有效期 1 小时 1000 毫秒 * 60 * 60 分)

   JMSPriority
       消息的优先级。 0-4 为正常的优先级, 5-9 为高优先级。可以通过下面方式设置:
       producer.setPriority(9);

   JMSMessageID
       一个字符串用来唯一标示一个消息。

   JMSReplyTo
       有时消息生产者希望消费者回复一个消息, JMSReplyTo 为一个 Destination ,表示需要回复的目的地。当然消费者可以不理会它。

   JMSCorrelationID
       通常用来关联多个 Message 。例如需要回复一个消息,可以把 JMSCorrelationID 设置为所收到的消息的 JMSMessageID

   JMSType
       表示消息体的结构,和 JMS 提供者有关。

   JMSRedelivered
       如果这个值为 true ,表示消息是被重新发送了。因为有时消费者没有确认他已经收到消息或者 JMS 提供者不确定消费者是否已经收到。

    除了 Header ,消息发送者可以添加一些属性 (Properties) 。这些属性可以是应用自定义的属性, JMS 定义的属性和 JMS 提供者定义的属性。我们通常只适用自定义的属性。

    后面会讲到这些 Header 和属性的用法。

 

 

Example 4 DeliveryMode 例子

在下面的例子中,分别发送一个 Persistent nonpersistent 的消息,然后关闭退出 JMS

 

import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;

public class DeliveryModeSendTest {

    public static void main(String[] args) throws Exception {
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");
   
        Connection connection = factory.createConnection();
        connection.start();
       
        Queue queue = new ActiveMQQueue("testQueue");
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
               
        MessageProducer producer = session.createProducer(queue);
        producer.setDeliveryMode(DeliveryMode.PERSISTENT);
        producer.send(session.createTextMessage("A persistent Message"));
       
        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
        producer.send(session.createTextMessage("A non persistent Message"));
       
        System.out.println("Send messages sucessfully!");
    }
}

   
运行上面的程序,当输出“ Send messages sucessfully!” 时,说明两个消息都已经发送成功,然后我们结束它,来停止 JMS Provider

    接下来我们重新启动 JMS Provicer ,然后添加一个消费者:

import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;

public class DeliveryModeReceiveTest {

    public static void main(String[] args) throws Exception {
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");
   
        Connection connection = factory.createConnection();
        connection.start();
       
        Queue queue = new ActiveMQQueue("testQueue");
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
       
        MessageConsumer comsumer = session.createConsumer(queue);
        comsumer.setMessageListener(new MessageListener(){
            public void onMessage(Message m) {
                try {
                    System.out.println("Consumer get " + ((TextMessage)m).getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

运行上面的程序,可以得到下面的输出结果:

Consumer get A persistent Message

可以看出消息消费者只接收到一个消息,它是一个 Persistent 的消息。而刚才发送的 non persistent 消息已经丢失了。

另外 , 如果发送一个 non persistent 消息 , 而刚好这个时候没有消费者在监听 , 这个消息也会丢失 .

 

Example 5 JMSReplyTo

 

在下面的例子中,首先创建两个 Queue ,发送者给一个 Queue 发送,接收者接收到消息之后给另一个 Queue 回复一个 Message ,然后再创建一个消费者来接受所回复的消息。

import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;

public class MessageSendReceiveAndReply {

    public static void main(String[] args) throws Exception {
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");
   
        Connection connection = factory.createConnection();
        connection.start();
       
        //
消息发送到这个
Queue
        Queue queue = new ActiveMQQueue("testQueue");

        //
消息回复到这个
Queue
        Queue replyQueue = new ActiveMQQueue("replyQueue");
       
        final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        //
创建一个消息,并设置它的 JMSReplyTo replyQueue
        Message message = session.createTextMessage("Andy");
        message.setJMSReplyTo(replyQueue);
       
        MessageProducer producer = session.createProducer(queue);
        producer.send(message);
           
        //
消息的接收者
        MessageConsumer comsumer = session.createConsumer(queue);
        comsumer.setMessageListener(new MessageListener(){
            public void onMessage(Message m) {
                try {
                    //
创建一个新的 MessageProducer 来发送一个回复消息。
                    MessageProducer producer = session.createProducer(m.getJMSReplyTo());
                    producer.send(session.createTextMessage("Hello " + ((TextMessage) m).getText()));
                } catch (JMSException e1) {
                    e1.printStackTrace();
                }
            }
           
        });
       
        //
这个接收者用来接收回复的消息
        MessageConsumer comsumer2 = session.createConsumer(replyQueue);
        comsumer2.setMessageListener(new MessageListener(){
            public void onMessage(Message m) {
                try {
                    System.out.println(((TextMessage) m).getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
    }

}

   
首先消息生产者发送一个消息,内容为“ Andy” 然后消费者收到这个消息之后根据消息的 JMSReplyTo ,回复一个消息,内容为“ Hello Andy‘ 最后在回复的 Queue 上创建一个接收回复消息的消费者,它输出所回复的内容。


    运行上面的程序,可以得到下面的输出结果:

Hello Andy

 

深入掌握JMS(九)

前面的例子中创建一个消息消费者使用的是:
          sesssion
.createConsumer(destination)
  另外,还提供了另一种方式:
    
sesssion .createConsumer(destination, selector)
 这里selector是一个字符串,用来过滤消息。也就是说,这种方式可以创建一个可以只接收特定消息的一个消费者。
Selector的格式是类似于SQL-92的一种语法。可以用来比较消息头信息和属性。

 

package test.jms;

import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;

public class JMSSelectorTest {

 public static void main(String[] args) throws Exception {
  ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");

  Connection connection = factory.createConnection();
  connection.start();

  Queue queue = new ActiveMQQueue("testQueue");

  Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

  MessageConsumer comsumerA = session.createConsumer(queue, "receiver = 'A'");
  comsumerA.setMessageListener(new MessageListener() {
   public void onMessage(Message m) {
    try {
     System.out.println("ConsumerA get " + ((TextMessage) m).getText());
    } catch (JMSException e1) {
    }
   }
  });

  MessageConsumer comsumerB = session.createConsumer(queue,  "receiver = 'B'");
  comsumerB.setMessageListener(new MessageListener() {
   public void onMessage(Message m) {
    try {
     System.out.println("ConsumerB get " + ((TextMessage) m).getText());
    } catch (JMSException e) {
    }
   }
  });

  MessageProducer producer = session.createProducer(queue);
  for (int i = 0; i < 10; i++) {
   String receiver = (i % 3 == 0 ? "A" : "B");
   TextMessage message = session.createTextMessage("Message" + i + ", receiver:" + receiver);
   message.setStringProperty("receiver", receiver);
   producer.send(message);
  }
 }
}

 

输出结果为:

ConsumerA get Message0, receiver:A

ConsumerB get Message1, receiver:B

ConsumerB get Message2, receiver:B

ConsumerA get Message3, receiver:A

ConsumerB get Message4, receiver:B

ConsumerB get Message5, receiver:B

ConsumerA get Message6, receiver:A

ConsumerB get Message7, receiver:B

ConsumerB get Message8, receiver:B

ConsumerA get Message9, receiver:A

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值