开发消息驱动bean 1

Java消息服务(Java Message Service)
Java消息服务简称JMS 是用于访问企业消息系统的开发商中立的API,企业消息系统可以协助应用软件通过网络进行消息交互

开发消息驱动bean <wbr>1

应用程序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表示

开发消息驱动bean <wbr>1

消息只传递给一个监听,谁先来,谁优先

 

Pub/sub消息传递模型允许一条消息传递给多个接收方。采用

javax.jms.Topic表示
开发消息驱动bean <wbr>1

这两种模型都通过扩展公用基类来实现。例如: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文件

开发消息驱动bean <wbr>1

运行,发送消息(控制台上无输出)


打开jboss管理后台jmx-console,找到jboss目录下
service=JNDIView连接,找到里面的list()方法,Invoke
在全局命名空间下,查找到Queue的连接工厂的JNDI,就叫QueueConnectionFactory

猜你喜欢

转载自leon-s-kennedy.iteye.com/blog/1539396