本文利用servlet来实现对jms消息的监听
在web.xml中配置servlet
<servlet>
<servlet-name>TaskMessageListener</servlet-name>
<servlet-class>cn.gapp.bq07.chk.taskListener.TaskMessageListener</servlet-class>
<init-param>
<param-name>queueName</param-name>
<param-value>taskQueue</param-value>
</init-param>
<init-param>
<param-name>messageListener</param-name>
<param-value>cn.gapp.bq07.chk.taskListener.TaskMessageListener</param-value>
</init-param>
<load-on-startup>5</load-on-startup>
</servlet>
servlet代码如下:<pre name="code" class="java">/**
*
*/
package cn.gapp.bq07.chk.taskListener;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import javax.servlet.ServletException;
import cn.gapp.bq07.chk.taskSchedule.service.TaskSchedulePoolService;
import cn.gapp.bq07.pub.constant.TaskStage;
import cn.gapp.bq07.pub.message.MessageServlet;
import cn.gapp.bq07.pub.message.TaskMessage;
import com.smartdoer.utils.SpringContextHolder;
/**
* @author donge
*
*/
public class TaskMessageListener extends MessageServlet implements MessageListener
{
private static final long serialVersionUID = 1000002L;
private static TaskSchedulePoolService taskSchedulePoolService = null;
@Override
public void init() throws ServletException
{
super.init();
try
{
taskSchedulePoolService = SpringContextHolder.getBean("taskSchedulePoolService");
}
catch (Exception e)
{
e.printStackTrace();
}
}
@Override
public void onMessage(Message message)
{
try
{
if (message != null)
{
if (message instanceof TextMessage)
{
TextMessage txtMsg = (TextMessage) message;
String xml = txtMsg.getText();
if (xml != null && !xml.trim().equals(""))
{
TaskMessage msg = TaskMessage.parseXml2Msg(xml);
String from = msg.getFrom();
if (from != null)
{
if (from.equals(TaskStage.CHECK))
{
// 核实后消息,入数据池
taskSchedulePoolService.doCheckMsg(msg);
}
else
{
// 都是任务状态反馈,开始或结束
taskSchedulePoolService.doTaskStateMsg(msg);
}
}
}
}
}
}
catch (JMSException e)
{
e.printStackTrace();
}
}
}
servlet继承了MessageServlet类和实现了MessageListener的接口;在servlet的init方法中调用父类的init方法
<pre name="code" class="java">/**
*
*/
package cn.gapp.bq07.pub.message;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import org.apache.activemq.ActiveMQConnectionFactory;
import com.smartdoer.utils.PropertyGetter;
/**
* @author donge
*
*/
public abstract class MessageServlet extends HttpServlet {
private static final long serialVersionUID = 1000002L;
private Connection connection = null;
private Session session = null;
private MessageConsumer consumer = null;
@Override
public String getInitParameter(String name) {
return super.getInitParameter(name);
}
@Override
public void init() throws ServletException {
try {
String queue = getInitParameter("queueName");
String messageListener = getInitParameter("messageListener");
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
PropertyGetter.getString("common", "mqUrl"));
connection = connectionFactory.createConnection();
session = connection.createSession(Boolean.FALSE,
Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue(queue);
consumer = session.createConsumer(destination);
Class<?> cls = Class.forName(messageListener);// 加载UserBean类到内存中!获取一个Class对象
MessageListener ml = (MessageListener) cls.newInstance();// 通过class类反射一个对象实体!
consumer.setMessageListener(ml);
connection.start();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void destroy() {
try {
if (consumer != null)
consumer.close();
if (session != null)
session.close();
if (connection != null)
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
父类通过servlet的配置读取要监听的消息队列,通过反射得到实体对象,实现对消息的监听