您的位置:首页 > 其它

通过会话Bean发送JMS消息给MDB的实例

2009-09-25 15:50 369 查看
MDB是通过JMS消息驱动的,当消息队列中有消息时,将会引发MDB的onMessage方法调用,而这些JMS消息可能来自于各种消息生产者,比如POJO、其他消息中间件、EJB等,本实例使用无状态会话Bean发送JMS消息。

本实例的平台为:netbeans6.7.1 + jdk1.6 + Glassfish2.1 + JSF1.2

实现流程是:通过将jsp页面表单中输入的文本消息,发送给JSF后台受管BEAN,受管BEAN再以文本消息作为参数调用会话Bean,会话Bean将文本消息打包成TextMessage发送到消息队列(消息目的地)当中。消息队列再驱动MDB对消息进行处理,并打印处理。

jsp页面:

<h1><h:outputText value="开始发送消息给MDB"/></h1>
<h:form>
<h:outputLabel for="message" value="输入消息"/>
<h:inputText id="message" value="#{NewJSFManagedBean.message}"/>
<h:commandButton type="submit" value="发送" action="#{NewJSFManagedBean.sendMes}"/>
</h:form>


受管BEAN:

package Sing.temp;

import javax.ejb.EJB;

public class NewJSFManagedBean {
@EJB
private NewSession nsb;

private String message;

public NewJSFManagedBean() {
}

public void sendMes(){
System.out.print("run into ManagedBean!");
nsb.sendMes(this.message);
}

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

}


无状态会话Bean:

package Sing.temp;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

@Stateless
@Remote(NewSession.class)
public class NewSessionBean implements NewSession {
@Resource(name = "jms/MyQueue")
private Queue myQueue;
@Resource(name = "jms/MyQueueFactory")
private ConnectionFactory myQueueFactory;

public void sendMes(String mes) {
System.out.print("run into NewSessionBean!");
System.out.print(mes + ":session is used to sent!");
try {
sendJMSMessageToMyQueue(mes);
} catch (JMSException ex) {
Logger.getLogger(NewSessionBean.class.getName()).log(Level.SEVERE, null, ex);
}
}

private Message createJMSMessageForjmsMyQueue(Session session, Object messageData) throws JMSException {
// TODO create and populate message to send
TextMessage tm = session.createTextMessage();
tm.setText(messageData.toString());
return tm;
}

private void sendJMSMessageToMyQueue(Object messageData) throws JMSException {
Connection connection = null;
Session session = null;
try {
connection = myQueueFactory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer messageProducer = session.createProducer(myQueue);
messageProducer.send(createJMSMessageForjmsMyQueue(session, messageData));
} finally {
if (session != null) {
try {
session.close();
} catch (JMSException e) {
Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "Cannot close session", e);
}
}
if (connection != null) {
connection.close();
}
}
}

}


@Resource(name = "jms/MyQueue")
private Queue myQueue;
是注入的JMS目标资源

@Resource(name = "jms/MyQueueFactory")
private ConnectionFactory myQueueFactory;

是注入的JMS连接工厂

这两个资源应该保证已经在Glassfish中已经存在,没有的话,请登陆控制台,进行添加。当然在NETBEANS中可以右键源代码行,选择【插入代码】,然后选择【发送JMS消息】,在出现的对话框窗口中进行添加。

无状态会话Bean接口:

package Sing.temp;

public interface NewSession {

void sendMes(String mes);

}


消息驱动Bean:

package Sing.temp;

import java.util.logging.Level;
import java.util.logging.Logger;
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(mappedName = "jms/MyQueue", activationConfig =  {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class NewMessageBean implements MessageListener {

public NewMessageBean() {
}

public void onMessage(Message message) {
TextMessage tm=(TextMessage)message;
try {
String mesStr = (String) tm.getText();
System.out.print("从队列中获取到消息:");
System.out.print(mesStr);
} catch (JMSException ex) {
Logger.getLogger(NewMessageBean.class.getName()).log(Level.SEVERE, null, ex);
}
}

}


mappedName = "jms/MyQueue"

指定JMS目标资源(消息队列)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: