PTP模式下,异步接收消息需要定义一个MessageListener来监听,当生产者有消息要发送时会主动通知Listener去处理该消息,会调用监听的onMessage方法去处理。

首先看生产者(和同步接收时没有任何区别):

  1. package com.thunisoft.jms.mine;
  2.  
  3. import java.util.HashMap;
  4.  
  5. import javax.jms.Connection;
  6. import javax.jms.ConnectionFactory;
  7. import javax.jms.DeliveryMode;
  8. import javax.jms.Destination;
  9. import javax.jms.MessageProducer;
  10. import javax.jms.ObjectMessage;
  11. import javax.jms.Session;
  12.  
  13. import org.apache.activemq.ActiveMQConnection;
  14. import org.apache.activemq.ActiveMQConnectionFactory;
  15.  
  16. /**
  17. * JMS生产者
  18. *
  19. * @author zhangxsh
  20. *
  21. */
  22. public class Producer {
  23.  
  24. /**
  25. * @param args
  26. */
  27. public static void main(String[] args) {
  28. ConnectionFactory connectionFactory;
  29. Connection connection = null;
  30. Session session;
  31. Destination destination;
  32. MessageProducer producer;
  33. connectionFactory = new ActiveMQConnectionFactory(
  34. ActiveMQConnection.DEFAULT_USER,
  35. ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
  36. try {
  37. // 通过连接工厂创建连接
  38. connection = connectionFactory.createConnection();
  39. // 启动连接
  40. connection.start();
  41. // 通过连接打开一个会话
  42. session = connection.createSession(Boolean.TRUE,
  43. Session.AUTO_ACKNOWLEDGE);
  44. // 根据特定的队列名称创建一个目标地
  45. destination = session.createQueue("TestQueue");
  46. // 根据目标地创建一个生产者
  47. producer = session.createProducer(destination);
  48. // 不需要持久化的投递模式
  49. producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
  50. for (int i = 1; i <= 10; i++) {
  51. ObjectMessage message = session.createObjectMessage();
  52. HashMap m = new HashMap();
  53. m.put("key" + i, i);
  54. message.setObject(m);
  55. // 发送消息到目的地方
  56. System.out.println("发送消息:" + "ActiveMq 发送的消息" + i);
  57. producer.send(message);
  58. }
  59. session.commit();
  60. } catch (Exception e) {
  61. e.printStackTrace();
  62. } finally {
  63. try {
  64. if (null != connection)
  65. connection.close();
  66. } catch (Throwable ignore) {
  67. }
  68. }
  69. }
  70. }

下面是消费者异步接收代码:

  1. package com.thunisoft.jms.mine;
  2.  
  3. import javax.jms.Connection;
  4. import javax.jms.ConnectionFactory;
  5. import javax.jms.Destination;
  6. import javax.jms.JMSException;
  7. import javax.jms.Message;
  8. import javax.jms.MessageConsumer;
  9. import javax.jms.MessageListener;
  10. import javax.jms.ObjectMessage;
  11. import javax.jms.Session;
  12. import javax.jms.Topic;
  13.  
  14. import org.apache.activemq.ActiveMQConnection;
  15. import org.apache.activemq.ActiveMQConnectionFactory;
  16.  
  17. public class ConsumeListener {
  18.  
  19. /**
  20. * @param args
  21. * @throws Exception
  22. */
  23. public static void main(String[] args) throws Exception {
  24. ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
  25. ActiveMQConnection.DEFAULT_USER,
  26. ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
  27. Connection connection = connectionFactory.createConnection();
  28. Session session = connection.createSession(Boolean.FALSE,
  29. Session.AUTO_ACKNOWLEDGE);
  30. connection.start();
  31. Destination destination = session.createQueue("TestQueue");
  32. MessageConsumer consumer = session.createConsumer(destination);
  33.  
  34. //定义一个MessageListener用于通知有消息到来
  35. consumer.setMessageListener(new MessageListener() {
  36. @Override
  37. public void onMessage(Message message) {
  38. // System.out.println("message");
  39. if (message instanceof ObjectMessage)
  40. try {
  41. System.out.println("收到消息"
  42. + ((ObjectMessage) message).getObject());
  43. // session.commit();
  44. } catch (JMSException e) {
  45. // TODO Auto-generated catch block
  46. e.printStackTrace();
  47. }
  48.  
  49. }
  50. });
  51. // consumer.receive();
  52.  
  53. }
  54.  
  55. }

【原创】JMS生产者和消费者【PTP异步接收消息】的更多相关文章

  1. 【原创】JMS发布者订阅者【异步接收消息】

    发布订阅模式和PTP方式不同之处为后者依赖于一个Topic话题: package com.thunisoft.jms.mine.topic; import java.util.HashMap; imp ...

  2. 【原创】JMS生产者和消费者【PTP同步接收消息】

    一般步骤: 请求一个JMS连接工i厂. 是用连接工厂创建连接. 启动JMS连接. 通过连接创建session. 获取一个目标. 创建一个生产者,或a.创建一个生产者,b.创建一条JMS消息并发送到目标 ...

  3. 【ActiveMQ入门-10】ActiveMQ学习-通配符+异步接收

    通配符介绍: 一般情况下,我们使用层次结构的方式来组织队列,比如A.B.C.D,这样便于归类和管理.  我们也可以使用通配符来配置或是操作多个队列.  通配符有三个: .  用来分隔路径: * 用来匹 ...

  4. 利用反射快速给Model实体赋值 使用 Task 简化异步编程 Guid ToString 格式知多少?(GUID 格式) Parallel Programming-实现并行操作的流水线(生产者、消费者) c# 无损高质量压缩图片代码 8种主要排序算法的C#实现 (一) 8种主要排序算法的C#实现 (二)

    试想这样一个业务需求:有一张合同表,由于合同涉及内容比较多所以此表比较庞大,大概有120多个字段.现在合同每一次变更时都需要对合同原始信息进行归档一次,版本号依次递增.那么我们就要新建一张合同历史表, ...

  5. [原创]如何编写多个阻塞队列连接下的多生产者多消费者的Python程序

    平常在写程序时,往往会遇到一个需求:在程序的多个阶段都会出现阻塞的可能,因此,这多个阶段就需要并发执行. Python的多线程有一个特点,就是不允许从外部结束一个运行中的线程,这给我们编写代码时带来了 ...

  6. JMS开发(二):深入PTP,Pub-Sub两种模式

    1.PTP模型 PTP(Point-to-Point)模型是基于队列(Queue)的,对于PTP消息模型而言,它的消息目的是一个消息队列(Queue),消息生产者每次发送消息总是把消息送入消息队列中, ...

  7. 【ActiveMQ入门-4】ActiveMQ学习-异步接收

    总体说明: 1. 一个生产者/发布者:可以向多个目的地发送消息: 2. 每个目的地(destination)可以有多个订阅者或消费者: 如下图所示: 程序结构: 1. Publisher.java   ...

  8. 0032ActiveMQ之java编码实现生产者和消费者操作队列queue

    今天学习了入门级的用java编写生产者producer和消费者consumer操作activemq的queue队列,为了之后复习回顾,现做整理如下: maven工程的搭建此处不再讲解,在maven工程 ...

  9. Springboot+ActiveMQ(ActiveMQ消息持久化,保证JMS的可靠性,消费者幂等性)

    ActiveMQ 持久化设置: 在redis中提供了两种持久化机制:RDB和AOF 两种持久化方式,避免redis宕机以后,能数据恢复,所以持久化的功能 对高可用程序来说 很重要. 同样在Active ...

随机推荐

  1. WPF常用资源

    Textbox error template<Style x:Key="ControlBaseStyle" TargetType="{x:Type Control} ...

  2. Android设计模式——工厂方法模式

    1.定义:工厂方法模式就是定义一个用于创建对象的接口,让子类决定实例化哪个类. 2.看代码: 产品抽象类 public abstract class Product { /** * 产品类抽象方法 * ...

  3. 转:Hibernate中Criteria和DetachedCriteria的完整用法

    原文地址:http://blog.sina.com.cn/s/blog_667528fd0100rkrf.html 设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装.现在对 H ...

  4. 备份和恢复ZBrush文件

    ZBrush可以自动保存绘图的备份副本,并在发生系统错误时提醒您恢复备份副本.当ZBrush软件遇到崩溃.导致错误.非正常退出的时候,可能之前所做的努力就会功亏一篑,那么,在ZBrush软件中能否将文 ...

  5. poj1050查找最大子矩阵和

    题目: To the Max   Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 48507   Accepted: 2566 ...

  6. java开发移动端之spring的restful风格定义

    https://www.ibm.com/developerworks/cn/web/wa-spring3webserv/index.html

  7. 路飞学城Python-Day19(practise)

    # 特性1.继承:2.多态:3.封装 # 1.继承的用处:通过继承就可以解决类与类之间的代码冗余关系 # 2.多态的用处:1.增加了程序的灵活性,以不变应万变,使用者都是同一种形式去调用(func(a ...

  8. Flex tree展开节点问题!

    问题: 使用 for each(var item:XML in menuTree.dataProvider) {     menuTree.expandChildrenOf(item,true);   ...

  9. ajax常用知识

     同源地址:任意两个地址中的协议,域名,端口相同,称为同源地址 同源策略:  是浏览器的一种基本安全策略                       不允许对非同源地址进行请求(ajax)       ...

  10. python--(爬虫-re模块)

    python--(爬虫-re模块) re模块四大核心功能: 1.findall 查找所有,返回list import re lst = re.findall("m", " ...