2015年4月28日

1个发布者,1个订阅者,topic

方式1:
先发布消息:

然后订阅消息:


方式2:
先订阅消息:

然后发布消息:

订阅者如下:

结论1:
从上面可以看出,消息发布需要在线发布。



1个发布者,2个订阅者,topic

方式1:
先发布消息:
然后开启两个订阅者

方式2:
先开启两个订阅者:

然后发布消息:

看到订阅者如下:


方式3:
先发布消息,发布完消息后,让发布者休眠10s,然后退出:
此时开启订阅者:

直到发布者程序退出:

订阅者也没有订阅到任何消息

方式4:

上图中,消息1发布完成后,打开订阅者1和订阅者2,紧接着发布者又发布消息2;
在发布者发送消息3之前,订阅者1和订阅者2运行结束。


结论:
1.  在线发布消息:
        订阅者能订阅到消息的条件是:
        1.1  订阅者程序先运行,即在发布者程序发布消息时,订阅者程序处于运行状态(在线状态);
        1.2  由方式3可以看到,发布者程序处于运行状态,并不代表发布者程序处于发布消息状态;
2. 发布者发布的消息,可以被所有订阅者订阅,且所有订阅者不存在竞争关系。




参考程序:需要略作修改,以实现上面提到的方式1.方式2....

订阅者程序:2015年4月28日 9:57:40

  1. package com.ll.activemq;
  2. import java.util.Collection;
  3. import java.util.Iterator;
  4. import javax.jms.Connection;
  5. import javax.jms.ConnectionFactory;
  6. import javax.jms.Destination;
  7. import javax.jms.MapMessage;
  8. import javax.jms.MessageConsumer;
  9. import javax.jms.Session;
  10. import javax.jms.TextMessage;
  11. import org.apache.activemq.ActiveMQConnection;
  12. import org.apache.activemq.ActiveMQConnectionFactory;
  13. public class Receiver {
  14. public static void main(String[] args) {
  15. // ConnectionFactory :连接工厂,JMS 用它创建连接
  16. ConnectionFactory connectionFactory;
  17. // Connection :JMS 客户端到JMS Provider 的连接
  18. Connection connection = null;
  19. // Session: 一个发送或接收消息的线程
  20. Session session;
  21. // Destination :消息的目的地;消息发送给谁.
  22. Destination destination;
  23. // 消费者,消息接收者
  24. MessageConsumer consumer;
  25. connectionFactory = new ActiveMQConnectionFactory(
  26. ActiveMQConnection.DEFAULT_USER,
  27. ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
  28. try {
  29. // 构造从工厂得到连接对象
  30. connection = connectionFactory.createConnection();
  31. // 启动
  32. connection.start();
  33. // 获取操作连接
  34. session = connection.createSession(Boolean.FALSE,
  35. Session.AUTO_ACKNOWLEDGE);
  36. // 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置
  37. destination = session.createTopic("FirstTop");
  38. consumer = session.createConsumer(destination);
  39. // consumer2 = session.createConsumer(destination);
  40. System.out.println("订阅者1:消费者程序开始运行...");
  41. while (true) {
  42. // 设置接收者接收消息的时间,为了便于测试,这里谁定为100s
  43. TextMessage message = (TextMessage) consumer.receive(8000);
  44. // Object message = (Object) consumer.receive(28000);
  45. if (null != message) {
  46. System.out.println("订阅者1:收到消息-->" + message.getText());
  47. } else {
  48. System.out.println("订阅者1:运行结束...\n");
  49. break;
  50. }
  51. }
  52. } catch (Exception e) {
  53. e.printStackTrace();
  54. } finally {
  55. try {
  56. if (null != connection)
  57. connection.close();
  58. } catch (Throwable ignore) {
  59. }
  60. }
  61. }
  62. }

发布者程序:

  1. package com.ll.activemq;
  2. import javax.jms.Connection;
  3. import javax.jms.ConnectionFactory;
  4. import javax.jms.DeliveryMode;
  5. import javax.jms.Destination;
  6. import javax.jms.MessageProducer;
  7. import javax.jms.Session;
  8. import javax.jms.TextMessage;
  9. import org.apache.activemq.ActiveMQConnection;
  10. import org.apache.activemq.ActiveMQConnectionFactory;
  11. public class Sender {
  12. private static final int SEND_NUMBER = 5;
  13. public static void main(String[] args) {
  14. // ConnectionFactory :连接工厂,JMS 用它创建连接
  15. ConnectionFactory connectionFactory;
  16. // Connection :JMS 客户端到JMS Provider 的连接
  17. Connection connection = null;
  18. // Session: 一个发送或接收消息的线程
  19. Session session;
  20. // Destination :消息的目的地;消息发送给谁.
  21. Destination destination;
  22. // MessageProducer:消息发送者
  23. MessageProducer producer;
  24. // TextMessage message;
  25. // 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar
  26. connectionFactory = new ActiveMQConnectionFactory(
  27. ActiveMQConnection.DEFAULT_USER,
  28. ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
  29. try {
  30. // 构造从工厂得到连接对象
  31. connection = connectionFactory.createConnection();
  32. // 启动
  33. connection.start();
  34. // 获取操作连接
  35. session = connection.createSession(Boolean.TRUE,
  36. Session.AUTO_ACKNOWLEDGE);
  37. // 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置
  38. destination = session.createTopic("FirstTop");
  39. // 得到消息生成者【发送者】
  40. producer = session.createProducer(destination);
  41. // 设置不持久化,此处学习,实际根据项目决定
  42. producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
  43. // 构造消息,此处写死,项目就是参数,或者方法获取
  44. sendMessage(session, producer);
  45. // session.commit();
  46. System.out.println("发布者程序退出...");
  47. } catch (Exception e) {
  48. e.printStackTrace();
  49. } finally {
  50. try {
  51. if (null != connection)
  52. connection.close();
  53. } catch (Throwable ignore) {
  54. }
  55. }
  56. }
  57. public static void sendMessage(Session session, MessageProducer producer)
  58. throws Exception {
  59. for (int i = 1; i <= SEND_NUMBER; i++) {
  60. TextMessage message = session.createTextMessage("ActiveMq 发布的消息"
  61. + i);
  62. // 发送消息到目的地方
  63. System.out.println("发布消息:" + "ActiveMq 发布的消息" + i);
  64. producer.send(message);
  65. session.commit();
  66. Thread.sleep(10000);
  67. }
  68. }
  69. }



附件列表

【Active入门-3】ActiveMQ学习-发布者与订阅者的更多相关文章

  1. 【Active入门】ActiveMQ学习-1

    基本概念: 接收者: package com.ll.activemq; import java.util.Collection; import java.util.Iterator; import j ...

  2. ActiveMQ的发布者/订阅者模型示例

    ActiveMQ的发布者/订阅者模型入门示例 (1)下载安装activemq,启动activeMQ. 详细步骤参考博客:http://www.cnblogs.com/DFX339/p/9050878. ...

  3. ROS2学习之旅(14)——编写简单的发布者和订阅者(C++)

    节点是通过ROS Graph进行通信的可执行进程.在本文中,节点将通过话题以字符串消息的形式相互传递信息.这里使用的例子是一个简单的"talker"和"listener& ...

  4. Java消息中间件入门笔记 - ActiveMQ篇

    入门 消息中间件带来的好处: 1)解耦:系统解耦 2)异步:异步执行 3)横向扩展 4)安全可靠 5)顺序保证 栗子: 通过服务调用让其它系统感知事件发生 系统之间高耦合 程序执行效率低 通过消息中间 ...

  5. ActiveMQ学习笔记(5)——使用Spring JMS收发消息

      摘要 ActiveMQ学习笔记(四)http://my.oschina.net/xiaoxishan/blog/380446 中记录了如何使用原生的方式从ActiveMQ中收发消息.可以看出,每次 ...

  6. ActiveMQ学习教程/1.简要介绍与安装

    ActiveMQ学习教程(一)——简要介绍与安装 一.名词: 1.JMS:即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的 ...

  7. ActiveMQ学习(四)——应用程序接口

    在 Java 里有 JMS的多个实现.其中 apache 下的 ActiveMQ就是不错的选择. 用 ActiveMQ最好还是了解下 JMS JMS 公共 点对点域 发布/订阅域 Connection ...

  8. 【ActiveMQ】Spring Jms集成ActiveMQ学习记录

    Spring Jms集成ActiveMQ学习记录. 引入依赖包 无论生产者还是消费者均引入这些包: <properties> <spring.version>3.0.5.REL ...

  9. ActiveMQ学习总结

    一.消息中间件的产生的背景 1.在网络通讯中,Http请求默认采用同步请求方式,基于请求与响应模式 2.在客户端与服务器进行通讯时,客户端调用服务端接口后,必须等待服务端完成处理后返回结果给客户端才能 ...

