JMS (Java Message Service)是由SUN开发的一套API,它为开发者提供一套访问MOM(Message-Oriented Middleware:面向消息中间件)的标准方法。
JMS 分为两种消息域PTP(点对点)和Pub/Sub(发布/订阅)。PTP消息被产生者放入到一个队列中,消费者则从小消息列队中取走消息,消息一担取走,消息就从队列中移除。Pub/Sub消息和PTP最大的不同在于发布者发布一条消息后可以发送给所有订阅者,所有订阅者都拥有处理某一条消息的机会。(如图1)
(图1)
发布者A 发布者B
| |
--------MOM 消息中间件-----------------------
| 娱乐/音乐 it/管理 |
________________________________
订阅者A 订阅者B 订阅者C (都能享受上面的服务,不用理会谁发布的)
JMS的一些重要接口
ConnectionFactory :创建一个受管理对象
Connection :连接到提供者的活动连接
Destination :一个封装消息目标地址的受管理对象,如消息的来源地和发送滴,根据消息域的不同有两个接口:Queue 和 Topic,前者对应PTP消息的目标地址,后者对应Pub/Sub消息的目标地址。
Session :发送和接受消息的单线程环境。(即一次会话)
MessageProducer:用于发送消息
MessageConsumer:用于接收消息
JMS高级接口与特定域接口(位于javax.jms包中)
高级接口
|
PTP域子接口
|
PUB/SUB域子接口
|
ConnectionFactory
|
QueueConnectionFactory
|
TopicConnectionFactory
|
Connection
|
QueueConnection
|
TopicConnection
|
Destination
|
QueueDestination
|
TopicDestination
|
Session
|
QueueSession
|
TopicSession
|
MessageProducer
|
QueueMessageProducer
|
TopicMessageProducer
|
MessageConsumer
|
QueueMessageConsumer
|
TopicMessageConsumer
|
一个典型的JMS程序要经过以下步骤才能开始创建和使用消息
1、通过JNDI查询ConnectionFactory
2、用ConnectionFactory创建一个Connection
3、用Connection创建一个或多个Session
4、通过JNDI查询一个或多个Destination
5、用Session和Destination创建对应的MessageProducer和MessageConsumer
6、启动Connection
JMS消息结构
JMS根据不同应用的用途定义了多种消息类型,由Message接口派生而来,一个Message由Header、Properties和Body三个部分组成。
Header是一组标准键值字段,客户端和提供者都用它来标识和路由消息。
Properties用于弥补Header的不足,可以通过手工设置其他的属性,Message提供了set<Type>Property(String name)和get<Type>Property()方式来让开发者任意定义属性。
Body消息正文,包括了发送给其他程序的消息内容,根据消息体内容的不同,JMS拥有5个消息类型,并分别通过Message的5个子接口来描述。
消息类型
|
说明
|
TextMessage
|
消息是一个字符
|
ObjectMessage
|
消息是一个实现了Serializable接口的对象
|
MapMessage
|
消息是一个MAP,包括一组键值对元素,键位一个字符,值为任意对象
|
BytesMessage
|
消息是一个二进制数组
|
StreamMessage
|
消息是一组JAVA原始类型数据,这些数据通过标准流操作按顺序进行填充和读取
|
消息收发的机制:
JMS事务使用了Session对它进行操作,分别拥有支持事务语义的3个方法,通过这些方法启动,提交和回滚一个事务,这些方法分别是begin()、commit()和rollback()。
消息确认是接收者在成功接收到消息后,将一个回执发送给MOM,告之已经成功接收到一种通知机制。确认方式有三种分别是:
1、 Session.AUTO_ACKNOWLEDGE:在完成接收消息时,Session自动发送一个确认回执。
2、 Session.CLIENT_ACKNOWLEDGE:由客户端程序通过手工调用Message.acknowledge()方法显示确认接收。
3、 Session.DUPS_OK_ACKNOWLEDGE:让Session延迟发送确认回执。
例如:创建一个不需事务,自动确认的session方式
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
消息选择是一种选择机制,类似于SQL的查询条件。
发送消息例子:
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
import javax.jms.Destination;
publicclass MessageSender {
/**
*发送方法
*@parammsgText
*/
publicvoid send(String msgText){
// 获取jms连接
Connection connection = null;
try {
// 获取JNDI上下文
InitialContext ctx = new InitialContext();
ConnectionFactory cFactory = (ConnectionFactory)ctx.lookup("jndi/jmsConn");
// 获取Destination 目标地址
Destination dest = (Destination)ctx.lookup("jndi/dest");
ctx.close();
// 获取一个MOM的连接
connection = cFactory.createConnection();
// 创建JMS会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建一个指定特定目标地址的消息发送者
MessageProducer sender = session.createProducer(dest);
// 建立Body内容
TextMessage message = session.createTextMessage(msgText);
// 发送给服务器
sender.send(message);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
|
接收消息例子:
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
publicclass MessageReceiver {
/**
*接收方法
*/
publicvoid receive(){
Connection connection = null;
try {
// 创建JNDI上下文
InitialContext ctx = new InitialContext();
ConnectionFactory cFactory = (ConnectionFactory)ctx.lookup("jndi/jmsConn");
// 获取目标地址信息
Destination dest = (Destination)ctx.lookup("jndi/dest");
ctx.close();
// 获取连接
connection = cFactory.createConnection();
// 获取连接对话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建一个指向特定目标地址的消息消费者
MessageConsumer receiver = session.createConsumer(dest);
// 接收发送请求中的消息信息
TextMessage textMsg = (TextMessage)receiver.receive();
System.out.println("获取内容:" + textMsg.getText());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
|
分享到:
相关推荐
jms学习笔记jms学习笔记jms学习笔记
JMS学习笔记,详解,实例,安装软件精心总结
NULL 博文链接:https://yuxisanren.iteye.com/blog/1912587
NULL 博文链接:https://kingwolf543.iteye.com/blog/965679
JavaEE5学习笔记03-JMS介绍与使用..
JMS教程,学习笔记,基于XML和JMS的异构数据交换集成
NULL 博文链接:https://yingzhuo.iteye.com/blog/1566635
自己辛苦整理的网上的JBoss ESB学习笔记 ,非常详细,代码操作都有截图; 希望大家多支持! 学习笔记PDF的目录如下: 1——搭建ESB开发环境 2 2——第一个ESB代码Hello World 12 3——第二个ESB代码Hello World ...
简单介绍了springdata的知识,包含了springdata 的环境搭建,注解开发等,还有一系列相关的代码供参考。
activeMQ学习笔记,JMS有两种传递消息的方式。标记为NON_PERSISTENT的消息最多投递一次,而标记为PERSISTENT的消息将使用暂存后再转送的机理投递。如果一个JMS服务离线,那么持久性消息不会丢失但是得等到这个服务...
Java分布式应用学习笔记09JMX-MBean的介绍
Java分布式应用学习笔记08JMX规范与各种监控场景
JPA学习笔记-EJB-06JPA+Spring使用经验。
6.2:JMS 172 6.3:Socket 182 6.4:WebService 189 6.5:集群分布式应用(以JBOSS为例) 190 6.6:JNLP原理及应用: 190 6.7:Log4原理及应用: 191 6.8:JFreeChat原理及应用: 191 6.9:几种常用协议 192 7.0:SOA原理 200 8...
EJB之消息驱动Bean的总结。ejb 消息驱动Bean j2ee jms java
现在java家族已经十分强大,每个分支都成为一门学问了,例如web前台开发用的applet,后台要用的servlet;做企业系统,EJB;消息中间件JMS;手机j2me开发手机、数字家电,这也是当初设计java的。
讲解了camel、jms、activeMQ的使用方法,讲解了JBI的原理!
springboot学习笔记 spring基础 Spring概述 Spring的简史 xml配置 注解配置 java配置 Spring概述 Spring的模块 核心容器CoreContainer Spring-Core Spring-Beans ...