【Active入门-3】ActiveMQ学习-发布者与订阅者

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. }

来自为知笔记(Wiz)

附件列表

时间: 2024-08-30 07:08:17

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

【Active入门】ActiveMQ学习-1

基本概念: 接收者: package com.ll.activemq; import java.util.Collection; import java.util.Iterator; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.MapMessage; import javax.jms.MessageConsumer;

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

ActiveMQ学习笔记(四)http://my.oschina.net/xiaoxishan/blog/380446 中记录了如何使用原生的方式从ActiveMQ中收发消息.可以看出,每次收发消息都要写许多重复的代码,Spring 为我们提供了更为方便的方式,这就是Spring JMS.我们通过一个例子展开讲述.包括队列.主题消息的收发相关的Spring配置.代码.测试. 本例中,消息的收发都写在了一个工程里. 1.使用maven管理依赖包 <dependencies> <depend

&lt;ASP.NET4 从入门到精通&gt;学习笔记1

很久没有写东西了,今日有时间,开始整理一下关于ASP.NET 4的学习笔记,提醒自己,也欢迎评论. 概述一共分为6个大的部分,后续文章,将根据每个部分进行整理,本读书笔记只是整理关键点,对于啰嗦的内容一概省略. 第一部分,基础知识部分 我认为这个部分是这部书作为入门部分讲解比较深入和清楚地部分,对于ASP.NET,他的本质是web开发,不管是web form还是MVC,那么在进行web开发之前,首先就需要了解,为什么会出现ASP.NET,其实,在早期的时候,应该说是HTML和HTTP的天下,在计

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

在 Java 里有 JMS的多个实现.其中 apache 下的 ActiveMQ就是不错的选择. 用 ActiveMQ最好还是了解下 JMS JMS 公共 点对点域 发布/订阅域 ConnectionFactory QueueConnectionFactory TopicConnectionFactory Connection QueueConnection TopicConnection Destination Queue Topic Session QueueSession TopicSes

ActiveMQ学习总结

一.消息中间件的产生的背景 1.在网络通讯中,Http请求默认采用同步请求方式,基于请求与响应模式 2.在客户端与服务器进行通讯时,客户端调用服务端接口后,必须等待服务端完成处理后返回结果给客户端才能继续执行,这种情况属于同步调用方式. 3.如果服务器端发生网络延迟.不可达的情况,可能客户端也会受到影响. 二.什么是消息中间件 消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构. 目前使用较多的消息队列有ActiveMQ

&lt;ASP.NET4 从入门到精通&gt;学习笔记3

第三部分,状态管理与缓存 何为状态管理,起始对于web而言,经过前面章节的讲解,已经理解,对于web程序,就是一个无状态的程序,每次的请求与每次的响应,两者之间本身就是独立存在的,这一点对于早期的静态网页来说,倒没什么,因为每次的请求和响应其实都是固定不变的.但是到了动态网页时代,就不行了,web开发的很大一部分工作将变为状态管理.这一点,可能举一个例子,最具有代表性,比如说购物车,那么对于购物车而言,就需要知道他的访问者是谁?虽然他们可以在不同的页面切换,但是购物车不能够变化,此时就是一种状态

linux入门-第一周学习笔记

Linux新手入门-第一周学习笔记 一.安装系统注意的问题 1.磁盘分区: 以分配给系统200G内存大小为例: (1)给 /boot 200M大小即可,由于/boot 仅存放内核相关启动文件.不需要给太大的分区. (2)给 / 50G大小,根用户下要存放很多的文件. (3)给/testdir 50G大小,这是我们做实验用到的文件. (4)给swap 4G大小,由于swap是交换分区,其大小推荐是内存的1.5倍~2.0倍 注意:CentOS6.8的文件系统为ext4,而CentOS7.2的文件系统

MongoDB索引(一) --- 入门篇:学习使用MongoDB数据库索引

这个系列文章会分为两篇来写: 第一篇:入门篇,学习使用MongoDB数据库索引 第二篇:进阶篇,研究数据库索引原理--B/B+树的基本原理 1. 准备工作 在学习使用MongoDB数据库索引之前,有一些准备工作要做,之后的探索都是基于这些准备工作. 首先需要建立一个数据库和一些集合,这里我就选用一个国内手机号归属地的库,大约32W条记录,数据量不大,不过做一些基本的分析是够了. 首先我们建立一个数据库,叫做db_phone,然后导入测试数据.测试数据就是一些手机号归属地的信息.单个文档长这个样子

WF从入门到精通学习目录

WF从入门到精通(第一章):WF简介 WF从入门到精通(第二章):workflow运行时 WF从入门到精通(第三章):workflow实例 WF从入门到精通(第四章):活动及workflow类型介绍 WF从入门到精通(第五章):workflow跟踪 WF从入门到精通(第六章):加载和卸载实例 WF从入门到精通(第七章):基本活动的操作 WF从入门到精通(第八章):调用外部方法及工作流(一) WF从入门到精通(第八章):调用外部方法及工作流(二) WF从入门到精通(第九章):逻辑流活动 WF从入门