ActiveMQ学习笔记(4)----JMS的API结构和开发步骤
1. JMS的API结构
其实上图中的五个API在第一节中我们都已经使用到了。本节将会讲非持久化和持久化topic的使用。
2. JMS的基本开发步骤
1. 创建一个JMS工厂, ConnectionFactory
2. 通过Connection Factory来创建JMS的Connection
3. 启动JMS connection
4. 通过JMS connection来创建JMS Session
5. 创建JMS destination
6. 创建JMS producer或JMS Message,并设置destination
7. 创建一个JMS consumer或注册一个JMS message listener
8. 发送或接受JMS message(s);
9. 关闭所有JMS资源(connection,session,producer,consumer)
3. 非持久的topic消息实例
1. 非持久化topic消息的发送。
基本跟第一节中的发送队列消息一致,只需要将创建Destination的地方由创建queue(队列)改为创建Topic即可。例如:
Topic topic = session.createTopic("myTopic");
2. 非持久化的topic消息的接收
1). 接收方必须要在线,因为消息不会存储起来,然后客户端在发送消息,接收方才能收到消息。
2) 同样将创建Destination的地方由创建queue替换成创建Topic
3) 使用while循环接受消息
完整代码如下:
生产者
package com.wangx.activemq.topic; import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; public class NoPersistenceSender { /**
* 默认访问路径
*/
private static final String DEFAULT_URL = ActiveMQConnectionFactory.DEFAULT_BROKER_URL;
/**
* 默认用户名
*/
private static final String DEFAULT_USER = ActiveMQConnectionFactory.DEFAULT_USER;
/**
* 默认密码
*/
private static final String DEFAULT_PASSWORD = ActiveMQConnectionFactory.DEFAULT_PASSWORD; private Session getSession() throws JMSException {
ConnectionFactory factory = new ActiveMQConnectionFactory(DEFAULT_USER, DEFAULT_PASSWORD, DEFAULT_URL);
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
return session;
} public void send() throws JMSException {
Session session = getSession();
//创建topic
Topic topic = session.createTopic("myTopic");
MessageProducer messageProducer = session.createProducer(topic); for (int i = 0; i < 9; i++) {
TextMessage textMessage = session.createTextMessage("Message NoPersistence" + i);
messageProducer.send(textMessage);
System.out.println("发送者发送的消息" + textMessage.getText());
}
session.commit();
session.close();
} public static void main(String[] args) throws JMSException {
NoPersistenceSender sender = new NoPersistenceSender();
sender.send();
}
}
消费者
package com.wangx.activemq.topic; import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; public class NoPersistenceReceiver { /**
* 默认访问路径
*/
private static final String DEFAULT_URL = ActiveMQConnectionFactory.DEFAULT_BROKER_URL;
/**
* 默认用户名
*/
private static final String DEFAULT_USER = ActiveMQConnectionFactory.DEFAULT_USER;
/**
* 默认密码
*/
private static final String DEFAULT_PASSWORD = ActiveMQConnectionFactory.DEFAULT_PASSWORD; private Session getSession() throws JMSException {
ConnectionFactory factory = new ActiveMQConnectionFactory(DEFAULT_USER, DEFAULT_PASSWORD, DEFAULT_URL);
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
return session;
} public void receive() throws JMSException {
Session session = getSession();
//创建非持久化的topic
Destination destination = session.createTopic("myTopic");
MessageConsumer messageConsumer = session.createConsumer(destination);
Message message = messageConsumer.receive();
//使用while接受消息
while (message != null) {
TextMessage textMessage = (TextMessage) message;
System.out.println("接收者接受到的消息:" + textMessage.getText());
message = messageConsumer.receive(); session.commit();
}
session.close();
}
public static void main(String[] args) throws JMSException { NoPersistenceReceiver receiver = new NoPersistenceReceiver(); receiver.receive(); } }
4. 持久化Topic实例
1. 持久化消息发送
它与非持久化消息发送的示例区别主要有以下两点
1)必须要设置使用MessageProducer.setDeliveryMode()方法设置持久化,它默认是不持久化的。
例如:
//设置持久化消息
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
2)connection的start()方法必须放在持久化设置之后。
2. 持久化消息的接收
跟非持久化相比, 主要注意一下四点:
1. 需要在连接上设置消费者客户端id,用来识别消费者
2. 需要创建TopicSubscriber来订阅
3. 需要设置好了TopicSubscriber和客户端id后才调用connection.start()方法
4. 一定要先运行一次,等于想像消息中间件注册这个消费者,然后再运行生产者发送消息,这个时候,无论消费者是否在线,都将会受到消息,不在线的话,下次连接的时候,会把没有收到过的消息都接收下来。
完整代码如下
生产者:
package com.wangx.activemq.topic; import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; public class PersistenceSender { /**
* 默认访问路径
*/
private static final String DEFAULT_URL = ActiveMQConnectionFactory.DEFAULT_BROKER_URL;
/**
* 默认用户名
*/
private static final String DEFAULT_USER = ActiveMQConnectionFactory.DEFAULT_USER;
/**
* 默认密码
*/
private static final String DEFAULT_PASSWORD = ActiveMQConnectionFactory.DEFAULT_PASSWORD; public void send() throws JMSException {
ConnectionFactory factory = new ActiveMQConnectionFactory(DEFAULT_USER, DEFAULT_PASSWORD, DEFAULT_URL);
Connection connection = factory.createConnection();
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
//创建topic
Destination destination = session.createTopic("myTopic2");
MessageProducer messageProducer = session.createProducer(destination);
//设置持久化消息, 默认是非持久化
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
//start()放在设置持久化之后
connection.start(); for (int i = 0; i < 9; i++) {
TextMessage textMessage = session.createTextMessage("Message Persistence" + i);
messageProducer.send(textMessage);
System.out.println("发送者发送的消息" + textMessage.getText());
}
session.commit();
session.close();
connection.close();
} public static void main(String[] args) throws JMSException {
PersistenceSender sender = new PersistenceSender();
sender.send();
}
}
消费者:
package com.wangx.activemq.topic; import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; public class PersistenceReceiver { /**
* 默认访问路径
*/
private static final String DEFAULT_URL = ActiveMQConnectionFactory.DEFAULT_BROKER_URL;
/**
* 默认用户名
*/
private static final String DEFAULT_USER = ActiveMQConnectionFactory.DEFAULT_USER;
/**
* 默认密码
*/
private static final String DEFAULT_PASSWORD = ActiveMQConnectionFactory.DEFAULT_PASSWORD; public void receive() throws JMSException {
ConnectionFactory factory = new ActiveMQConnectionFactory(DEFAULT_USER, DEFAULT_PASSWORD, DEFAULT_URL);
Connection connection = factory.createConnection();
//注册客户端id
connection.setClientID("wangx1");
connection.start();
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
//创建topic
Topic topic = session.createTopic("myTopic2");
//创建topicSubscriber
TopicSubscriber topicSubscriber = session.createDurableSubscriber(topic, "wangx1");
//启动connection
connection.start();
Message message = topicSubscriber.receive();
while (message != null) {
TextMessage textMessage = (TextMessage) message;
System.out.println("接收者接受到的消息:" + textMessage.getText());
message = topicSubscriber.receive();
session.commit();
}
session.close();
connection.close();
} public static void main(String[] args) throws JMSException {
PersistenceReceiver receiver = new PersistenceReceiver();
receiver.receive();
}
}
5. 关于持久化和非持久化消息
5.1 持久化消息
这是ActiveMQ的默认传送方式,此模式保证这些消息制备传送一次和成功使用一次,对于这些消息,可靠性是优先考虑的,可靠性的另一个重要的另一个方面是确保持久性消息传至目标后,消息服务在向消费者传送他们之前不会丢失这些消息。
这意味着在持久性消息传至目标时,消息服务将其放入持久性数据存储,如果消息服务由于某种原因导致失败,它可以恢复次消息并将此消息传送至相应的消费者。虽然增加了消息传送的开销,但是却增加了可靠性。
5.2 非持久化消息
保证这些消息最多被传送一次,对于这些消息,可靠性并不是主要的考虑因素。并不要求持久性的存储数据,也不保证消息服务由于某种原因导致失败后消息不会丢失。
有两种方法制定传送模式
使用setDeliveryMode方法,这样所有的消息都采用此种传送模式,例如:
//设置持久化消息, 默认是非持久化
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
也可以使用send()方法为每一条消息设置传送模式,例如:
messageProducer.send(textMessage, DeliveryMode.PERSISTENT,20,20);
ActiveMQ学习笔记(4)----JMS的API结构和开发步骤的更多相关文章
- ActiveMQ学习笔记(二) JMS与Spring
上文可见,JMS Native API使用起来不是特别方便.好在Spring提供了很好的JMS支持. (一)配置ConnectionFactory 如果使用连接池的话,不要忘记activemq-poo ...
- ActiveMQ学习笔记(一) JMS概要
(一)什么是JMS jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...
- Android(java)学习笔记262:JNI之工具快速开发步骤
下面通过一个案例说明一下,利用工具jni快速开发步骤 1.新建一个Android工程,命名为"03_对int数组加1",如下: 2. 在MainActivity.java中对add ...
- Android(java)学习笔记206:JNI之工具快速开发步骤
下面通过一个案例说明一下,利用工具jni快速开发步骤 1.新建一个Android工程,命名为"03_对int数组加1",如下: 2. 在MainActivity.java中对add ...
- ActiveMQ学习笔记(5)——使用Spring JMS收发消息
摘要 ActiveMQ学习笔记(四)http://my.oschina.net/xiaoxishan/blog/380446 中记录了如何使用原生的方式从ActiveMQ中收发消息.可以看出,每次 ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序
http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...
- VSTO 学习笔记(十)Office 2010 Ribbon开发
原文:VSTO 学习笔记(十)Office 2010 Ribbon开发 微软的Office系列办公套件从Office 2007开始首次引入了Ribbon导航菜单模式,其将一系列相关的功能集成在一个个R ...
- mybatis 学习笔记(三):mapper 代理开发 dao 层
mybatis 学习笔记(三):mapper 代理开发 dao 层 优势 通过使用mapper 代理,我们可以不需要去编写具体的实现类(使用 getMapper() 方法自动生成),只需编写接口即可, ...
- AMQ学习笔记 - 02. JMS客户端编程模型
概述 客户端编程模型,是讲如何使用JMS API实现Java应用程序和JMS Provider的通信. 消息传送模式 消息传送模式又称为消息传送域,JMS API定义了两种模式:PTP和Pub/Sub ...
随机推荐
- 洛谷P3357 最长k可重线段集问题(费用流)
题目描述 给定平面 x-O-yx−O−y 上 nn 个开线段组成的集合 II ,和一个正整数 kk .试设计一个算法,从开线段集合 II 中选取出开线段集合 S\subseteq IS⊆I ,使得在 ...
- jmeter的认识
jmeter JMeter是Apache组织开发的开源项目,设计之初是用于做性能测试的,同时它在实现对各种接口的调用方面做的比较成熟,因此,常被用做接口功能测试和性能测试. 它能够很好的支持各种常见接 ...
- Xml实现图片旋转
1. 需求:不使用Java代码,实现旋转图片动画 2.实现:使用Progressbar控件 3. anim/anim_loading.xml <?xml version="1.0&qu ...
- Photoshop把图片调成固定的像素。
1.用PhotoShop打开需要修改的图片. 2.点击“窗口”菜单的“图层”子菜单,打开图层控制面板(快捷键F7).3.用鼠标左键双击“图层”面板的“背景”图层.在弹出窗口中点击“确定”按钮,解锁背景 ...
- 谈 instanceof 和 typeof 的实现原理
typeof: js 在底层存储变量的时候,会在变量的机器码的低位1-3位存储其类型信息
- JTree知识小点
创建一个新节点 DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("新节点"); 被选中的节点 Default ...
- linux内存随笔
内存在电脑中使用广泛,比如内存条内存.显卡显存.cpu缓存.raid卡缓存等,缓存就是数据交换的缓冲区(称作cache),缓存往往都是RAM(断电文件丢失),他们的读写速率非常高,用来帮助硬件更快的响 ...
- ansible shell模块
[root@ftp:/root] > ansible ansible01 -u root -k -m shell -a 'hostname' SSH password: ansible01 | ...
- POJ 3270
黑书上的经典题了.我说说解这个题的巧妙的地方吧. 首先,竟然和置换联系起来了.因为其实一个交换即至少可以使其中一个元素到达指定位置了.和循环置换联合起来,使得一个循环内的数可以一步到达指定位置,很巧妙 ...
- Android中文API-ViewStub
ViewStub控件是一个不可见,0尺寸得惰性控件.当ViewStub控件设置可见,或者调用inflate(),并运行完毕之后,ViewStub所指定的layout资源就会被载入.这个ViewStub ...