0032ActiveMQ之java编码实现生产者和消费者操作队列queue
今天学习了入门级的用java编写生产者producer和消费者consumer操作activemq的queue队列,为了之后复习回顾,现做整理如下:
maven工程的搭建此处不再讲解,在maven工程已搭建好的前提下进行如下步骤:
1、 pom.xml中引入activemq所需的两个jar包
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.9</version>
</dependency>
<dependency>
<groupId>org.apache.xbean</groupId>
<artifactId>xbean-spring</artifactId>
<version>3.16</version>
</dependency>
2、 JMS编码总体架构

3、生产者编码如下:
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class JmsProduce {
public static
final String ACTIVEMQ_URL = "tcp://192.168.225.132:61616";
public static void main(String[] args) throws JMSException {
//1 按照给定的url地址,采用默认的用户名密码创建连接工厂(有三个参数的构造方法,其中两个参数是用户名密码)
ActiveMQConnectionFactory
activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
//2 通过连接工厂获得连接
Connection connection =
activeMQConnectionFactory.createConnection();
//3 启动访问,真正建立连接,需要确保防火墙、服务端配置等都正确,能正常访问
connection.start();
//4 创建会话session,false代表不开启事物,Session.AUTO_ACKNOWLEDGE代表自动签收
Session session =
connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5 创建目的地(具体是队列queue还是主题topic),参数是队列的名称
//返回类型可以用Queue接收,也可以用Destination接收,因为Queue继承Destination
Queue queue = session.createQueue("queue1");
//6 创建消息的生产者,负责向指定队列中生产消息
MessageProducer producer =
session.createProducer(queue);
//7 创建3条消息,并由生产者发送到目的地
for(int i=1;i<=3;i++){
//创建消息
TextMessage textMessage =
session.createTextMessage("message" + i);
//发送消息
producer.send(textMessage);
}
//8 关闭资源
producer.close();
session.close();
connection.close();
System.out.println("生产者向activemq生产消息完成!");
}
}
4、控制台查看队列中是否有消息存在,如下图:

各列的含义分别是:待消费的消息数、消费者数量、消息入队数量、消息出队数量。
-----------------------------------------以上是生产者生产消息的简单过程-----------------------------
------------------------------------消费者消费消息的过程------------------------------------------------------
1、编码如下(不带等待时间):
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class JmsConsumer {
public static
final String ACTIVEMQ_URL = "tcp://192.168.225.132:61616";
public static void main(String[] args) throws JMSException {
//1 按照给定的url地址,采用默认的用户名密码创建连接工厂(有三个参数的构造方法,其中两个参数是用户名密码)
ActiveMQConnectionFactory
activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
//2 通过连接工厂获得连接
Connection connection =
activeMQConnectionFactory.createConnection();
//3 启动访问,真正建立连接,需要确保防火墙、服务端配置等都正确,能正常访问
connection.start();
//4 创建会话session,false代表不开启事物,Session.AUTO_ACKNOWLEDGE代表自动签收
Session session =
connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5 创建目的地(具体是队列queue还是主题topic),参数是队列的名称
//返回类型可以用Queue接收,也可以用Destination接收,因为Queue继承Destination
Queue queue = session.createQueue("queue1");
MessageConsumer consumer =
session.createConsumer(queue);
//
while(true){
//receive()方法可以带一个参数,就是如果没有待消费的消息,最多等多久
//不待参数的receive()方法会一直等待,直到接收到消息,才会进行后边处理
TextMessage message =
(TextMessage)consumer.receive();
if(null == message){
break;
}
String s = message.getText();
System.out.println(s);
}
//8 关闭资源
consumer.close();
session.close();
connection.close();
System.out.println("消费者从activemq消费消息完成!");
}
}

发现待消费的消息为0,有一个消费者,入队的消息3条,出队的消息3条
如果不让消费者在得不到消息的情况下还一直等待,即断开消费者与queue之间的连接,或者receive(n*1000L)等待n秒后不再等待,则控制台显示的信息如下(显示的消费者会由1变为0):

