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消息选择和查看的更多相关文章

  1. JavaEE(7) - JMS消息事务和异常

    1. 使用事务性Session为消息增加事务(NetBeans创建java project: TxSession) MessageSender.java package lee; import jav ...

  2. JMS - 消息选择器

    消息选择器 将消息选择器应用在消费者,消费者就只会接受能通过过滤器的消息.消息选择器是基于 SQL-92 条件表达式语法的一个子集.消息选择器由三个元素组成:标识符.常量和标记运算符. 标识符 标识符 ...

  3. 消息中间件--ActiveMQ&JMS消息服务

    ### 消息中间件 ### ---------- **消息中间件** 1. 消息中间件的概述 2. 消息中间件的应用场景 * 异步处理 * 应用解耦 * 流量削峰 * 消息通信   --------- ...

  4. JMS消息

    1.消息可分为3部分:消息头.属性和有效负载 消息头:用于标识消息.声明消息属性及提供路由信息的特殊字段组成. 消息的属性区包含了和该消息有关的附加元数据,这个元数据由应用程序开发者进行设置,或者由J ...

  5. JMS消息通信服务

    什么是Java消息服务 Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建.发送.读取消息等,用于支持JAVA应用程序开发.在J2EE中 ...

  6. IBM MQ消息中间件jms消息中RHF2消息头的处理

    公司的技术平台在和某券商对接IBM MQ消息中间件时,发送到MQ中的消息多出了消息头信息:RHF2,造成消息的接收处理不正常.在此记录此问题的处理方式. 在IBM MQ中提供了一个参数 targetC ...

  7. Intellij IDEA 创建消息驱动Bean - 接收JMS消息

    除了同步方式的调用之外,有时还需要异步调用,用来处理不需要即时处理的信息,例如短信.邮件等,这需要使用EJB中的独特组件——消息驱动Bean(Message-Driven Bean,MDB),它提供了 ...

  8. JMS开发(三):JMS消息的确认方式

    这里单独列出来我也是觉得有点必要的,毕竟JMS总体知识点并不多,这点可能被很多人所忽视. 首选定义:消息的确认是指消息接受者接到消息,并做出了对应的处理之后,它将回送一个确认消息. 对于非事务性会话, ...

  9. JMS消息传输机制

    JMS消息传送模型: 消息传送机制, 是基于拉取(pull)或者轮询(polling)的方式.  JMS具备两种"消息传送模型": P2P和Pub/sub. (1) P2P:点对点 ...

随机推荐

  1. XMPP我写底层协议(零)--废话和准备开幕前

    当我想写一个非常早期的一点总结.但总是忙没有时间停止做这样的事情. 秦与我的兄弟之前说的,这并不是说我没开灵.但是,因为很多事情还没有时间来写blog. 我没有完全理解,真到自己在这个位置上的时间,能 ...

  2. 【原创】纯OO:从设计到编码写一个FlappyBird (四)

    第三部分请点这里 这里来实现Obstacle类.其实flappybird的本质就是小鸟原地掉,然后几根柱子在走.这也是在Game类里,用obs.move()来实现游戏逻辑的原因. 我们首先必须确定几个 ...

  3. HDoj-2084-号码塔-dp

    号码塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  4. 网页信息抓取进阶 支持Js生成数据 Jsoup的不足之处

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23866427 今天又遇到一个网页数据抓取的任务,给大家分享下. 说道网页信息抓取 ...

  5. HDU 4311 Meeting point-1 && HDU 4312 Meeting point-2

    这俩个题  题意::给出N(<1e5)个点求找到一个点作为聚会的地方,使每个点到达这里的距离最小.4311是 曼哈顿距离 4312是 切比雪夫距离: 曼哈顿距离 :大家都知道 对于二维坐标系a( ...

  6. Atitit.软件GUIbutton和仪表板(01)--警报系统--

    Atitit.软件GUIbutton和仪表板(01)--警报系统-- 1. 温度报警防区(鲁大师,360taskman) 1 2. os-区-----cpu_mem_io资源占用监測 1 3. Vm区 ...

  7. 大约SQL现场“这包括”与“包括在”字符串的写法

     1.字段查找表值"这包括"方法一字符串的所有记录 如果表中有一name场,查询name这包括"乔 - 史密斯"所有记录.能够写sql: Stirng st ...

  8. 【cocos2dx-3.0beta-制作flappybird】尾随时代潮流,关于引擎升级

    cocos2dx3.1版本号会被释放出,本来,我自己想要这个升级到官方的3.0版本号.只是无奈3.0坑的正式版不会做,偶数帧动画是正确及时的问题,果断放弃,随着广大淫民的支持.我已经升级到最新的代码c ...

  9. iOS_17_控制开关_TabBarController_由storyboard道路

    最后效果图: main.storyboard BeyondViewController.m中有一句关键代码,设置tabbarItem图片的样式(30*30) // // BeyondViewContr ...

  10. IDF - CTF - 牛刀小试

    找学校CTF好地方,IDF实验室CTF训练营(http://ctf.idf.cn/). . 刚接触CTF.来玩下牛刀小试.AK了. . 好爽好爽.. 1.摩斯password 嘀嗒嘀嗒嘀嗒嘀嗒 时针它 ...