1个生产者,1个消费者,使用Queue:

方式1:
生产者将消息发送到Queue中,退出;
然后运行消费者:
可以看到,可以接收到消息。

方式2:
先运行消费者程序:
然后运行生产者:
消费者见下图:

1个生产者,2个消费者,使用Queue

先运行消费者1:
在运行消费者2:
接下来运行生产者:
下面是消费者消费情况:
总结:
1. 使用Queue时,生产者只要将Message发送到MQ服务器端,消费者就可以进行消费,而无需生产者程序一直运行;
2. 消息是按照先入先出的顺序,一旦有消费者将Message消费,该Message就会从MQ服务器队列中删去;
3. 有文章说,“生产者”<-->"消费者"是一对一的关系,其实并不准确,从上面可以看出,一个生产者产生的消息,可以被
多个消费者进行消费,只不过多个消费者在消费消息时是竞争的关系,先得到的先消费,一旦消费完成,该消息就会出队列,
就不能被其他消费者再消费了,即“一次性消费”。

特点:
1.“离线一次性消费”;
离线:指生产者在发送消息时,不需要消费者在线,生产者只需要将消息发送到MQ队列中,消费者可以稍后上线取消息;
一次性消费:指消费者之间存在竞争关系,任何一个消费者将消息消费掉之后,其他消费者都不能再进行消费;
若是只有1个生产者和1个消费者,就是我们熟悉的“点对点”通信了;

类似场景对比:
类似送快递,快递员(producer)将快递(Message)放到指定地点(destination)后,就可以离开了,
拿快递的人(customer)在接收到通知后,到指定地点(destination)去取快递(Message)就可以了。
当然,取快递时可能要进行身份验证,这就涉及到创建连接(connection)时,需要指定用户名和密码了。
还有就是,实际生活中,当快递员把快递放好之后,照理说应该通知客户去哪里取快递,而ActiveMq帮我们
做好了一切,通知的工作Activemq会帮我们实现,而无需我们亲自编码通知消费者,生产者只需要将Message
放到Mq中即可,通知消费者的工作,mq会帮我们处理。


消费者程序:


  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.createQueue("FirstQueue");
  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(18000);
  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,
  29. "tcp://localhost:61616");
  30. try {
  31. // 构造从工厂得到连接对象
  32. connection = connectionFactory.createConnection();
  33. // 启动
  34. connection.start();
  35. // 获取操作连接
  36. session = connection.createSession(Boolean.TRUE,
  37. Session.AUTO_ACKNOWLEDGE);
  38. // 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置
  39. destination = session.createQueue("FirstQueue");
  40. // 得到消息生成者【发送者】
  41. producer = session.createProducer(destination);
  42. // 设置不持久化,此处学习,实际根据项目决定
  43. producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
  44. // 构造消息,此处写死,项目就是参数,或者方法获取
  45. sendMessage(session, producer);
  46. session.commit();
  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
  61. .createTextMessage("ActiveMq 发送的消息" + i);
  62. // 发送消息到目的地方
  63. System.out.println("发送消息:" + "ActiveMq 发送的消息" + i);
  64. producer.send(message);
  65. }
  66. System.out.println("生产者程序退出...");
  67. }
  68. }


附件列表

