开发消息驱动bean 1
Java消息服务(Java Message Service)
Java消息服务简称JMS 是用于访问企业消息系统的开发商中立的API,企业消息系统可以协助应用软件通过网络进行消息交互
应用程序A与应用程序B 并没有代码关联
通过JBOSS JMS服务器 解耦
?
JMS中的消息:
消息传递系统的中心就是消息。一条Message由三个部分组成:
头(header)、属性(property)和主体(body)
?
消息有下面几种类型,他们都是继承自Message接口
StreamMessage:一种主体中包含Java基元值流的消息。其填充和读
取均按顺序进行
MapMessage:一种主体中包含一组名-值的消息。没有定义条目顺序
TextMessage:一种主体中包含Java字符串的消息(例如,XML信息)最常用
ObjectMessage:一种主体中包含序列化Java对象的消息
BytesMessage:一种主体中包含连续字节流的消息
?
消息的传递模型:
JMS支持两种消息传递模型:点对点(point-to-point,简称PTP)和发布/订阅(publish/subscribe,简称pub/sub)。这两种消息传递模型非常相似,但有以下区别:
PTP消息传递模型规定了一条消息只能传递给一个接收方。采用javax.jms.Queue表示
消息只传递给一个监听,谁先来,谁优先
?
Pub/sub消息传递模型允许一条消息传递给多个接收方。采用
javax.jms.Topic表示
这两种模型都通过扩展公用基类来实现。例如:javax.jms.Queue和
javax.jms.Topic都扩展自javax.jms.Destination类
?
配置目标地址:
开始JMS编程前,需要先配置消息到达的目标地址(Destination),
因为只有目标地址存在了,才能发送消息到这个地址。由于每个应
用服务器关于目标地址的配置方式都有所不同,下面以jboss为例,
配置一个queue类型的目标地址
<?xml version="1.0" encoding="UTF-8"?>
<server>
??<!-- 目标地址的名称ejb3testQueue?-->
??<mbean code="org.jboss.mq.server.jmx.Queue"?
?????????name="jboss.mq.destination:service=Queue,name=ejb3testQueue">
?????<!-- 指定ejb3testQueue地址的JNDI名称 -->
?????<attribute name="JNDIName">queue/ejb3testQueue</attribute>
?????<depends optional-attribute-name="DestinationManager">
?????????jboss.mq:service=DestinationManager
?????</depends>
??</mbean>
</server>
jboss使用一个XML文件配置队列地址,文件的取名格式应遵守*-service.xml
当jboss遇到*-service.xml文件时,会把它当成服务去发布
这里取名为:ejb3testQueue-service.xml?
<attribute name="JNDIName">属性指定了该目标地址的全局JNDI名称。如果不指定JNDIName属性,jboss会为它自动生成一个默认的全局JNDI,其名称由“queue”+“/”+目标地址名称组成。
另外在任何队列或主体被部署之前,应用服务器必须先部署Destination Manager Mbean,所以通过<depends>节点声明这一依赖。
在目标地址发布之前,先发布依赖服务(目标地址的管理器服务)
当目标地址编写好之后,进行发布,其过程和发布数据源、EJB一样
复制到当前配置项\deploy目录下
部署进jboss之后,控制台将输出信息,该JNDI名称
为:queue/ejb3testQueue
它前面没有java: 说明是全局JNDI名称,可以被外部访问
?
之后进入jboss管理后台jmx-console,找到jboss.mq.destination
栏目,找到刚才发布的目标地址,点进去后,可看到J绑定的NDIName属性名称
EJB中的资源,都是通过JNDI名称进行绑定的
-------------------------------------------------------
在java类中发送消息:
1.得到一个JNDI初始化上下文(Context)
InitialContext ctx = new InitialContext();
2.根据上下文查找一个连接工厂QueueConnectionFactory。该连接工厂是由JMS提供的,不需要自己
创建,每个厂商都为它绑定了一个全局JNDI,通过它的全局JNDI便可获取它:
QueueConnectionFactory factory = (QueueConnectionFactory)ctx.lookup
("QueueConnectionFactory");
3.从连接工厂得到一个连接QueueConnection
conn = factory.createQueueConnection();
4.通过连接来建立一个会话(Session):
session = conn.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);;
是否使用事务,消息接受的确认模式(使用默认自动)
5.查找目标地址:
例子对应代码:Destination destination = (Destination)ctx.lookup("ejb3testQueue");
返回是一个Queue的对象,这里用它的父类去引用它
6.根据会话以及目标地址来建立消息生产者(发送者)MessageProducer
(QueueSender和TopicPublisher都扩展自MessageProducer接口)
例子对应代码:MessageProducer producer = session.createProducer(destination);
传入代表要发送到的地址作为参数
TextMessage msg = session.createTextMessage("您好,这是我第一个消息驱动Bean");
producer.send(msg);
当发送消息之后,需要关闭会话、关闭连接
新建一个MessageDrivenBean的java Project项目,添加进所有EJBjar包
在src下建立java类QueueSender(com.jboss.app包),用于发送Queue
勾选main()
在类路径下添加jndi.properties文件
运行,发送消息(控制台上无输出)
打开jboss管理后台jmx-console,找到jboss目录下
service=JNDIView连接,找到里面的list()方法,Invoke
在全局命名空间下,查找到Queue的连接工厂的JNDI,就叫QueueConnectionFactory