JMS学习笔记(二)——使用JMS发送和接受text、Map、Object类型的消息_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > JMS学习笔记(二)——使用JMS发送和接受text、Map、Object类型的消息

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

 2013/8/2 19:08:56  西北小强  程序员俱乐部  我要评论(0)
  • 摘要:前一篇笔记记录了ActiveMQ的安装简介,这篇笔记主要记录如何使用JMS发送常见的三种消息,即text、Map、和Object类型的数据。JMS有两种方式进行消息通信:Point-to-Point(P2P)和Publish/Subscriber(PUB/SUB),即Queue消息和Topic类型的消息,在这个例子中我使用PointtoPoint的队列形式发送消息,关于两种消息类型的区别,在后边的笔记中我将根据我的理解进行记录。1
  • 标签:笔记 学习 使用 Map 学习笔记

前一篇笔记记录了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接口后我们将可以把这个类,在网络上进行发送,或者将这个类存入到硬盘,序列化的目的就是保存一个对象。

  • 大小: 138.8 KB
  • 大小: 15.7 KB
  • 查看图片附件
发表评论
用户名: 匿名