JMS开发步骤和持久化/非持久化Topic消息
------------------------------------------------
开发一个JMS的基本步骤如下:
1.创建一个JMS connection factory
2.通过connection factory来创建JMS connection
3.启动JMS connection
4.通过connection创建JMS session
5.创建JMS destination
6.创建JMS producer 或者创建JMS message,并设置destination
7.创建JMS consumer 或者注册一个JMS message listener
8.发送或者接受JMS message
9.关闭所有的JMS资源(connection、session、producer、consumer等)
可以参考下图:
非持久的Topic消息示例
对于非持久化的消息,当发送方发送消息的时候:
如果接收方不在线,则接收方永远也收不到这些消息了
如果接收方在线,则接收方会收到这些消息
1、消息发送程序
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; /**
* 非持久化Topic消息发送者
* @author Administrator
*
*/
public class NoPersistenceSender {
public static void main(String[] args) throws Exception {
//创建一个JMS connection factory
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.1.81:61616");
//通过connection factory来创建JMS connection
Connection connection = connectionFactory.createConnection();
//启动JMS connection
connection.start();
//通过connection创建JMS session
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
//创建JMS destination
Destination destination = session.createTopic("noPersistenceTopic");
//创建JMS producer
MessageProducer producer = session.createProducer(destination);
for(int i = 0;i < 10;i++){
TextMessage message = session.createTextMessage("message-"+i);
//发送message
producer.send(message);
}
//关闭所有的JMS资源
session.commit();
session.close();
connection.close();
}
}
运行完消息发送程序后,可以访问192.168.1.81:8161
2、消息接收程序
对于非持久的Topic消息的接收需要注意以下几点:
a.接收程序必须在线,然后消息发送方再发送消息,接收程序才能接收到消息
b.由于不知道消息发送方要发送多少条消息,所以利用while循环的方式来接收消息
c.如果接收程序不在线,此时发送程序发送了消息的话,则该消息将永远不会被接收方收到。
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; /**
* 非持久化Topic消息接收者
* @author Administrator
*
*/
public class NoPersistenceReceiver {
public static void main(String[] args) throws Exception {
//创建一个JMS connection factory
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.1.81:61616");
//通过connection factory来创建JMS connection
Connection connection = connectionFactory.createConnection();
//启动JMS connection
connection.start();
//通过connection创建JMS session
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
//创建JMS destination
Destination destination = session.createTopic("noPersistenceTopic");
//创建JMS consumer
MessageConsumer consumer = session.createConsumer(destination);
Message message = consumer.receive();
while(message != null){
TextMessage txtMsg = (TextMessage)message;
System.out.println("收到消息:"+txtMsg.getText());
message = consumer.receive();
}
//关闭所有的JMS资源
session.commit();
session.close();
connection.close();
}
}
运行结果:
持久的Topic消息示例
1.消息发送程序
对于持久的Topic消息的发送方需要注意以下几点:
a.要用持久化订阅,发送消息者要用DeliveryMode.PERSISTENT模式来发送
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; /**
* 持久化Topic消息发送者
* @author Administrator
*/
public class PersistenceSender {
public static void main(String[] args) throws Exception {
//创建一个JMS connection factory
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.1.81:61616");
//通过connection factory来创建JMS connection
Connection connection = connectionFactory.createConnection();
//通过connection创建JMS session
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
//创建JMS destination
Destination destination = session.createTopic("PersistenceTopic");
//创建JMS producer
MessageProducer producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
//启动JMS connection
connection.start();
for(int i = 0;i < 10;i++){
TextMessage message = session.createTextMessage("message-"+i);
//发送message
producer.send(message);
}
//关闭所有的JMS资源
session.commit();
session.close();
connection.close();
}
}
2.消息接收程序
对于持久的Topic消息的接收方需要注意以下几点:
a.需要在连接上设置消费者id,用来识别消费者
b.需要创建TopicSubscriber来订阅
c.一定要先运行一次该消费者程序,等于向消费服务中间件注册这个消费者,然后再运行消息发送者来发送消息,这样的话,无论消费者是否在线都会收到消息,如果不在线的话,则下次连接的时候会把没有收过的消息都接收下来。
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicSubscriber; import org.apache.activemq.ActiveMQConnectionFactory; /**
* 持久化Topic消息接收者
* @author Administrator
*
*/
public class PersistenceReceiver {
public static void main(String[] args) throws Exception {
//创建一个JMS connection factory
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://120.76.123.81:61616");
//通过connection factory来创建JMS connection
Connection connection = connectionFactory.createConnection();
connection.setClientID("con1");
//通过connection创建JMS session
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
//创建JMS destination
Topic destination = session.createTopic("PersistenceTopic");
//创建JMS consumer
TopicSubscriber ts = session.createDurableSubscriber(destination, "TT");
//启动JMS connection
connection.start();
Message message = ts.receive();
while(message != null){
TextMessage txtMsg = (TextMessage)message;
session.commit();
System.out.println("收到消息:"+txtMsg.getText());
message = ts.receive(1000L);
}
//关闭所有的JMS资源
session.close();
connection.close();
}
}
关于持久化和非持久化消息
有两种方式指定传送模式:
1.使用setDeliveryMode方法,这样所有的消息都采用此传送模式;如producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT)
2.使用send方法为每条消息设置传送模式
持久化消息
这是ActiveMQ的默认传送模式,此模式保证这些消息只被传送一次和成功使用一次。对于这些消息,可靠性是优先考虑的因素。可靠性的另一个重要方面是确保持久性消息传送至目标后,消息服务在向消费者传送它们之前不会丢失这些消息。
这意味着在持久性消息传送至目标时,消息服务将其放入持久性数据存储。如果消息服务由于某种原因导致失败,它可以恢复此消息并将此消息传送至相应的消费者。虽然这样增加了消息传送的开销,但是却增加了可靠性。
非持久化消息
保证这些消息最多被传送一次。对于这些消息,可靠性并非主要的考虑因素。此模式并不要求持久性的数据存储,也不保证消息服务由于某种原因导致失败后消息不会丢失。
JMS开发步骤和持久化/非持久化Topic消息的更多相关文章
- JMS学习(五)--ActiveMQ中的消息的持久化和非持久化 以及 持久订阅者 和 非持久订阅者之间的区别与联系
一,消息的持久化和非持久化 ①DeliveryMode 这是传输模式.ActiveMQ支持两种传输模式:持久传输和非持久传输(persistent and non-persistent deliver ...
- ActiveMQ学习笔记(4)----JMS的API结构和开发步骤
1. JMS的API结构 其实上图中的五个API在第一节中我们都已经使用到了.本节将会讲非持久化和持久化topic的使用. 2. JMS的基本开发步骤 1. 创建一个JMS工厂, Connectio ...
- redisd的非持久化配置
如何关闭redis持久化?我的需求是只把redis当作缓存来用,所以持久化到硬盘对我的需求来说没有意义. 修改redis配置文件,redis.conf 第115行左右. 1.注释掉原来的持久化规则 # ...
- RabbitMQ学习笔记(6)----RabbitMQ 持久化和非持久化
持久化:将交换机或队列数据保存到磁盘,服务器宕机或重启之后依然存在. 非持久化:将交换机或队列的数据保存到内存中,服务器宕机或重启之后数据将不存在. 在RabbitMQ中也提供了持久化和非持久化方式. ...
- RabbitMQ持久化和非持久化
但是,非持久化要比持久化速度更快. 队列是否需要持久化:看需求
- JMS开发指南
1.JMS消息的异步与同步接收 消息的异步接收: 异步接收是指当消息到达时,主动通知客户端,即当消息到达时转发到客户端.JMS客户端可以通过注册一个实现MessageListener接口的对象到Mes ...
- iOS应用内付费(IAP)开发步骤列表
iOS应用内付费(IAP)开发步骤列表 前两天和服务端同事一起,完成了应用内付费(以下简称IAP, In app purchase)的开发工作.步骤繁多,在此把开发步骤列表整理如下.因为只是步骤列表, ...
- 以DDD为开发模式的设计开发步骤可以是
以DDD为开发模式的设计开发步骤可以是:1)分析需求:2)画出用例图,系统中各个角色如何使用系统,也包括外部系统如何使用系统,也包括系统中到某个时间点自动启动的某些功能(此时角色就是时间):3)针对各 ...
- Lind.DDD.LindMQ~关于持久化到Redis的消息格式
回到目录 关于持久化到Redis的消息格式,主要是说在Broker上把消息持久化的过程中,需要存储哪些类型的消息,因为我们的消息是分topic的,而每个topic又有若干个queue组成,而我们的to ...
随机推荐
- Linux下定时执行脚本(转自Decode360)
文章来自:http://www.blogjava.net/decode360/archive/2009/09/18/287743.html Decode360's Blog 老师(业精于勤而荒于嬉 ...
- Struts核心技术简介
Struts核心技术简介 1.Struts内部机制 Struts是一种基于MVC经典设计模式的开发源代码的应用框架,它通过把Servlet.JSP.JavaBean.自定义标签和信息资源整合到一个 ...
- HDU3555 Bomb[数位DP]
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submi ...
- Mui沉浸模式以及状态栏颜色改变
沉浸模式只需要设置下就可以 ios: 打开应用的manifest.json文件,切换到代码视图,在plus -> distribute -> apple 下添加UIReserveSta ...
- Python学习Day2笔记(集合和文件操作)
1.集合的使用 列表是有序的可包含重复内容的 集合是无序的不可包含重复内容的 1) 集合关系测试 #列表去重list_1=[1,4,5,6,7,8,9,7,5,4,23,2] #有重复数据 list_ ...
- 《深入理解计算机系统V2》学习指导
<深入理解计算机系统V2>学习指导 目录 图书简况 学习指导 第一章 计算机系统漫游 第二章 信息的表示和处理 第三章 程序的机器级表示 第四章 处理器体系结构 第五章 优化程序性能 第六 ...
- shell脚本每天自动备份mysql数据库
一.mysql提供了一个mysqldump的工具可以方便的导出导入数据库信息: 二.使用命令行shell测试执行mysqldump,理解必备的参数,查看生成的sql备份文件是否符合需求: /usr/b ...
- HMAC加密的消息摘要码
HMAC(Hash Message Authentication Code)哈希消息授权码,它在消息摘要算法(例如MD5,SHA系列算法)的基础上,使用密钥对消息摘要进行加密.它相当于一个马甲,内里可 ...
- webpack --- 详解
官网: http://webpack.github.io/docs/using-loaders.html 简书: http://www.jianshu.com/p/42e11515c10f
- RecyclerView的使用(四)
前面我们已经实现了RecyclerView的大部分功能了,但是有个很明显的缺陷-------没有点击效果!这就坑爹了 ListView自带点击效果好嘛!连这个都要自己定义.... 话不多说,下面就来为 ...