MS学习笔记(二)——使用JMS发送和接受text、Map、Object类型的消息

前一篇笔记记录了ActiveMQ的安装简介,这篇笔记主要记录如何使用JMS发送常见的三种消息,即text、Map、和Object类型的数据。JMS有两种方式进行消息通信:Point-to-Point (P2P) 和 Publish/Subscriber (PUB/SUB),即Queue消息和Topic类型的消息,在这个例子中我使用Point to Point的队列形式发送消息,关于两种消息类型的区别,在后边的笔记中我将根据我的理解进行记录。

1、product发送JMS消息

 

Java代码 

public class QueueSend {  
    public static void main(String[] args) throws JMSException {  
        ConnectionFactory connectionfactory = new ActiveMQConnectionFactory("tcp://localhost:61616");  
        //创建与JMS服务的连接:ConnectionFactory被管理的对象,由客户端创建,用来创建一个连接对象  
        Connection connection = connectionfactory.createConnection();//获取连接,connection一个到JMS系统提供者的活动连接  
        Session session =connection.createSession(false,Session.AUTO_ACKNOWLEDGE );//打开会话,一个单独的发送和接受消息的线程上下文  
        QueueSend qs = new QueueSend();  
          
        qs.sendTextMsg(session,"使用jms发送文本消息","queue.msgText");//发送文本类型的消息  
  
        MapMessage mapMsg = session.createMapMessage();  
        mapMsg.setString("name", "李寻欢1");  
        mapMsg.setBoolean("IsHero", true);  
        mapMsg.setInt("age", 35);  
        qs.sendMap(session, mapMsg, "queue.msgMap");//发送map类型的消息  
          
        Person person = new Person("阿飞", 23, "北京.大兴");//发送Object类型消息  
        qs.sendObj(session, person, "queue.msgObj");  
          
        session.close();  
        connection.close();  
    }  
    /* 
     * 发送文本消息 
     */  
    public void sendTextMsg(Session session,String MsgContent,String name) throws JMSException{  
        Queue queue = new ActiveMQQueue(name);  
        MessageProducer msgProducer = session.createProducer(queue);  
        Message msg = session.createTextMessage(MsgContent);  
        msgProducer.send(msg);  
        System.out.println("文本消息已发送");  
    }  
    /* 
     * 发送MAP类型消息 
     */  
    public void sendMap(Session session,MapMessage map,String name) throws JMSException{  
        Queue queue = new ActiveMQQueue(name);  
        MessageProducer msgProducer = session.createProducer(queue);  
        msgProducer.send(map);  
        System.out.println("Map格式的消息已发送");  
    }  
    /* 
     * 发送Object类型消息 
     */  
    public void sendObj(Session session,Object obj,String name) throws JMSException{  
        Destination  queue = new ActiveMQQueue(name);//分装消息的目的标示  
        MessageProducer msgProducer = session.createProducer(queue);  
        ObjectMessage objMsg=session.createObjectMessage((Serializable) obj);//发送对象时必须让该对象实现serializable接口  
        MessageProducer msgPorducer =session.createProducer(queue);  
        msgPorducer.send(objMsg);  
        System.out.println("Object类型的消息已发送");  
          
    }  
}  

 当消息发送成功时我们可以再web消息管理端看到产生了如下图所示的三条消息。


 2、consumer消费消息

 

接受jms消息代码 

public class QueueAccept implements MessageListener{  
    public static void main(String[] args) throws JMSException {  
        ConnectionFactory connectionfactory =null;  
        Connection connection=null;  
        Session session=null;  
        if(connectionfactory==null){  
            connectionfactory = new ActiveMQConnectionFactory("tcp://localhost:61616");  
        }  
        if(connection==null){  
         connection = connectionfactory.createConnection();  
            connection.start();  
         }  
         session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);  
  
        Queue queue = new ActiveMQQueue("queue.msgText");//根据发送的名称接受消息  
        MessageConsumer consumer = session.createConsumer(queue);  
        consumer.setMessageListener(new QueueAccept());//不继承MessageListener时可以用consumer.receive()手动接受消息  
          
        Queue queue1 = new ActiveMQQueue("queue.msgMap");  
        MessageConsumer consumer1 = session.createConsumer(queue1);  
        consumer1.setMessageListener(new QueueAccept());  
          
        Queue queue2 = new ActiveMQQueue("queue.msgObj");  
        MessageConsumer consumer2 = session.createConsumer(queue2);  
        consumer2.setMessageListener(new QueueAccept());  
    }  
      
    public void onMessage(Message message) {  
        /**  
         * 接受文本类型的消息   
         */  
        if(message instanceof TextMessage){ //instanceof 测试它所指向的对象是否是TextMessage类  
            TextMessage text = (TextMessage) message;  
            try {  
                System.out.println("发送的文本消息内容为:"+text.getText()); //接受文本消息   
            } catch (JMSException e) {  
                e.printStackTrace();  
            }  
        }  
        /**  
         * 接受Map类型的消息  
         */  
        if(message instanceof MapMessage){  
            MapMessage map = (MapMessage) message;  
            try {  
                System.out.println("姓名:"+map.getString("name"));  
                System.out.println("是否是英雄:"+map.getBoolean("IsHero"));  
                System.out.println("年龄:"+map.getInt("age"));  
            } catch (JMSException e) {  
                e.printStackTrace();  
            }  
        }  
        if(message instanceof ObjectMessage){  
            ObjectMessage objMsg = (ObjectMessage) message;  
            try {  
                Person person=(Person) objMsg.getObject();  
                System.out.println("用户名:"+person.getName()+"年龄:"+person.getAge()+"地址:"+person.getAddress());  
            } catch (JMSException e) {  
                e.printStackTrace();  
            }  
        }  
    }  

 客户端运行后接受到的消息:


   注意: 在上边的代码中,我们在发送Object对象时,我们发送的对象需要实现serializable接口。记得刚找工作的时候有一回有个面试官问到,为什么一个类要实现serializable接口,也许许多人新人都不知道为什么,只能按照背的面试题中的答案去说。刚好这个demo中遇到了这个问题,就继续复习一下java的基础吧。一个类只有实现了serializable才是可以序列化的,通俗的讲实现了serializable接口后我们将可以把这个类,在网络上进行发送,或者将这个类存入到硬盘,序列化的目的就是保存一个对象。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值