【Active入门-2】ActiveMQ学习-生产者与消费者的更多相关文章

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

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

  2. ActiveMQ生产者和消费者优化策略

    一.生产者优化策略  默认情况下,ActiveMQ服务端认为生产者端发送的是PERSISTENT Message.所以如果要发送NON_PERSISTENT Message,那么生产者端就要明确指定. ...

  3. 消息中间件——RabbitMQ(五)快速入门生产者与消费者,SpringBoot整合RabbitMQ!

    前言 本章我们来一次快速入门RabbitMQ--生产者与消费者.需要构建一个生产端与消费端的模型.什么意思呢?我们的生产者发送一条消息,投递到RabbitMQ集群也就是Broker. 我们的消费端进行 ...

  4. Dubbo入门到精通学习笔记(十四):ActiveMQ集群的安装、配置、高可用测试,ActiveMQ高可用+负载均衡集群的安装、配置、高可用测试

    文章目录 ActiveMQ 高可用集群安装.配置.高可用测试( ZooKeeper + LevelDB) ActiveMQ高可用+负载均衡集群的安装.配置.高可用测试 准备 正式开始 ActiveMQ ...

  5. Android(java)学习笔记71:生产者和消费者之等待唤醒机制

    1. 首先我们根据梳理我们之前Android(java)学习笔记70中关于生产者和消费者程序思路: 2. 下面我们就要重点介绍这个等待唤醒机制: (1)第一步:还是先通过代码体现出等待唤醒机制 pac ...

  6. 【ActiveMQ入门-11】ActiveMQ学习-compositeDestination

    概要: 前一章讲解了消费者如何通过通配符来匹配目的地,以实现一个消费者同时接收多个目的地的消息. 对于生产者来讲,可能存在下面的需求: 1. 同一条message可能要发送到多个Queue: 2. 同 ...

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

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

  8. Android(java)学习笔记11:生产者和消费者之等待唤醒机制

    1. 首先我们根据梳理我们之前Android(java)学习笔记70中,关于生产者和消费者程序思路: 2. 下面我们就要重点介绍这个等待唤醒机制: (1)第一步:还是先通过代码体现出等待唤醒机制 下面 ...

  9. 生产者与消费者以及ActiveMQ

    生产者与消费者以及ActiveMQ 一. 多线程实现生产者与消费者 1.1 生产者与消费者头文件 #pragma once #include <iostream> #include < ...

随机推荐

  1. Mysql 存储过程-转载

    存储过程简介 SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储 ...

  2. python关于时间的计算,time模块

    import time, datetime # time.time 返回当前时间的时间戳(1970纪元后经过的浮点秒数)(格林尼治时间). # 1分钟60秒,1小时3600秒,1天86400秒. pr ...

  3. STL标准库-一个万用的hash function

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 在前面我介绍过hash的使用,本次主要介绍一下Hash Function Hash Function即获得hash code的函 ...

  4. pip删除依赖、配置虚拟环境

    问题:跑openpose代码的时候,出现问题 tensorpack 0.8.6 requires tqdm>4.11.1, which is not installed.tf-pose 0.1. ...

  5. windows server 账号克隆

    在dos命令行下隐藏用户的方法:   net user 账户 密码 /add 如果在账号后加 $ 符号 这个账户在cmd命令行下是无法看见的 首先我们设置注册表权限 cmd = > regedt ...

  6. Code Igniter数据库操作函数大全

    查询 $query = $this->db_query("SELECT * FROM table"); ==================================* ...

  7. Linux文件IO与通用块层的请求合并

    本文参考https://mp.weixin.qq.com/s/Imt4BW-zoHPpcOpcKZs_AQ, 公众号“Linux阅码场” 请求合并就是将进程内或者进程间产生的在物理地址上连续的多个IO ...

  8. magento如何在首页显示产品

    1.首先现在magento后台创建一个新的分类,记下这个分类的 ID 号码.使用这个新建的分类来管理你的首页产品,这个分类设置为前台不可见.这样就不会显示在你的分类菜单中了,但使用代码调用的时候却会显 ...

  9. C#反射 字符串转为实体类,并做为参数传入泛型方法中使用

    工作中有这样一个需求,有N张不同的报表,每张报表对应一个数据源,统计数据采用内存方式,首先在内在里定义了数据源对应实体.统计条件用lamdba表达式式实现,通过工具对单元格进行定义.在实现过程中针对每 ...

  10. win8转win7+真正解决 “安装程序无法定位现有系统分区,也无法创建新的系统分区”的方法

    问题情况:win8电脑转win7系统,出现问题:“安装程序无法定位现有系统分区,也无法创建新的系统分区”   第一种:猜测可行的方法: 1.老毛桃U盘启动电脑,进入PE系统后,直接使用Diskgeni ...