ActiveMQ学习--002--Topic消息例子程序
一、非持久的Topic消息示例
注意 此种方式消费者只能接收到 消费者启动之后,发送者发送的消息。
发送者
package com.lhy.mq.helloworld; import java.util.concurrent.TimeUnit; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; public class NoPersistenceTopicSender { public static void main(String[] args) throws Exception { //第一步:建立ConnectionFactory工厂对象。需要填入用户名、密码、连接地址,均使用默认即可,默认端口为"tcp://localhost:61616"
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
"lhy","123456",
//ActiveMQConnectionFactory.DEFAULT_USER,
//ActiveMQConnectionFactory.DEFAULT_PASSWORD,
"tcp://127.0.0.1:61616"); Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createTopic("NB-NB"); //队列名称 MessageProducer producer = session.createProducer(null);// // 第六步:可以使用MessageProducer的setDeliveryMode方法为其设置持久化特性和非持久化特性(DeliveryMode)
//producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); for (int i = 0; i < 3; i++) {
TextMessage message = session.createTextMessage("我是消息内容 -333- "+i);
producer.send(destination, message); System.err.println("生产者发送消息:"+message.getText());
}
session.commit(); if(connection != null){
connection.close();
}
} }
接收者
package com.lhy.mq.helloworld; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; public class NoPersitenceTopicReceiver { public static void main(String[] args) throws Exception {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
"lhy","123456",
"tcp://localhost:61616");
Connection connection = connectionFactory.createConnection();
connection.start();
final Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createTopic("NB-NB"); MessageConsumer consumer = session.createConsumer(destination); Message message = consumer.receive();
while(message != null){
TextMessage textMsg = (TextMessage)message;
System.err.println("消费消息:"+textMsg.getText());
//接收下一个消息
message = consumer.receive(1000L);
} //提交一下事务,否则不确认消息,消息不会出队列
session.commit();
session.close();
connection.close();
}
}
二、持久订阅例子程序
发送者
package com.lhy.mq.helloworld; import java.util.concurrent.TimeUnit; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic; import org.apache.activemq.ActiveMQConnectionFactory; public class PersistenceTopicSender { public static void main(String[] args) throws Exception { //第一步:建立ConnectionFactory工厂对象。需要填入用户名、密码、连接地址,均使用默认即可,默认端口为"tcp://localhost:61616"
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
"lhy","123456",
"tcp://127.0.0.1:61616");
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
Topic destination = session.createTopic("Persistence-Topic"); //队列名称
MessageProducer producer = session.createProducer(null);// //默认为持久订阅,注意这个一定在start之前设置
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
connection.start(); for (int i = 0; i < 3; i++) {
TextMessage message = session.createTextMessage("我是消息内容 -666- "+i);
producer.send(destination, message); System.err.println("生产者发送-topic-消息:"+message.getText());
}
session.commit(); if(connection != null){
connection.close();
}
} }
消费者,可以有多个消费者
1, 消费者需要在Connection上设置消费者id,来识别消费者
2,需要创建TopicSubscriber 来订阅
3,设置好之后再start 这个Connection
4,一定要先运行一次消费者,来向ActiveMQ注册这个消费者,然后再运行发送消息,这样无论消费者是否在线,都会接收到消息。否则只能接收到注册之后的消息。
package com.lhy.mq.helloworld; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicSubscriber; import org.apache.activemq.ActiveMQConnectionFactory; /**
* 消费者需要先运行一次,向producer注册一下
* @author dell
*
*/
public class PersitenceTopicReceiver { public static void main(String[] args) throws Exception {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
"lhy","123456",
"tcp://localhost:61616");
Connection connection = connectionFactory.createConnection();
//设置消费者的id,向发送者先注册一下,producer就知道谁在订阅
connection.setClientID("client2"); final Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
Topic destination = session.createTopic("Persistence-Topic");
TopicSubscriber consumer = session.createDurableSubscriber(destination, "T1");//创建一个持久订阅
//最后start
connection.start(); Message message = consumer.receive();
while(message != null){
TextMessage textMsg = (TextMessage)message;
System.err.println("消费消息:"+textMsg.getText());
//接收下一个消息
message = consumer.receive(1000L);
} //提交一下事务,否则不确认消息,消息不会出队列
session.commit();
session.close();
connection.close();
}
}
分别修改消费者的clientID为 client1、client2运行,相当于2个消费者。
管控台:2个消费者,
ActiveMQ学习--002--Topic消息例子程序的更多相关文章
- ActiveMQ学习(四)——应用程序接口
在 Java 里有 JMS的多个实现.其中 apache 下的 ActiveMQ就是不错的选择. 用 ActiveMQ最好还是了解下 JMS JMS 公共 点对点域 发布/订阅域 Connection ...
- JMS开发步骤和持久化/非持久化Topic消息
------------------------------------------------ 开发一个JMS的基本步骤如下: 1.创建一个JMS connection factory 2.通过co ...
- ActiveMQ的几种消息持久化机制
为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一般都会采用持久化机制. ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,无论使用哪种持久化方式 ...
- ActiveMQ学习笔记(5)——使用Spring JMS收发消息
摘要 ActiveMQ学习笔记(四)http://my.oschina.net/xiaoxishan/blog/380446 中记录了如何使用原生的方式从ActiveMQ中收发消息.可以看出,每次 ...
- ActiveMQ学习总结(5)——Java消息服务JMS详解
JMS: Java消息服务(Java Message Service) JMS是用于访问企业消息系统的开发商中立的API.企业消息系统可以协助应用软件通过网络进行消息交互. JMS的编程过程很简单,概 ...
- 【ActiveMQ入门-5】ActiveMQ学习-消息持久性
ActiveMQ中的消息持久性 ActiveMQ很好的支持了消息的持久性(Persistence).消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是 ...
- 解决Springboot整合ActiveMQ发送和接收topic消息的问题
环境搭建 1.创建maven项目(jar) 2.pom.xml添加依赖 <parent> <groupId>org.springframework.boot</group ...
- 【Java Web开发学习】Spring消息-ActiveMQ发送消息
ActiveMQ发送消息 转载:http://www.cnblogs.com/yangchongxing/p/9042401.html Java消息服务(Java Message Service, J ...
- springboot使用activemq同时接收queue和topic消息
原文链接:https://blog.csdn.net/jia_costa/article/details/79354478 新建springboot项目, pom文件如下 <?xml versi ...
随机推荐
- json、JSONObject、JSONArray的应用
type.java package jiekou.duixiang; import java.text.ParseException;import java.text.SimpleDateFormat ...
- UVa 1596 Bug Hunt (STL栈)
题意:给定两种操作,一种是定义一个数组,另一种是赋值,让你找出哪一步时出错了,出错只有两种,一种是数组越界,另一种是访问未定义变量. 析:当初看到这个题时,感觉好麻烦啊,然后就放过去了,而现在要重新回 ...
- Ansible 笔记 (3) - 编写 playbook
playbook 相当于多个命令的编排组合然后一起运行,类似写脚本.在学习 playbook 之前需要了解 yaml 格式. 编写playbook的步骤: 定义主机与用户 编写任务列表 执行 play ...
- SDK | 声波传输
SDK | 声波传输 - 音频流生成 https://github.com/CloudSide/WaveTransSdk/tree/master/c/freq_util Objective-C: ht ...
- 安装Tomcat时 ,设置JAVA_HOME和JRE_HOME
http://blog.csdn.net/xw370457549/article/details/21638827 安装tomcat后,运行startup.bat提示JAVA_HOME.JRE_HOM ...
- POJ1062不错的题——spfa倒向建图——枚举等级限制
POJ1062 虽然是中文题目但是还是有一定几率都不准题目意思的:1.所有可能降价的措施不是降价多少钱而是降至多少钱2.等级范围:是你所走的那一条路中所有人中最好最低等级差不允许超过limit限制 思 ...
- 【转】【译】在 Windows 10 应用程序中注册任意依赖属性的改变
原文地址:http://visuallylocated.com/post/2015/04/01/Registering-to-any-DependencyProperty-changing-in-Wi ...
- LINQ to XML基本操作
Linq to XML同样是对原C#访问XML文件的方法的封装,简化了用xpath进行xml的查询以及增加,修改,删除xml元素的操作. LINQ to XML 三个最重要类:XElement.XAt ...
- 曲演杂坛--重建索引后,还使用混合分区么?(Are mixed pages removed by an index rebuild?)
原文来自:http://www.sqlskills.com/blogs/paul/mixed-pages-removed-index-rebuild/ 在SQL SERVER 中,区是管理空间的基本单 ...
- 【Kindeditor编辑器】 文件上传、空间管理
包括图片上传.文件上传.Flash上传.多媒体上传.空间管理(图片空间.文件空间等等) 一.编辑器相关参数 二.简单的封装类 这里只是做了简单的封装,欢迎大家指点改正. public class Ki ...