消息驱动Bean(MDB)编写规则

来源:互联网 发布:ug编程等高开粗经验 编辑:程序博客网 时间:2024/05/21 08:09

一、 MDB实现类,实现MessageDrivenBeanMessageListener接口

javax.ejb
public interface MessageDrivenBean extends EnterpriseBean

The MessageDrivenBean interface is implemented by every message-driven enterprise Bean class. The container uses the MessageDrivenBean methods to notify the enterprise Bean instances of the instance's life cycle events.

Method Summary :
 void ejbRemove()
          A container invokes this method before it ends the life of the message-driven object.
 void setMessageDrivenContext(MessageDrivenContext ctx)
          Set the associated message-driven context.

------------------------------------------------

javax.jms
public interface MessageListener
A MessageListener object is used to receive asynchronously delivered
messages.

Each session must insure that it passes messages serially to thelistener. This means that a listener assigned to one or more consumersof the same session can assume that the onMessage method is not calledwith the next message until the session has completed the last call.

Method Summary :
 void onMessage(Message message)
          Passes a message to the listener.

--------------------------------------------------------------------

加上注释信息:当MDB 部署时,容器将会用到其中的注释信息

@MessageDriven(
 activationConfig ={
   @ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Queue"),
   @ActivationConfigProperty(propertyName="destination",propertyValue="queue/myqueue")
 }
)

它相当于“键-值”对,

activationConfig --> ActivationConfigProperty-->[属性名="监听的目标类型",属性值="具体类型"]

                           --> ActivationConfigProperty-->[属性名="监听的目标",属性值="具体监听的JNDI名"]

根据上面的JNDI名:queue/myqueue,在D:\jboss-5.1.0GA\server\default\deploy下的mail-service.xml中加上如下代码:

<mbean code="org.jboss.mq.server.jmx.Queue" name="jboss.org.destination:server=Queue,name=myqueue" >   <attribute name="JNDIName" >queue/myqueue</attribute>   <depends optional-attribute-name = "DestinationManager" > jboss.mq:service=DestinationManager </depends> </mbean>

消息的类型如下:

· StreamMessage -- Java原始值的数据流

· MapMessage--一套名称-值对

· TextMessage--一个字符串对象

· ObjectMessage--一个序列化的 Java对象

· BytesMessage--一个未解释字节的数据流

这里列出onMessage方法:(当容器检测到bean守候的队列一条消息时,就调用onMessage()方法,将消息作为参数传入

public void onMessage(Message msg) {
  TextMessage textMessage =(TextMessage)msg;
  try {
   System.out.println("MDBBean被调用了【"+textMessage.getText()+"】");
  } catch (JMSException e) {
   e.printStackTrace();
  }
 }

 

------------------------------------------------------------------------------------------------------

 

二、MDB测试类,发送消息给MDB。

先看一下JMS对象模型:

  JMS对象模型包含如下几个要素:

  1)连接工厂。连接工厂(ConnectionFactory)是由管理员创建,并绑定到JNDI树中。客户端使用JNDI查找连接工厂,然后利用连接工厂创建一个JMS连接。

  2)JMS连接。JMS连接(Connection)表示JMS客户端和服务器端之间的一个活动的连接,是由客户端通过调用连接工厂的方法建立的。

  3)JMS会话。JMS会话(Session)表示JMS客户与JMS服务器之间的会话状态。JMS会话建立在JMS连接上,表示客户与服务器之间的一个会话线程。

  4)JMS目的。JMS目的(Destination),又称为消息队列,是实际的消息源。

  5)JMS生产者和消费者。生产者(Message Producer)和消费者(Message Consumer)对象由Session对象创建,用于发送和接收消息。

  6)JMS消息通常有两种类型:

  ① 点对点(Point-to-Point)。在点对点的消息系统中,消息分发给一个单独的使用者。点对点消息往往与队列(javax.jms.Queue)相关联。

  ② 发布/订阅(Publish/Subscribe)。发布/订阅消息系统支持一个事件驱动模型,消息生产者和消费者都参与消息的传递。生产者发布事件,而使用者订阅感兴趣的事件,并使用事件。该类型消息一般与特定的主题(javax.jms.Topic)关联。
------------------------------------------------------------------------------------------------------

看几个相关api:  (Queue、Topic都是Destination的子接口)

DestinationA Destination object encapsulates a provider-specific address.

MessageConsumerA client uses a MessageConsumer object to receive messages from a destination.MessageListenerA MessageListener object is used to receive asynchronously delivered messages.MessageProducerA client uses a MessageProducer object to send messages to a destination.

QueueReceiverA client uses a QueueReceiver object to receive messages that have been delivered to a queue.QueueSenderA client uses a QueueSender object to send messages to a queue.QueueSessionA QueueSession object provides methods for creating QueueReceiver,QueueSender,QueueBrowser, andTemporaryQueue objects.

 

我们根据JMS对象模型所包含的要素来编写消息的发送类:

1.获取QueueConnectionFactory对象
      InitialContext context =new InitialContext();
      QueueConnectionFactory factory =(QueueConnectionFactory)context.lookup("ConnectionFactory");

2.创建QueueConnection
      QueueConnection connnection =factory.createQueueConnection();
     
3.创建QueueSession
      QueueSession session =connnection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
     
4.获取Destination对象
      Queue queue =(Queue)context.lookup("queue/myqueue");
     
5.获取文本信息
      TextMessage msg =session.createTextMessage();


6.创建发布者

     QueueSender sender =session.createSender(queue);

 

现在编写一个循环,发送5条消息:

for(int i=0;i<5;i++){
       msg.setText("消息      "+i);
       //发送消息
       sender.send(msg);
      }

------------------------------------------------

现在对运行结果进行预测:

客户机通过JMS发送消息到JMS Destination (Queue或Topic)来访问消息驱动bean,而消息驱动bean类是JMS Destination的MessageListener。

运行过程:发送5个消息(消息 1、消息 2、消息 3、消息 4、消息 5)到JMS目的(Destination)

消息驱动bean类是JMS Destination的MessageListener,监听到消息后调用onMessage(Message msg)方法去处理消息,

在控制台输出:“MDBBean被调用了【"+textMessage.getText()+"】”。

MDBean被调用了【消息  1】

MDBean被调用了【消息 2】

MDBean被调用了【消息 3】

MDBean被调用了【消息 4】

MDBean被调用了【消息 5】

 

应用程序的结构如下图:

消息驱动bean是一个异步消息使用者。当JMS消息到达时,容器激发消息驱动bean。

消息驱动bean既没有本地接口也没有组件接口。消息驱动bean实例是一个消息驱动bean类的实例

详见百度百科:消息驱动Bean

 

具体源码示例,见MyBlog:myeclipse8+jboss5开发EJB3消息驱动Bean(MDB)实例

原创粉丝点击