消息驱动bean的主要用于接受和处理异步消息,这些信息可能来自一个外部的系统或者同一个应用中的其它组件,之所以称它们为异步,那时因为这些消息可以在任何时候到达,而不同于一般的远程方法调用的结果,是立马直接得到的。同UI的事件处理工作方式类似,消息驱动bean用于监听发送给它的异步消息。值得注意的是,与远程调用方法不同,异步消息的发送者不会停下来去等待对方的响应。
要实现消息驱动bean(message driven bean),首先要在WebLogic上配置JMS服务,具体配置方法参考http://blog.csdn.net/xuxian361/article/details/8080229
服务器端接收消息的代码如下:
MessageBean.java
package testMDB;
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="destinationType",propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="connectionFactoryJndiName",propertyValue="jms/MyMDB-Factory"),
@ActivationConfigProperty(propertyName="destinationJndiName",propertyValue="jms/MyMDB"),
@ActivationConfigProperty(propertyName="initialContextFactory",propertyValue="weblogic.jndi.WLInitialContextFactory")
})
public class MessageBean implements MessageListener {
@Override
public void onMessage(Message msg) {
TextMessage tm = (TextMessage) msg;
try {
System.out.println("hello MDB"+"------"+tm.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
@MessageDriven:申明MDB,并进行参数配置。
实现MessageListener接口中的onMessage方法,收到消息后作出响应。
客户端发送消息,代码如下:
index.jsp
<%@ page language="java" import="java.util.Properties,javax.jms.Queue" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page import="javax.jms.*,javax.naming.*;"%>
<%
QueueConnection cnn = null;
QueueSender sender = null;
QueueSession sess = null;
Queue queue = null;
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
props.put(Context.PROVIDER_URL, "t3://localhost:7001");
try {
InitialContext ctx = new InitialContext(props);
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("jms/MyMDB-Factory");
cnn = factory.createQueueConnection();
sess = cnn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
queue = (Queue) ctx.lookup("jms/MyMDB");
TextMessage msg = sess.createTextMessage("消息");
sender = sess.createSender(queue);
sender.send(msg);
sess.close();
} catch (NamingException e) {
e.printStackTrace();
} catch (JMSException e) {
e.printStackTrace();
}
%>
通过JNDI创建工厂与queue,然后创建queueSession与sender,再发送消息。