• 【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:运行结束... ");
    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. }







    附件列表

    • 相关阅读:
      身份证号验证
      QML学习笔记(七)— 实现可拖拽、编辑、选中的ListView
      通过WebChannel/WebSockets与QML中的HTML交互
      OpenLayers学习笔记(七)— 类似比例尺的距离环(一)
      OpenLayers学习笔记(六)— 拖拽叠加层overlayer
      OpenLayers学习笔记(五)— 拖拽Feature图层
      QML学习笔记(六)- 简单计时器和定时器
      QML学习笔记(五)— 做一个简单的待做事项列表
      OpenLayers学习笔记(四)— QML显示html中openlayers地图的坐标
      OpenLayers学习笔记(三)— QML与HTML通信之 地图上点击添加自由文本
    • 原文地址:https://www.cnblogs.com/ssslinppp/p/4462195.html
    Copyright © 2020-2023  润新知