servlet和jms从activemq监听消息

本文介绍如何利用Servlet配置实现对JMS消息的监听,具体展示了在web.xml文件中设置servlet,以及servlet代码实现对消息的处理逻辑,包括消息接收、解析及任务状态反馈或核实操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文利用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的配置读取要监听的消息队列,通过反射得到实体对象,实现对消息的监听




                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值