activeMQ Queue_91奔跑的蜗牛的博客-程序员秘密

技术标签: MQ  

queue 是点对点模式,只能是一个生产者产生一个消息,被一个消费者消费。

queue 默认是存在于MQ的服务器中的,发送消息之后,消费者随时取。但是一定是一个消费者取,消费完消息也就没有了。

生产者:
 

public class QueueProduct {
	
	public static void main(String[] args) throws Exception {
		
		//创建工厂
		ConnectionFactory facroty = new ActiveMQConnectionFactory("tcp://192.168.25.128:61616");
		
		//利用工厂创建链接
		Connection connection = facroty.createConnection();
		
		//链接开启'
		connection.start();
		
		//使用 connection创建一个 session 对象
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		
		//session 创建destination
		Queue queue = session.createQueue("queue-test");
		
		//session 创建 produce
		MessageProducer producer = session.createProducer(queue);
		
		//sesssion 创建message
		TextMessage message = session.createTextMessage("hello activemq  queue8");
		
		//发送
		producer.send(message);
		
		
		producer.close();
		session.close();
		connection.close();
		
	}
	
}

消费者方式一:
 

public class QueueCustomer {

	public static void main(String[] args) throws Exception {
		
		ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.25.128:61616");
		
		Connection connection = factory.createConnection();
		
		connection.start();
		
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		
		Queue queue = session.createQueue("queue-test");
		
		MessageConsumer consumer = session.createConsumer(queue);
		
		while(true){
			Message message = consumer.receive(10000);
			
			if(message == null){
				break;
			}
			
			if(message instanceof TextMessage){
				TextMessage textmessage = (TextMessage)message;
				System.out.println(textmessage.getText());
			}
			
		}
		
		connection.close();
		session.close();
		connection.close();
	}

}

消费者方式二:
 

public class QueueCustomer2 {

	public static void main(String[] args) throws Exception {
		
		ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.25.128:61616");
		
		Connection connection = factory.createConnection();
		
		connection.start();
		
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		
		Queue queue = session.createQueue("queue-test");
		
		MessageConsumer consumer = session.createConsumer(queue);
		
	    System.out.println("start");
	    
	    //设置监听器,其实开启了一个新的线程。
	    //开启的应该是守护线程,当主线程结束的时候守护线程也随之结束
		consumer.setMessageListener(new MessageListener() {
			
			//接收消息,如果有消息才进入,如果没有消息就不会进入此方法
			@Override
			public void onMessage(Message message) {
				if(message instanceof TextMessage){
					TextMessage textMeaage = (TextMessage)message;
					try {
						System.out.println(textMeaage.getText());
					} catch (JMSException e) {
						e.printStackTrace();
					}
				}
				
			}
		});
		System.out.println("end");
		
		//Thread.sleep(10000);
		
		connection.close();
		session.close();
		connection.close();
	}

}

针对第二种消费者的方式,做如下测试:
activeMQ中还有两个消息队列未被消费

执行消费者的代码结果如下,此时消息队列中明明有未被消费的消息却没被该消费者消费,为什么会出现这种情况?

再次执行消费者代码,此时activeMQ中的两个消息被消费了


获取队列消息的代码在 start之后,end之前,但是现在拿到的消息却显示在end之后,那么获取消息队列的方式应该是开启了一个新的线程或者是异步请求。
 

