消息驱动bean是一种通过消息方式为外界提供服务的组件。mdb和它的使用者之间是一种松散耦合的关系:由于mdb组件在使用的过程中,其客户并不拥有mdb组件的远程(程序中并没有将接口打包引入到客户端)引用,而是直接将消息发送到特定的队列中,因而用户的调用并不强求mdb组件的运行,在mdb组件没有运行的情况下,客户发送的请求数据会临时保存到消息队列中,当mdb组件加载后,消息队列中的调用消息才能得到处理。java ee规范并没有规定mdb将处理结果返回给消息调用者的方式,但是通常情况下mdb组件是将处理玩的结果以消息方式发送到特定结果队列中,如果客户程序没有运行,结果会临时存放在消息队列中,直到客户程序启动,结果队列中的消息才能得到处理。mdb可以和两种消息队列关联,如果和Topic型的队列关联,则客户发送到队列中的消息。会依次广播给所有的mdb组件,所有的mdb组件会得到相同的消息。mdb组件和具体的业务逻辑无关,从特定的消息队列中获得消息,消息内容要在mdb的onMessage方法中处理,具体的而业务逻辑通常委托给其他的ejb组件。下面就做一个简单的例子。1 使用Eclipse创建EJB工程2 创建消息驱动Bean代码:package com.wnq.mdbBean;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
@MessageDriven(
activationConfig = {
//
@ActivationConfigProperty(propertyName="connectionFactoryJndiName",propertyValue="jmsfactory"),
//消息类型
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "jmstest")
},
//这一句非常重要,给消息驱动Bean定义一个外部访问的JNDI名
mappedName = "jmstest")
public class MdbBean implements MessageListener {
public MdbBean() {
}
public void onMessage(Message message) {
TextMessage msg=(TextMessage)message;
try {
System.out.println("MyQueueMDBBean被调用了"+msg.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
3 客户端
客户端的作用是向weblogicJms发送消息。
package mdbBeanClient;
import java.util.Properties;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class MyQueueMDBBeanClient {
public static void main(String[] args) throws JMSException {
String url="t3://127.0.0.1:7001";
Properties p=new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
p.put(Context.PROVIDER_URL, url);
try {
Context context=new InitialContext(p);
//获得JMS信息连接队列工厂
QueueConnectionFactory connFactory=(QueueConnectionFactory)context.lookup("jmsfactory");
//获得JMS信息链接队列
QueueConnection qConn=connFactory.createQueueConnection();
//产生队列session,设置事务模拟模式为false,自动应答消息接受
QueueSession qSession=qConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
qConn.start();
//获得队列
Queue queue=(Queue)context.lookup("jmstest");
//创建文本消息
TextMessage msg=qSession.createTextMessage("请问你是消息驱动Bean吗?<你终于接收到我的消息了,真的不简单啊,累死宝宝了!>");
QueueSender qSender=qSession.createSender(queue);
qSender.send(msg);
System.out.println("消息已经发送");
} catch (NamingException e) {
e.printStackTrace();
}
}
}
4Eclipse截图
5weblogic控制台截图