这里我的环境是MyEclipse8.0 + WebLogic10.3 + Ubuntu9.10,EJB的开发其实与这三个环境没有关系,我最早也是在WindowsVista + MyEclipse6.0 + WebLogic10.3上开发成功的,关于Weblogic配置JMS服务大家可以去搜一下,有好多,这里主要是在环境都OK的基础上配置开发MDB,首先是我的MDB代码:
/**
* 测试的MDB
*
* @author 王硕
*
*/
@MessageDriven (activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") }, mappedName = "jms/FileQueue")
public class DemoMDB implements MessageListener {
public void onMessage(Message message) {
System.out.println("消息驱动Bean测试成功");
}
}
业务逻辑比较简单,相信大家都知道关键在于能请求到就可以了,这里需要注意的是@MessageDriven的配置,注意,上面的是Weblogic服务器的配置方式,JBoss的还不一样,一会再告诉大家,这里起码WebLogic10.3是必须至少要这么配置才可以,也就是说至少需要那3个属性,很多书上与其它文章上转载的配置方式都不对,我也是按书上说的文章上说的配了半天都不对,尤其是那个mappedName,N多的书上说那是个可选的建议不要使用的服务器专有属性,但是,这里必须要这样配置,才可以生效,JBoss的配置是这样:
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/JBossQueue"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") })
这里不需要mappedName来指定消息的目的地,而是用destination指定的,区别于WebLogic的配置方式,配置完MDB后就是要访问它了,我是在SessionBean里面访问它的,这里的配置也需要注意:
/**
* 测试的无状态会话Bean
*
* @author 王硕
*
*/
@Stateless(name = "DemoSessionBean")
public class DemoSessionBean implements Demo {
@Resource(mappedName = "jms/QueueConnectionFactory")
private QueueConnectionFactory mdbQCF;
@Resource(mappedName = "jms/FileQueue")
private Queue mdbQueue;
private QueueConnection qcon = null;
public QueueConnectionFactory getMdbQCF() {
return mdbQCF;
}
public void setMdbQCF(QueueConnectionFactory mdbQCF) {
this.mdbQCF = mdbQCF;
}
public Queue getMdbQueue() {
return mdbQueue;
}
public void setMdbQueue(Queue mdbQueue) {
this.mdbQueue = mdbQueue;
}
public QueueConnection getQcon() {
return qcon;
}
public void setQcon(QueueConnection qcon) {
this.qcon = qcon;
}
public QueueSession getQsession() {
return qsession;
}
public void setQsession(QueueSession qsession) {
this.qsession = qsession;
}
public QueueSender getQsender() {
return qsender;
}
public void setQsender(QueueSender qsender) {
this.qsender = qsender;
}
private QueueSession qsession = null;
private QueueSender qsender = null;
public void print() {
System.out.println("Demo测试成功");
}
public void sendMessage() {
try {
qcon = mdbQCF.createQueueConnection();
qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
qsender = qsession.createSender(mdbQueue);
ObjectMessage msg = qsession.createObjectMessage();
qcon.start();
qsender.send(msg);
qsender.close();
qsession.close();
qcon.close();
System.out.println("Message send success");
} catch (Exception e) {
e.printStackTrace();
}
}
}