consumer.setMessageListener(new MessageListener(),设置监听器,其实开启了一个新的线程,开启的应该是守护线程,当主线程结束的时候守护线程也随之结束。执行的时候如果主线程先于守护线程执行完,那么消息就不会被消费,如果守护线程先执行完,才会消费队列中的消息。 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xldmx/article/details/99725875

智能推荐

python 网格交易源码_网格交易策略(难度:中级)_weixin_40000301的博客-程序员秘密

什么是网格交易策略网格交易又名渔网交易,就是跌买涨卖。它适合震荡市,震荡市就是行情价围着一个数字上下浮动的,这个数字就是设置的价格中轴线。设定中枢价格后,对投资标的进行机械式操作,下跌时,进行分档买入,上涨时,进行分档卖出。网格法不依赖人为的思考,完全是一种程序行为,像渔网一样,利用行情的波动在网格区间内低买高卖。通过反复循环差价赚取利润。策略优缺点优点: 网格交易策略适合价格在一个范围内波动的投...

什么是算法_xiaohang20103的博客-程序员秘密

算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。  算法可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤。或者看成按照要求设计好的有限的确切

四舍五入VS银行家舍入_iteye_309的博客-程序员秘密

相信细心的程序员们早就发现了.net环境下默认舍入算法的是“四舍六入”的算法。从小学我们就学过“四舍五入”算法,但是更加科学的舍入办法应该是“四舍六入”,也就是今天我们要讨论的“银行家舍入”。大家可以做一个Demo。C#环境下 1: class Program 2: { 3: static void Main(st...

关闭令人抓狂的ESlint 语法检测配置方法《《《 非人类的方法_eslint watcheffect_IT和尚的博客-程序员秘密

刚刚开始的小伙伴是不是空格报错少一行报错各种错?是不是觉得快被限制的失去了自由的思绪了?受折磨后找到了不错的文章来取消eslint语法检测限制,作为学习笔记摘自segmentfault其实我并不反对这些语法检测,但是像许多反个人意愿的那就真的不得不吐槽了,比如vue-cli脚手架创建的默认eslint规则:代码末尾不能加分号 ;代码中不能存在多行空行tab键不能使用,必须换成两个空格代码中不能存在...

px4讲解(一)历史起源_沃噻的博客-程序员秘密

第一节对于初次接触无人机行业的人来说一些无人机行业课外知识还是需要了解的,ardupilot和px4是目前无人机行业最受欢迎、也是最为先进的飞控软件,他们又是如何诞生并一路走来的呢,他们跟Dronecode基金会又有什么千丝万缕的联系呢,下面一一揭晓。早在2005年一个意大利开发团队开发出了一款Arduino开源电子原型平台,其团队根据Arduino方便开发、源码开源特性、衍生出Ardupilot和WMC等产品。2007年 Chris Anderson 创立一个DIY Drones网络社区 htt

java的日期类Date和日期的格式化_李昆鹏的博客-程序员秘密

-----------------java的日期类Date和日期的格式化-------------------java.util 类 Datejava.lang.Object  java.util.Date所有已实现的接口: Serializable, Cloneable, Comparable<Date> 直接已知子类: Date, Time, Timestamp public cl...

随便推点

MATLAB教室人数统计开源代码(包含 GUI 注释 课题分析)_matlab开源代码_weixin_43391211的博客-程序员秘密

MATLAB教室人数统计(免费开源代码)本人参考了很多的资料最后总结整出来的,如果能够该博客对你的学习有所帮助的话,希望大家可以帮我点个赞,本人是抱着学习的态度进行分享,大家如果能在我的基础上进行二次创作的话,希望不要吝啬,分出来给大家,谢谢!一、简介开题报告参考链接:【人脸识别】基于GUI教室人数统计系统1 课题背景本课题为基于matlab的人数统计系统。近年来,很多行业对人流信息有极大的需求,如汽车公交站,地铁站台,商场出入口等。通过人数统计系统可以方便、可靠、实时地对各种场所的人流进行统计,

WordPress性能优化插件已激活版-Perfmatters-v1.6.8+使用教程_程序员教程吧官方的博客-程序员秘密

Perfmatters是一个非常轻量级的WordPress性能优化插件。该插件的主要目的是减少页面大小和HTTP请求数量。它允许您禁用许多不需要的功能,例如表情符号,XML-RPC,RSD链接,短链接,RSS提要以及许多其他功能,以加快网站速度。它不是缓存插件,但提供了缓存插件不提供的那些功能。Perfmatters与任何其他缓存插件都没有冲突。您可以同时使用Perfmatters和其他任何缓存插件,以提高加载速度。Perfmatters插件的实际大小也非常小,介于150KB至160KB之间。因此,此插件不

用Python将Excel数据导入到SQL Server_azaho的博客-程序员秘密

使用环境:Win10 x64 Python:3.6.4 SqlServer:2008R2        因为近期需要将excel导入到SQL Server,但是使用的是其他语言,闲来无事就尝试着用python进行导入,速度还是挺快的,1w多条数据,也只用了1s多,代码也比较简单,就不多解释了。    用到的库有xlrd(用来处理excel),pymssql(用来连接使用sql server)imp...

中文输入程序_seach chinese_韩搏的博客-程序员秘密

ChineseInput.c#include #include #include "PY_Index.h"unsigned char * search_Chinese(char *buf){ static char str[50]={""}; int i=0; strcpy(str,"PY_mb_"); strcat(str,buf); for(i=

500错误:java.lang.IncompatibleClassChangeError_邢美玲的博客-程序员秘密

详细错误描述:ParameterNameDiscoveringVisitor has interface org.springframework.as.ClassVisitor as super class分析问题:parameternamedicoveringvisitor的接口org.springframework.as.ClassVisitor是超级类;超级类是父类的意思,也就是说...

ASP获取上一页地址的方法(HTTP_REFERER)_代码之城的博客-程序员秘密

If Request.ServerVariables("HTTP_REFERER")   tmpstr=Request.ServerVariables("HTTP_REFERER")   Comeurl=tmpstrElse   Comeurl="index.htm"End If Response.Write(Comeurl)%>代码解释:主

推荐文章

热门文章

相关标签