jms消息机制,包括点对点、发布/订阅模式

本文介绍了JMS(Java Message Service)的消息传递机制,涵盖点对点通信和发布/订阅模式。分别阐述了消息接收者和生产者在两种模式下的工作原理,详细解析了如何在点对点中实现一对一的消息传递,以及在发布/订阅模式下实现一对多的消息广播。
摘要由CSDN通过智能技术生成

一、消息接收者(点对点)

package recevers;


import Constants.Constant;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;


import javax.jms.*;


/**
 * jms消息接收者,点对点
 * Created with IntelliJ IDEA.
 * User: wxshi
 * Date: 15-3-6
 * Time: 下午4:58
 * To change this template use File | Settings | File Templates.
 */
public class QueueReceiver {


    private ConnectionFactory connectionFactory;    // ConnectionFactory :连接工厂,JMS 用它创建连接
    private Connection connection;     // Connection :JMS 客户端到JMS Provider 的连接
    private Session session;         // Session: 一个发送或接收消息的线程
    private Destination destination;       // Destination :消息的目的地;消息发送给谁.


    public QueueReceiver(){
        try{
            connectionFactory = new ActiveMQConnectionFactory(
                    ActiveMQConnection.DEFAULT_USER,
                    ActiveMQConnection.DEFAULT_PASSWORD, Constant.MQ_URL);
            connection = connectionFactory.createConnection();    // 构造从工厂得到连接对象
            session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);  // 获取会话
            destination = session.createQueue(Constant.QUEUE);
            connection.start();  // 启动
        }catch (Exception e){
            e.printStackTrace();
        }
    }


    //接收消息并处理
    public void receiveMsg(){
        try {
            MessageConsumer consumer = null;        // 消费者,消息接收者
            String msgSelecter = "JMSCorrelationID='5' AND msgName='消息5'";   //定义消息选择器
            consumer = session.createConsumer(destination,msgSelecter);   //使用消息选择器创建接收者


           while (true) {
                // 设置接收者接收消息的时间,为了便于测试,这里谁定为100s
               Message message = consumer.receive(100000);
                if (null != message) {
                    if(message instanceof TextMessage){
                        System.out.println("收到text消息:" + ((TextMessage) message).getText());
                    }else if(message instanceof StreamMessage){
                        System.out.println("收到stream消息名:" + message.getStringProperty("streamName"));
                        System.out.println("收到stream消息内容:" + message.getStringProperty("streamContent"));
                    }else if(message instanceof MapMessage){
                        System.out.println("收到map消息名:" + message.getStringProperty("mapName"));
                        System.out.println("收到map消息内容:" + message.getStringProperty("mapContent"));
                    }else if(message instanceof ObjectMessage){
                        System.out.println("收到object消息:" + ((ObjectMessage) message).getObject().toString());
                    }
                    System.out.println("准备回复确认...");
                    System.out.println("----------------------------");
                    MessageProducer sender = session.createProducer(message.getJMSReplyTo());
                    TextMessage reqMsg =  session.createTextMessage("消费者已经消费消息0");
                    reqMsg.setJMSCorrelationID(message.getStringProperty("uuid"));
                    sender.send(reqMsg);
                    sender.setTimeToLive(10000);
                    session.commit();
                }else {
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    //关闭链接
    public void exit(){
        try{
            if(connection!=null){
                connection.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {
        QueueReceiver queueReceiver = new QueueReceiver();
        queueReceiver.receiveMsg();
        queueReceiver.exit();
    }
}



二、消息生产者(点对点):

package senders;


import Constants.Constant;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;


import javax.jms.*;
import java.util.UUID;


/**
 * jms消息发送者,点对点
 * Created with IntelliJ IDEA.
 * User: wxshi
 * Date: 15-3-6
 * Time: 下午4:57
 * To change this template use File | Settings | File Templates.
 */
public class QueueSender {


    private ConnectionFactory connectionFactory;    // ConnectionFactory :连接工厂,JMS 用它创建连接
    private Connection connection = null;   //Provider 的连接 Connection :JMS 客户端到JMS
    private Session session;     // Session: 一个发送或接收消息的线程
    private Destination destination;   // Destination :消息的目的地;消息发送给谁.
    private String uuid ;
    private Destination destinationReq;     //消息确认队列


    public QueueSender(){
        try{
           // 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar
            connectionFactory = new ActiveMQConnectionFactory(
                    ActiveMQConnection.DEFAULT_USER,
                    ActiveMQConnection.DEFAULT_PASSWORD, Constant.MQ_URL);
            connection = connectionFactory.createConnection();   // 获取操作连接
            session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE); //创建jms会话
            destination = session.createQueue(Constant.QUEUE);    //创建消息队列,即消息目的地
            destinationReq = session.createQueue(Constant.RESPOMSE_QUEUE);
            connection.start(); // 启动
        }catch (Exception e){
            e.printStackTrace();
        }
    }


    //发送消息
    public void sendMessage(){
       try{
           MessageProducer producer = null;    // MessageProducer:消息发送者
           producer = session.createProducer(destination);       // 得到消息生成者【发送者】
           producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);  // 设置不持久化,此处学习,实际根据项目决定
           producer.setTimeToLive(10000);    //设置消息十秒后失效
           for (int i = 1; i <= Constant.SEND_NUMBER; i++) {
               Message message = null;
               uuid = UUID.randomUUID().toString();
               if(i==1){
                   message = session.createTextMessage("ActiveMq 发送的消息"+ i);


                   //以下两行是设置消息选择器
                   message.setJMSCorrelationID("1");
                   message.setStringProperty("msgName", "消息1");
                   System.out.println("发送text消息:" + "ActiveMq 发送的消息" + i);
               }else if(i==2){
                   message = session.createStreamMessage();
                   message.setStringProperty("streamName","streamMsg消息名"+i);
                   message.setStringProperty("streamContent","streamMsg消息内容"+i);
                   //以下两行是设置消息选择器
                   message.setJMSCorrelationID("2");
                   message.setStringProperty("msgName", "消息2");
                   System.out.println("发送stream消息:" + "ActiveMq 发送的消息" + i);
               }else if(i==3){
                   message = session.createObjectMessage();
                   ((ObjectMessage)message).setObject(new String("object消息内容"+i));
                   //以下两行是设置消息选择器
                   message.setJMSCorrelationID("3");
                   message.setStringProperty("msgName", "消息3");
                   System.out.println("发送object消息:" + "ActiveMq 发送的消息" + i);
               }else if(i==4){
                   message = session.createObjectMessage();
                   ((ObjectMessage)message).setObject(new String("object消息内容"+i));
                   //以下两行是设置消息选择器
                   message.setJMSCorrelationID("4");
                   message.setStringProperty("msgName", "消息4");
                   System.out.println("发送object消息:" + "ActiveMq 发送的消息" + i);
               }else{
                   message = session.createMapMessage();
                   message.setStringProperty("mapName","map消息"+i);
                   message.setStringProperty("mapContent","map消息内容"+i);
                   //以下两行是设置消息选择器
                   message.setJMSCorrelationID("5");
                   message.setStringProperty("msgName", "消息5");
                   System.out.println("发送map消息:" + "ActiveMq 发送的消息" + i);
               }
               message.setJMSReplyTo(destinationReq);
               message.setStringProperty("uuid",uuid);
               producer.send(message);  // 发送消息到目的地方
               session.commit();
               this.receiveReq();
              // String filter = "JMSCorrelationID = '"+message.getJMSMessageID()+"'";
           }
          // session.commit();
       }catch (Exception e){
           e.printStackTrace();
       }
    }


    //接收确认消息
    public void receiveReq(){
        try{
            while(true){
                String filter = "JMSCorrelationID = '"+uuid+"'";      //收到接收者1的确认消息
                MessageConsumer consumer = session.createConsumer(destinationReq,filter);
                TextMessage message = (TextMessage) consumer.receive(10000);
                if(message!=null){
                    System.out.println("收到消息确认:" + message.getText());
                    System.out.println("------------------");
                } else{
                    break;
                }
            }
        }catch (JMSException e){
            e.printStackTrace();
        }
    }
    //关闭链接
    public void exit(){
        try{
            if(connection!=null){
                connection.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }




    public static void main(String[] args) {
        QueueSender queueSender = new QueueSender();
        queueSender.sendMessage();
       // queueSender.receiveReq();
        queueSender.exit();
    }

}


三、消息接收者(订阅、发布):

package recevers;


import Constants.Constant;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;


import javax.jms.*;


/**
 * 持久订阅者,在没有开启的情况下,也不会漏掉消息
 * Created with IntelliJ IDEA.
 * User: wxshi
 * Date: 15-3-9
 * Time: 下午4:05
 * To change this template use File | Settings | File Templates.
 */
public class TopicRecever {


    private ConnectionFactory connectionFactory; // ConnectionFactory :连接工厂,JMS用它创建连接
    private Connection connection = null ;    // Connection :JMS客户端到JMS Provider的连接
    private Session session; // Session:一个发送或接收消息的线程
    private Topic topic; //主题


    public TopicRecever(){
          try {
              connectionFactory = new ActiveMQConnectionFactory(
                      ActiveMQConnection.DEFAULT_USER,
                      ActiveMQConnection.DEFAULT_PASSWORD,
                      Constant.MQ_URL);
              connection =connectionFactory.createConnection();   // 构造从工厂得到连接对象
              connection.setClientID("clientID0019");
              connection.start();   // 启动
              session = connection.createSession( false ,Session.AUTO_ACKNOWLEDGE);      // 获取session
              topic = session.createTopic(Constant.TOPIC);  // 获取操作连接主题  ,消费者从这里获取消息
          }catch (JMSException e){
              e.printStackTrace();
          }
    }


    //接收消息并处理
    public void receiveMessage(){
        try {
            MessageConsumer consumer = null;     // 消费者,消息接收者
            String msgSelecter = "JMSCorrelationID='1' AND msgName='消息1'";   //定义消息选择器
            consumer = session.createDurableSubscriber(topic, "MQ_sub19",msgSelecter,false);    // 得到消息生成者【发送者】
            while ( true ){
                // 设置接收者接收消息的时间,为了便于测试,这里谁定为100s
                Message message = consumer.receive(100000);
                if (null != message) {
                    if(message instanceof TextMessage){
                        System.out.println("收到text消息:" + ((TextMessage) message).getText());
                        System.out.println("----------------------------");
                    }else if(message instanceof StreamMessage){
                        System.out.println("收到stream消息名:" + message.getStringProperty("streamName"));
                        System.out.println("收到stream消息内容:" + message.getStringProperty("streamContent"));
                        System.out.println("----------------------------");
                    }else if(message instanceof MapMessage){
                        System.out.println("收到map消息名:" + message.getStringProperty("mapName"));
                        System.out.println("收到map消息内容:" + message.getStringProperty("mapContent"));
                        System.out.println("----------------------------");
                    }else if(message instanceof ObjectMessage){
                        System.out.println("收到object消息:" + ((ObjectMessage) message).getObject().toString());
                        System.out.println("----------------------------");
                    }
                } else break ;
            }
        }catch (JMSException e){
            e.printStackTrace();
        }


    }


    //关闭链接
    public void exit(){
        try{
            if(connection!=null){
                connection.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {
        TopicRecever topicRecever = new TopicRecever();
        topicRecever.receiveMessage();
        topicRecever.exit();
    }
}




四、消息生产者(订阅、发布):

package senders;


import Constants.Constant;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;


import javax.jms.*;


/**
 * jms消息服务:发布/订阅模式
 * Created with IntelliJ IDEA.
 * User: wxshi
 * Date: 15-3-9
 * Time: 下午4:04
 * To change this template use File | Settings | File Templates.
 */
public class TopicSender {


    private ConnectionFactory connectionFactory; // ConnectionFactory :连接工厂,JMS用它创建连接
    private Connection connection = null ;    // Connection :JMS客户端到JMS Provider的连接
    private Session session; // Session:一个发送或接收消息的线程
    private Topic topic; //主题


    public TopicSender(){
          try{
              connectionFactory = new ActiveMQConnectionFactory(
                      ActiveMQConnection.DEFAULT_USER,
                      ActiveMQConnection.DEFAULT_PASSWORD,
                      Constant.MQ_URL);
              connection = connectionFactory.createConnection();  //得到连接对象
              connection.start(); //启动
              //获取操作连接
              session = connection.createSession( false , Session.AUTO_ACKNOWLEDGE);
              topic = session.createTopic(Constant.TOPIC);    // 主题,消息目的地
          }catch (JMSException e){
              e.printStackTrace();
          }
    }


    //发送消息
    public void sendMessage(){
        try{
            MessageProducer producer = null;  //消息发送者
            producer = session.createProducer(topic);  // 得到消息生成者【发送者】
            producer.setDeliveryMode(DeliveryMode.PERSISTENT);  //设置持久化
            for ( int i= 1 ; i<=Constant.SEND_NUMBER; i++){
                Message message = null;
                if(i==1){
                    message = session.createTextMessage("ActiveMq 发送的消息"+ i);


                    //以下两行是设置消息选择器
                    message.setJMSCorrelationID("1");
                    message.setStringProperty("msgName", "消息1");
                    System.out.println("发送text消息:" + "ActiveMq 发送的消息" + i);
                }else if(i==2){
                    message = session.createStreamMessage();
                    message.setStringProperty("streamName","streamMsg消息名"+i);
                    message.setStringProperty("streamContent","streamMsg消息内容"+i);


                    //以下两行是设置消息选择器
                    message.setJMSCorrelationID("2");
                    message.setStringProperty("msgName", "消息2");
                    System.out.println("发送stream消息:" + "ActiveMq 发送的消息" + i);
                }else if(i==3){
                    message = session.createObjectMessage();
                    ((ObjectMessage)message).setObject(new String("object消息内容"+i));


                    //以下两行是设置消息选择器
                    message.setJMSCorrelationID("3");
                    message.setStringProperty("msgName", "消息3");
                    System.out.println("发送object消息:" + "ActiveMq 发送的消息" + i);
                }else{
                    message = session.createMapMessage();
                    message.setStringProperty("mapName","map消息"+i);
                    message.setStringProperty("mapContent","map消息内容"+i);


                    //以下两行是设置消息选择器
                    message.setJMSCorrelationID("4");
                    message.setStringProperty("msgName", "消息4");
                    System.out.println("发送map消息:" + "ActiveMq 发送的消息" + i);
                }
                producer.send(message);
            }
        }catch (JMSException e){
            e.printStackTrace();
        }
    }


    //关闭链接
    public void exit(){
        try{
            if(connection!=null){
                connection.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }




    public static void main(String[] args) {
        TopicSender topicSender = new TopicSender();
        topicSender.sendMessage();
        topicSender.exit();
    }


}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值