2 、测试含有等待时间的receive()方法,代码更改如下:
//TextMessage message = (TextMessage)consumer.receive();
TextMessage
message = (TextMessage)consumer.receive(5000L);
生产者重新生产3条消息,控制台显示如下:

消费者换成含有等待时间的接收消息的方法,控制台显示如下:

将消费者处理完消息后,如果等待5秒还没有获得消息,则断开连接。
以上两种消费方式即:receive()方法不带参数,一直等待(生产者新生产了消息,消费者就会消费掉消息);带参数,超过等待时间就断开连接
3、 消费者以监听器的形式监听队列
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
import java.io.IOException;
public class JmsConsumer {
public static
final String ACTIVEMQ_URL = "tcp://192.168.225.132:61616";
public static void main(String[] args) throws JMSException, IOException {
//1 按照给定的url地址,采用默认的用户名密码创建连接工厂(有三个参数的构造方法,其中两个参数是用户名密码)
ActiveMQConnectionFactory
activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
//2 通过连接工厂获得连接
Connection connection = activeMQConnectionFactory.createConnection();
//3 启动访问,真正建立连接,需要确保防火墙、服务端配置等都正确,能正常访问
connection.start();
//4 创建会话session,false代表不开启事物,Session.AUTO_ACKNOWLEDGE代表自动签收
Session session =
connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5 创建目的地(具体是队列queue还是主题topic),参数是队列的名称
//返回类型可以用Queue接收,也可以用Destination接收,因为Queue继承Destination
Queue queue = session.createQueue("queue1");
MessageConsumer consumer =
session.createConsumer(queue);
//6 消费者消费消息
/* while(true){
TextMessage message =
(TextMessage)consumer.receive();
//TextMessage message =
(TextMessage)consumer.receive(5000L);
if(null == message){
break;
}
String s = message.getText();
System.out.println(s);
}*/
//6 以监听器的形式监听并消费消息
consumer.setMessageListener(new MessageListener()
{
@Override
public void onMessage(Message
message) {
if(message != null &&
message instanceof TextMessage){
TextMessage
textMessage = (TextMessage)message;
try {
System.out.println(textMessage.getText());
} catch (JMSException
e) {
e.printStackTrace();
}
}
}
});
//7 如果以监听器的形式监听消息,则需要此行代码,代表不关闭消费者,否则有可能上边还没有进行消费,下边就把资源都关闭了
//会抛出IOException
System.in.read();
//8 关闭资源
consumer.close();
session.close();
connection.close();
System.out.println("消费者从activemq消费消息完成!");
}
}
结果如下:

