前一篇笔记记录了ActiveMQ的安装简介,这篇笔记主要记录如何使用JMS发送常见的三种消息,即text、Map、和Object类型的数据。JMS有两种方式进行消息通信:Point-to-Point (P2P)?和?Publish/Subscriber (PUB/SUB),即Queue消息和Topic类型的消息,在这个例子中我使用Point to Point的队列形式发送消息,关于两种消息类型的区别,在后边的笔记中我将根据我的理解进行记录。
1、product发送JMS消息
?
class="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消费消息
?
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接口后我们将可以把这个类,在网络上进行发送,或者将这个类存入到硬盘,序列化的目的就是保存一个对象。