随机推荐

  1. Java——object类

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  2. JProfiler性能分析

    之前已经介绍过如何调试本地的JBoss.现在额外一篇文章关于如何远程调试Tomcat的,其实远程和本地的区别不大,主要区别只是,JProfiler的GUI运行在你本地,而JProfiler的Agent ...

  3. ora-01830:日期格式图片在转换整个输入字符串之前结束

    在to_date的时候因为 fldsj这个字段的大小 与 ‘yyyy-MM-dd’不符合 所以需要截取下fldsj字段的大小  to_char(to_date(substr(fldsj,1,10),' ...

  4. bg-script 错误信息显示,以及global

    chrome.developerPrivate.openDevTools({ renderViewId: -1, renderProcessId: -1, extensionId: chrome.ru ...

  5. 空格填充器(alignBySpace)

    /******************************************************************* * 空格填充器(alignBySpace) * 声明: * 1 ...

  6. python3 获取当前调用函数名

    import sys funcName = sys._getframe().f_back.f_code.co_name #获取调用函数名lineNumber = sys._getframe().f_b ...

  7. ZZNU 2125:A + B 普拉斯(傻逼题+大数加法)

    2125: A + B 普拉斯 时间限制: 1 Sec  内存限制: 128 MB 提交: 94  解决: 28 [提交] [状态] [讨论版] [命题人:admin] 题目描述 "别人总说 ...

  8. HDU 4619 Warm up 2 贪心或者二分图匹配

    给同一张横着的牌的所在的格子编同一样的号,这些格子对应x集合,给同一张竖着的牌所在的格子编同一样的号,对应y集合,同一个格子上既有横着的牌又有竖着的牌,那么就建一条边,有冲突就要拿走一张,结果是总的牌 ...

  9. 从dfs向动态规划过渡

    据说每一个dfs,都能用动态规划思想做出来. 首先要明白dfs与动态规划的一些小要点   1)dfs重在通过使用递归来使用不同的选择,通过使用形参的改变实现不同情景的改变(形参既包括了代价,又包含了结 ...

  10. Restrictions用法

    HQL运算符 QBC运算符 含义 = Restrictions.eq() 等于equal <>  Restrictions.ne() 不等于not equal >  Restrict ...