JavaEE(6) - JMS消息选择和查看
1. JMS消息的类型、消息头和消息属性
消息类型:
StreamMessage
MapMessage
TextMessage
ObjectMessage
BytesMessage
JMS消息中的消息头和消息属性本质上都是一系列的key-value对,消息头的所有key都是标准的、固定的;消息属性的key和value都可以随意定义。
// 为JMS消息设置一个自定义属性
msg.setStringProperty("ConType", "txt");
2. JMS消息的传递方式和确认方式
传递方式:DeliveryMode.PERSISTENT, DeliveryMode.NON_PERSISTENT
确认方式(JMS规范):Session.AUTO_ACKNOWLEDGE, Session.CLIENT_ACKNOWLEDGE, Session.DUPS_OK_ACKNOWLEDGE,
WebLogic提供:Session.NO_ACKNOWLEDGE, Session.MULTICAST_NO_ACKNOWLEDGE,
3. 使用消息选择器来过滤消息(NetBeans创建java project: MessageSelector)
MessageSender.java
package lee; import javax.jms.*;
import javax.naming.*;
import java.util.Properties; public class MessageSender { public void sendMessage() throws NamingException, JMSException {
//定义WebLogic默认连接工厂的JNDI
final String CONNECTION_FACTORY_JNDI = "weblogic.jms.ConnectionFactory";
//获取JNDI服务所需的Context
Context ctx = getInitialContext();
//通过JNDI查找获取连接工厂
ConnectionFactory connFactory = (ConnectionFactory) ctx.lookup(CONNECTION_FACTORY_JNDI);
//通过JNDI查找获取消息目的
Destination dest = (Destination) ctx.lookup("MessageTopic");
//连接工厂创建连接
Connection conn = connFactory.createConnection();
//JMS连接创建JMS会话
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
//JMS会话创建消息生产者
MessageProducer sender = session.createProducer(dest);
//设置消息生产者生产出来的消息的传递模式、有效时间。
sender.setDeliveryMode(DeliveryMode.PERSISTENT);
sender.setTimeToLive(20000);
//通过JMS会话创建一个文本消息
TextMessage msg = session.createTextMessage();
//msg.setStringProperty("ConType","txt");
//设置消息内容
msg.setText("Hello");
//发送消息,指定该消息的优先级为8
sender.send(msg, DeliveryMode.PERSISTENT, 8, 30000);
//为第二条消息设置属性
msg.setStringProperty("ConType", "TXT");
msg.setText("Welcome to JMS");
//再次发送消息
sender.send(msg);
//关闭资源
session.close();
conn.close();
} //工具方法,用来获取命名服务的Context对象
private Context getInitialContext() {
// 参看(4)
} public static void main(String[] args) throws Exception {
MessageSender sender = new MessageSender();
sender.sendMessage();
}
}
PriorityConsumer.java
package lee; import javax.jms.*;
import javax.naming.*;
import java.util.Properties; public class PriorityConsumer { public void receiveMessage() throws JMSException, NamingException {
//定义WebLogic默认连接工厂的JNDI
final String CONNECTION_FACTORY_JNDI = "weblogic.jms.ConnectionFactory";
//获取JNDI服务所需的Context
Context ctx = getInitialContext();
//通过JNDI查找获取连接工厂
ConnectionFactory connFactory = (ConnectionFactory) ctx.lookup(CONNECTION_FACTORY_JNDI);
//通过JNDI查找获取消息目的
Destination dest = (Destination) ctx.lookup("MessageTopic");
//连接工厂创建连接
Connection conn = connFactory.createConnection();
//启动JMS连接,让它开始传输JMS消息
conn.start();
//JMS连接创建JMS会话
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
//JMS会话创建消息消费者,指定该消息消费者只对优先级大于5的消息感兴趣。
MessageConsumer receiver = session.createConsumer(dest, "JMSPriority > 5");
//同步接收消息,如果没有接收到消息,该方法会阻塞线程
TextMessage msg = (TextMessage) receiver.receive();
System.out.println(msg);
System.out.println("同步接收到的消息:" + msg.getText());
//关闭资源
session.close();
conn.close();
} //工具方法,用来获取命名服务的Context对象
private Context getInitialContext() {
// 参看(4)
} public static void main(String[] args) throws Exception {
PriorityConsumer consumer = new PriorityConsumer();
consumer.receiveMessage();
}
}
PropertyConsumer.java
package lee; import javax.jms.*;
import javax.naming.*;
import java.util.Properties; public class PropertyConsumer { public void receiveMessage() throws JMSException, NamingException {
//定义WebLogic默认连接工厂的JNDI
final String CONNECTION_FACTORY_JNDI = "weblogic.jms.ConnectionFactory";
//获取JNDI服务所需的Context
Context ctx = getInitialContext();
//通过JNDI查找获取连接工厂
ConnectionFactory connFactory = (ConnectionFactory) ctx.lookup(CONNECTION_FACTORY_JNDI);
//通过JNDI查找获取消息目的
Destination dest = (Destination) ctx.lookup("MessageTopic");
//连接工厂创建连接
Connection conn = connFactory.createConnection();
//启动JMS连接,让它开始传输JMS消息
conn.start();
//JMS连接创建JMS会话
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
//JMS会话创建消息消费者,指定该消息消费者只对ConType属性为TXT的消息感兴趣。
MessageConsumer receiver = session.createConsumer(dest, "ConType='TXT'");
//同步接收消息,如果没有接收到消息,该方法会阻塞线程
TextMessage msg = (TextMessage) receiver.receive();
System.out.println(msg);
System.out.println("同步接收到的消息:" + msg.getText());
//关闭资源
session.close();
conn.close();
} //工具方法,用来获取命名服务的Context对象
private Context getInitialContext() {
// 参看(4)
} public static void main(String[] args) throws Exception {
PropertyConsumer consumer = new PropertyConsumer();
consumer.receiveMessage();
}
}
4. 消息的临时目的地(NetBeans创建java project: TempDestination)
MessageSender.java
package lee; import javax.jms.*;
import javax.naming.*;
import java.util.*; public class MessageSender { static final String HAD_RECEIVED = "OK"; public void sendMessage() throws NamingException, JMSException, InterruptedException {
//定义WebLogic默认连接工厂的JNDI
final String CONNECTION_FACTORY_JNDI = "weblogic.jms.ConnectionFactory";
//获取JNDI服务所需的Context
Context ctx = getInitialContext();
//通过JNDI查找获取连接工厂
ConnectionFactory connFactory = (ConnectionFactory) ctx.lookup(CONNECTION_FACTORY_JNDI);
//通过JNDI查找获取消息目的
Destination dest = (Destination) ctx.lookup("MessageQueue");
//连接工厂创建连接
Connection conn = connFactory.createConnection();
//JMS连接创建JMS会话
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
//JMS会话创建消息生产者
MessageProducer sender = session.createProducer(dest);
//设置消息生产者生产出来的消息的传递模式、有效时间。
sender.setDeliveryMode(DeliveryMode.PERSISTENT);
sender.setTimeToLive(20000);
//通过JMS会话创建一个文本消息
TextMessage msg = session.createTextMessage();
//设置消息内容
msg.setText("Hello,是否受到消息,收到请回复!");
//创建一个临时的消息目的
TemporaryQueue tempDestination = session.createTemporaryQueue();
System.out.println(tempDestination);
//修改消息的消息头
msg.setJMSReplyTo(tempDestination);
//发送消息
sender.send(msg);
Thread.sleep(5000);
//以JMS会话根据临时消息队列来创建队列浏览者
QueueBrowser browser = session.createBrowser((javax.jms.Queue) tempDestination);
//获取消息队列中所有消息
Enumeration enumer = browser.getEnumeration();
//列出消息队列中的所有消息
while (enumer.hasMoreElements()) {
TextMessage acMsg = (TextMessage) enumer.nextElement();
if (acMsg.getText().equals(HAD_RECEIVED)) {
System.out.println("对方已经收到消息!");
break;
}
}
//临时目的调用delete方法删除自己,释放资源。
tempDestination.delete();
//关闭资源
session.close();
conn.close();
} //工具方法,用来获取命名服务的Context对象
private Context getInitialContext() {
// 参看(4)
} public static void main(String[] args) throws Exception {
MessageSender sender = new MessageSender();
sender.sendMessage();
}
}
MessageReceiver.java
package lee; import javax.jms.*;
import javax.naming.*;
import java.util.*; public class MessageReceiver { static final String HAD_RECEIVED = "OK"; public void receiveMessage() throws JMSException, NamingException {
//定义WebLogic默认连接工厂的JNDI
final String CONNECTION_FACTORY_JNDI = "weblogic.jms.ConnectionFactory";
//获取JNDI服务所需的Context
Context ctx = getInitialContext();
//通过JNDI查找获取连接工厂
ConnectionFactory connFactory = (ConnectionFactory) ctx.lookup(CONNECTION_FACTORY_JNDI);
//通过JNDI查找获取消息目的
Destination dest = (Destination) ctx.lookup("MessageQueue");
//连接工厂创建连接
Connection conn = connFactory.createConnection();
//启动JMS连接,让它开始传输JMS消息
conn.start();
//JMS连接创建JMS会话
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
//JMS会话创建消息消费者,指定该消息消费者只对优先级大于5的消息感兴趣。
MessageConsumer receiver = session.createConsumer(dest);
//同步接收消息,如果没有接收到消息,该方法会阻塞线程
TextMessage msg = (TextMessage) receiver.receive();
System.out.println(msg);
System.out.println("同步接收到的消息:" + msg.getText());
//获取指定消息的replyTo消息头的信息
Destination replyTo = msg.getJMSReplyTo();
System.out.println(replyTo);
//创建发送到回复目的的消息生产者
MessageProducer sender = session.createProducer(replyTo);
TextMessage replyMsg = session.createTextMessage();
replyMsg.setText(HAD_RECEIVED);
sender.send(replyMsg);
//关闭资源
session.close();
conn.close();
} //工具方法,用来获取命名服务的Context对象
private Context getInitialContext() {
// 参看(4)
} public static void main(String[] args) throws Exception {
MessageReceiver receiver = new MessageReceiver();
receiver.receiveMessage();
}
}
5. 使用队列浏览器来查看消息(NetBeans创建java project: MessageBrowser)
MessageSender.java
package lee; import javax.jms.*;
import javax.naming.*;
import java.util.Properties; public class MessageSender { public void sendMessage() throws NamingException, JMSException {
//定义WebLogic默认连接工厂的JNDI
final String CONNECTION_FACTORY_JNDI = "weblogic.jms.ConnectionFactory";
//获取JNDI服务所需的Context
Context ctx = getInitialContext();
//通过JNDI查找获取连接工厂
ConnectionFactory connFactory = (ConnectionFactory) ctx.lookup(CONNECTION_FACTORY_JNDI);
//通过JNDI查找获取消息目的
Destination dest = (Destination) ctx.lookup("MessageQueue");
//连接工厂创建连接
Connection conn = connFactory.createConnection();
//JMS连接创建JMS会话
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
//JMS会话创建消息生产者
MessageProducer sender = session.createProducer(dest);
//设置消息生产者生产出来的消息的传递模式、有效时间。
sender.setDeliveryMode(DeliveryMode.PERSISTENT);
sender.setTimeToLive(20000);
//通过JMS会话创建一个文本消息
TextMessage msg = session.createTextMessage();
//msg.setStringProperty("ConType","txt");
//设置消息内容
msg.setText("Hello");
//发送消息
sender.send(msg);
msg.setText("Welcome to JMS");
//再次发送消息
sender.send(msg);
//关闭资源
session.close();
conn.close();
} //工具方法,用来获取命名服务的Context对象
private Context getInitialContext() {
// 参看(4)
} public static void main(String[] args) throws Exception {
MessageSender sender = new MessageSender();
sender.sendMessage();
}
}
MessageBrowser.java
package lee; import javax.jms.*;
import javax.naming.*;
import java.util.*; public class MessageBrowser { public void browseMessage() throws JMSException, NamingException {
//定义WebLogic默认连接工厂的JNDI
final String CONNECTION_FACTORY_JNDI = "weblogic.jms.ConnectionFactory";
//获取JNDI服务所需的Context
Context ctx = getInitialContext();
//通过JNDI查找获取连接工厂
ConnectionFactory connFactory = (ConnectionFactory) ctx.lookup(CONNECTION_FACTORY_JNDI);
//通过JNDI查找获取消息目的
Destination dest = (Destination) ctx.lookup("MessageQueue");
//连接工厂创建连接
Connection conn = connFactory.createConnection();
//启动JMS连接,让它开始传输JMS消息
conn.start();
//JMS连接创建JMS会话
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
//以JMS会话根据消息队列来创建队列浏览者
QueueBrowser browser = session.createBrowser((javax.jms.Queue) dest);
//获取消息队列中所有消息
Enumeration em = browser.getEnumeration();
//列出消息队列中的所有消息
while (em.hasMoreElements()) {
TextMessage msg = (TextMessage) em.nextElement();
System.out.println(msg.getText());
}
session.close();
conn.close();
} //工具方法,用来获取命名服务的Context对象
private Context getInitialContext() {
// 参看(4)
} public static void main(String[] args) throws Exception {
MessageBrowser browser = new MessageBrowser();
browser.browseMessage();
}
}
JavaEE(6) - JMS消息选择和查看的更多相关文章
- JavaEE(7) - JMS消息事务和异常
1. 使用事务性Session为消息增加事务(NetBeans创建java project: TxSession) MessageSender.java package lee; import jav ...
- JMS - 消息选择器
消息选择器 将消息选择器应用在消费者,消费者就只会接受能通过过滤器的消息.消息选择器是基于 SQL-92 条件表达式语法的一个子集.消息选择器由三个元素组成:标识符.常量和标记运算符. 标识符 标识符 ...
- 消息中间件--ActiveMQ&JMS消息服务
### 消息中间件 ### ---------- **消息中间件** 1. 消息中间件的概述 2. 消息中间件的应用场景 * 异步处理 * 应用解耦 * 流量削峰 * 消息通信 --------- ...
- JMS消息
1.消息可分为3部分:消息头.属性和有效负载 消息头:用于标识消息.声明消息属性及提供路由信息的特殊字段组成. 消息的属性区包含了和该消息有关的附加元数据,这个元数据由应用程序开发者进行设置,或者由J ...
- JMS消息通信服务
什么是Java消息服务 Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建.发送.读取消息等,用于支持JAVA应用程序开发.在J2EE中 ...
- IBM MQ消息中间件jms消息中RHF2消息头的处理
公司的技术平台在和某券商对接IBM MQ消息中间件时,发送到MQ中的消息多出了消息头信息:RHF2,造成消息的接收处理不正常.在此记录此问题的处理方式. 在IBM MQ中提供了一个参数 targetC ...
- Intellij IDEA 创建消息驱动Bean - 接收JMS消息
除了同步方式的调用之外,有时还需要异步调用,用来处理不需要即时处理的信息,例如短信.邮件等,这需要使用EJB中的独特组件——消息驱动Bean(Message-Driven Bean,MDB),它提供了 ...
- JMS开发(三):JMS消息的确认方式
这里单独列出来我也是觉得有点必要的,毕竟JMS总体知识点并不多,这点可能被很多人所忽视. 首选定义:消息的确认是指消息接受者接到消息,并做出了对应的处理之后,它将回送一个确认消息. 对于非事务性会话, ...
- JMS消息传输机制
JMS消息传送模型: 消息传送机制, 是基于拉取(pull)或者轮询(polling)的方式. JMS具备两种"消息传送模型": P2P和Pub/sub. (1) P2P:点对点 ...
随机推荐
- (摘录)SQL Server 存储过程
文章摘录:http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html SQL Server 存储过程 Transact-SQL中的存储过程 ...
- 【牛刀小试2】password保
]password保 主要知识: 1. while循环 2. do-while循环 3. if-else 4. strcmp()函数 [充电一下 ...
- 使用QT 4.8.6 + Cmake 3.0.0 编译 最新版本OpenCv3.0.0
mingw32 (x32) gcc g++ qt opencv- -- cmake -rc1 windows x64 参考文章: http://blog.csdn.net/qiurisuixiang/ ...
- BZOJ 1150 CTSC2007 数据备份Backup 堆+馋
标题效果:给定一个长度n−1n-1的序列,要求选出kk个不相邻的数使得和最小 费用流显然能跑.并且显然过不去- - 考虑用堆模拟费用流 一个错误的贪心是每次取最小.这样显然过不去例子 我们把[每次取最 ...
- ios-html-get/post差额,简而言之(MS)CheckST
get直接采取拉数据,post注射剂server.至server安全或使用get 而且由于get明确传递,password帐户A眼可以看得出来,甚至加密也可以很easy解,所以传password用po ...
- PDE_DATA 定义
PDE_DATA 定义 Location: /fs/proc/internal.h static inline struct proc_dir_entry *PDE(const struct inod ...
- MSSQL连接字符串,你真的清楚吗?
原文:MSSQL连接字符串,你真的清楚吗? 几年前当我第一次面试时,考官发现我是个新手于是他让我写个连接字符串,虽然当时就知道X种连接字符串的写法,但是当时却没能写对一个,工作多年后我仍然不能写一个正 ...
- (转)linux service理解
能够使用service命令进行操作的,就是已经注册成为linux的系统服务了.window中也可以注册成为系统服务的办法. service命令用的次数真不少,就是比较多的关联点,用了很多次了,还是有些 ...
- Android Stuido怎样查看快捷键冲突?
看了这篇文章Android Studio怎样查看资源或者函数在哪些类中被引用.知道了快捷键失效的原因,当中有一个原因就是快捷键冲突.那怎样查看快捷键哪些项冲突了呢? Android Studio要查看 ...
- c#中的属性
在C#中我们可以很自由的访问共有字段,但有时我们可能需要某字段只能读或者写,或在改变字段值得时候做一些其他事情,显然这些仅仅依靠字段是无法实现的,于是便有了属性. 1.基本用法 c#中的属性由属性作用 ...