JMS之Spring整合ActiveMQ(源码包含完整的spring+mybatis+activemq整合)

本文主要介绍spring+activemq的整合代码,源代码是spring+spring mvc+mybaits+activemq的完整版

本人读书少,不善言辞,所以老规则,直接上代码

首先是配置文件

<?xml version="1.0" encoding="UTF-8"?>  
    <beans xmlns="http://www.springframework.org/schema/beans"  
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
        xmlns:context="http://www.springframework.org/schema/context"  
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:amq="http://activemq.apache.org/schema/core"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-4.1.xsd
                            http://www.springframework.org/schema/mvc
                            http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
                            http://www.springframework.org/schema/jms
                            http://www.springframework.org/schema/jsm/spring-jms-4.1.xsd
                            http://activemq.apache.org/schema/core
        					http://activemq.apache.org/schema/core/activemq-core-5.14.1.xsd">  
    
    
    <context:component-scan base-package="com.dnkx.activemq" />
    
    <amq:connectionFactory id="amqConnectionFactory" 
        brokerURL="tcp://localhost:61616" 
        userName="admin" 
        password="admin" />
    
    <!-- 配置JMS连接工厂 -->
    <bean id="connectionFactory"
        class="org.springframework.jms.connection.CachingConnectionFactory">
        <constructor-arg ref="amqConnectionFactory" />
        <property name="sessionCacheSize" value="100" />
    </bean>
    
    <!-- 定义消息队列(Queue) -->
    <bean id="dnkxQueueDestination" class="org.apache.activemq.command.ActiveMQQueue">
        <!-- 设置消息队列的名字 -->
        <constructor-arg>
            <value>dnkxmq</value>
        </constructor-arg>
    </bean>
    
    <!-- 配置JMS模板(Queue),Spring提供的JMS工具类,它发送、接收消息。 -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="defaultDestination" ref="dnkxQueueDestination" />
        <property name="receiveTimeout" value="10000" />
        <!-- true是topic,false是queue,默认是false,此处显示写出false -->
        <property name="pubSubDomain" value="false" />
    </bean>
    
    <!-- 配置消息队列监听者(Queue) -->
    <bean id="queueMessageListener" class="com.dnkx.activemq.listener.QueueMessageListener" />
    
    <!-- 显示注入消息监听容器(Queue),配置连接工厂,监听的目标是dnkxQueueDestination,监听器是上面定义的监听器 -->
    <bean id="queueListenerContainer"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="destination" ref="dnkxQueueDestination" />
        <property name="messageListener" ref="queueMessageListener" />
    </bean>
 </beans>  

然后是生产者

package com.dnkx.activemq;

import javax.annotation.Resource;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;

import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;

/**
 * 生产者
 * @author 李小拐 2016年11月12日 12:48:35
 *
 */
@Service
public class ProductService {
	
	
	@Resource(name="jmsTemplate")
	private JmsTemplate jmsTemplate;
	
	/**
	 * 向指定队列发送消息
	 * @param destination
	 * @param msg
	 */
	public void sendMessage(Destination destination,final String msg) {
		System.out.println("向队列--"+destination.toString()+"--发送消息--"+msg);
		jmsTemplate.send(destination, new MessageCreator() {
			@Override
			public Message createMessage(Session session) throws JMSException {
				return session.createTextMessage(msg);
			}
		});
		
	}
	
	/**
	 * 向默认队列发送消息
	 * @param msg
	 */
	public void sendMessage(final String msg) {
		System.out.println("向队列--"+jmsTemplate.getDefaultDestinationName().toString()+"--发送消息--"+msg);
		jmsTemplate.send(new MessageCreator() {
			@Override
			public Message createMessage(Session session) throws JMSException {
				return session.createTextMessage(msg);
			}
		});
	}
}

然后是消费者

package com.dnkx.activemq;

import javax.annotation.Resource;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.TextMessage;

import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;

/**
 * 消费者
 * @author 李小拐 2016年11月12日 12:48:13
 *
 */
@Service
public class ConsumerService {
		
	@Resource(name="jmsTemplate")
	private JmsTemplate jmsTemplate;
	
	/**
	 * 接收消息
	 * @param destination
	 * @return
	 */
	public TextMessage receive(Destination destination) {
		TextMessage tm=(TextMessage)jmsTemplate.receive(destination);
		try {
			System.out.println("从队列--"+destination.toString()+"--接收到消息---"+tm.getText());
		} catch (JMSException e) {
			e.printStackTrace();
		}
		return tm;
	}
}

自动监听器(配置在了xml里面,会自动监听消息队列):

package com.dnkx.activemq.listener;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import org.apache.activemq.store.journal.JournalTransactionStore.Tx;
/**
 * 消息监听器
 * @author 李小拐 2016年11月12日 12:49:04
 *
 */
public class QueueMessageListener implements MessageListener{

	@Override
	public void onMessage(Message message) {
		
		TextMessage tm = (TextMessage) message;
		try {
			System.out.println("收到的消息-----"+tm.getText());
		} catch (JMSException e) {
			e.printStackTrace();
		}
		
	}

}

最后是Controller调用生产者生产消息的代码:

package com.dnkx.controller;

import javax.annotation.Resource;
import javax.jms.Destination;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.dnkx.activemq.ProductService;
import com.dnkx.pojo.Test;
import com.dnkx.service.TestService;

/**
 * 测试
 * @author 李小拐 2016年11月12日 12:59:52
 *
 */
@Controller
@RequestMapping("/test")
public class TestController {
	
	@Resource
	private TestService testService;
	
	//队列生产者
	@Resource(name="productService")
	private ProductService product;
	//队列名称
	@Resource(name="dnkxQueueDestination")
	private Destination destination;
	
	@RequestMapping("/test.do")
	public String test(HttpServletRequest request) {
		Test test=testService.getTestById(1);
		System.out.println("用户名:"+test.getName()+"    密码:"+test.getPassword());
		request.setAttribute("name", test.getName());
		return "main";
	}
	@RequestMapping("/test2.do")
	public String test2(HttpServletRequest request) {
		return "datagrid";
	}
	//这里是生产者生产消息的的地方
	@RequestMapping("/test1.do")
	public String test1(HttpServletRequest request) {
		product.sendMessage(destination, "这是一条mq消息");
		System.out.println("------发送成功-------------");
		return "index";
	}
}


最后一句:仅供参考,仅供参考,仅供参考!!!

源码下载地址




你可能感兴趣的:(activemq,Spring+ActiveMQ)