监听器的形式也是资源不关闭,生产者生产消息,消费者就能够监听到并进行消费。监听器是异步非阻塞的方式,当消息到达后,系统自动调用监听器MessageListener的onMessage(Message message)方法。
如果启动两个消费者监听消息队列,然后生产者向queue生产消息,两个消费者会轮询消费消息,就像activemq自带负载均衡的感觉。
activemq队列小总结:无论先启动消费者,还是先启动生产者,消费者都能消费到生产者生产的消息,两个没有时间上的关系(异步),且mq中的消息一旦被消费者消费掉,就不再储存该条消息了,所以消息不会被重复消费。
若有理解不到之处,望指正!
0032ActiveMQ之java编码实现生产者和消费者操作队列queue的更多相关文章
- Java中的生产者、消费者问题
Java中的生产者.消费者问题描述: 生产者-消费者(producer-consumer)问题, 也称作有界缓冲区(bounded-buffer)问题, 两个进程共享一个公共的固定大小的缓冲区(仓库) ...
- python条件变量之生产者与消费者操作实例分析
python条件变量之生产者与消费者操作实例分析 本文实例讲述了python条件变量之生产者与消费者操作.分享给大家供大家参考,具体如下: 互斥锁是最简单的线程同步机制,面对复杂线程同步问题,Pyth ...
- RabbitMQ的使用(五)RabbitMQ Java Client简单生产者、消费者代码示例
pom文件: <dependencies> <dependency> <groupId>com.rabbitmq</groupId> <artif ...
- java线程中生产者与消费者的问题
一.概念 生产者与消费者问题是一个金典的多线程协作的问题.生产者负责生产产品,并将产品存放到仓库:消费者从仓库中获取产品并消费.当仓库满时,生产者必须停止生产,直到仓库有位置存放产品:当仓库空时,消费 ...
- java学习之生产者和消费者案例
package com.gh.thread; /** * 生产者和消费者案例 * wait和sleep的区别 * wait不让出监视器锁,sleep让出监视器的锁 * @author ganhang ...
- Java中的生产者和消费者实例(多线程 等待唤醒机制)
1.什么是等待唤醒 我们实现的效果 创建生产者和消费者 对服装进行生产 和售卖 实现生产一个就消费一个 来观察线程的各种状态 下面是用到的方法: wait()方法:让一个线程进行等待 另外一个线程 ...
- Java 实践:生产者与消费者
实践项目:生产者与消费者[经典多线程问题] 问题引出: 生产者和消费者指的是两个不同的线程类对象,操作同一个空间资源的情况. 需求引出: —— 生产者负责生产数据,消费者负责取走数据 —— 生产者生产 ...
- java中的生产者和消费者的问题
1----使用Java.util.concurrent.locks包中的lock接口取代synchronized,通过ReentrantLock这个已经实现Lock接口的类, 创建ReentrantL ...
- java的多生产者多消费者例子
import java.util.concurrent.locks.*; public class Test9 { public static void main(String[] args) { / ...
随机推荐
- 【ARM-Linux开发】【CUDA开发】【视频开发】关于Linux下利用GPU对视频进行硬件加速转码的方案
最近一直在研究Linux下利用GPU进行硬件加速转码的方案,折腾了很久,至今没有找到比较理想的硬加速转码方案.似乎网上讨论这一方案的文章也特别少,这个过程中也进行了各种尝试,遇到很多具体问题,以下便对 ...
- DotNetty是微软的Azure团队,使用C#实现的Netty的版本发布
DotNetty是微软的Azure团队,使用C#实现的Netty的版本发布 Netty(DotNetty)原理解析 一.背景介绍 DotNetty是微软的Azure团队,使用C#实现的Netty的版本 ...
- [转]综述论文翻译:A Review on Deep Learning Techniques Applied to Semantic Segmentation
近期主要在学习语义分割相关方法,计划将arXiv上的这篇综述好好翻译下,目前已完成了一部分,但仅仅是尊重原文的直译,后续将继续完成剩余的部分,并对文中提及的多个方法给出自己的理解. _论文地址:htt ...
- [转帖]龙芯3A/3B3000通用处理器出货超30万 获得“中国芯”大奖
龙芯3A/3B3000通用处理器出货超30万 获得“中国芯”大奖 http://www.eetop.cn/cpu_soc/6946247.html 2019.10 的新闻 出后量 30万 我们贡献了 ...
- class——python编程从入门到实践
创建和使用类 1. 创建Dog类 class Dog: """一次模拟小狗的简单尝试""" def __init__(self, name, ...
- json转义问题
后端程序接受前台传递过来json 1正常json没有问题 比如 {"id":21,"userName":"2张天师","phon ...
- BZOJ5104 Fib数列 二次剩余、BSGS
传送门 发现只有通项公式可以解决考虑通项公式 \(F_n = \frac{1}{\sqrt{5}}((\frac{1+\sqrt{5}}{2})^n - (\frac{1-\sqrt{5}}{2})^ ...
- SharePoint中用Power shell命令修改文档的创建时间
第一步:pnp组件连接到SharePointConnect-PnpOnline -url 网站地址 第二步:查出文档库及文档库下所有的文件 Get-PnPListItem -List 文档库名称 第三 ...
- 深入理解JVM(一) -- 自动内存管理机制
Java运行时数据区域分为:程序计数器,虚拟机栈,本地方法栈,Java堆,方法区,运行时常量池,直接内存,结构如下: 1.程序计数器: 是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示 ...
- AutoMapper 初次使用心得
本例以asp.net webform为例: 结构: 主要代码:AutoMapperConfig 类 public class AutoMapperConfig { public static void ...