一.Pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>ActiveMQ-Spring</groupId> <artifactId>ActiveMQ-Spring</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>ActiveMQ-Spring4 Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <spring-version>3.2.6.RELEASE</spring-version> <activemq-version>5.6.0</activemq-version> <jms-version>2.0</jms-version> </properties> <dependencies> <!--Junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> <!--Slf4j--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency> <!--Spring--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring-version}</version> </dependency> <!--Spring.Jms--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>${spring-version}</version> </dependency> <!--Javax.Jms--> <dependency> <groupId>javax.jms</groupId> <artifactId>javax.jms-api</artifactId> <version>${jms-version}</version> </dependency> <!--ActiveMQ--> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>${activemq-version}</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-pool</artifactId> <version>${activemq-version}</version> </dependency> <!--xbean-spring--> <dependency> <groupId>org.apache.xbean</groupId> <artifactId>xbean-spring</artifactId> <version>3.16</version> </dependency> </dependencies> <build> <finalName>ActiveMQ-Spring</finalName> </build> </project>
二.Spring配置文件
<?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <context:component-scan base-package="com.guangjieba.whale.reptile.**"/> <!--配置ActionMQ的连接工厂,用amq配置--> <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp://localhost:61616"/> </bean> <!--<amq:connectionFactory id="connectionFactory" brokerURL="tcp://localhost:61616"/>--> <!--配置Queue消息目的地,用amq配置--> <bean id="quartzQueue" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg value="QuartzQueue"/> <!--<constructor-arg index="0" value="QuartzQueue"/>--> <!--带index参数--> </bean> <bean id="realTimeQueue" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg value="RealTimeQueue"/> </bean> <!--<amq:queue id="queue" physicalName="FirstQueue"/>--> <!--配置Topic消息目的地--> <!--<bean id="topic" class="org.apache.activemq.command.ActiveMQTopic"> <constructor-arg index="0" value="MyTopic"/> </bean>--> <!--配置JmsTemplate:手动,有超时时间--> <bean id="jmsTemplate1" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="connectionFactory"/> <property name="defaultDestination" ref="quartzQueue"/> <property name="receiveTimeout" value="2000" /> </bean> <!--配置JmsTemplate:即时——通过监听器实现--> <bean id="jmsTemplate2" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="connectionFactory" /> <property name="defaultDestination" ref="realTimeQueue" /> </bean> <!--配置消息监听(方式一),消息入队通知接收器,即时出队--> <bean id="listenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="concurrentConsumers" value="10" /> <property name="connectionFactory" ref="connectionFactory" /> <property name="destinationName" value="RealTimeQueue" /> <property name="messageListener" ref="realTimeActiveMQ" /> <!--被监听的类--> <property name="pubSubNoLocal" value="false"/> </bean> <!--配置消息监听(方式二),消息入队通知接收器,即时出队--> <jms:listener-container connection-factory="connectionFactory"> <jms:listener destination="RealTimeQueue" ref="realTimeActiveMQ"/> <!--<jms:listener destination="RealTimeQueue" ref="realTimeActiveMQ" method="receive"/>--> </jms:listener-container> </beans>
三.ActiveMQ类1:手动型
import com.huaxia.entity.Goods import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.core.MessageCreator; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.jms.*; /** * Created with IntelliJ IDEA.. * User: Leon * Date: 14-2-28 * Time: 下午4:52 * To change this template use File | Settings | File Templates. */ @Service public class QuartzActiveMQ { /*注:因为配置文件中有两个JmsTemplate,故用@Resource,可byName注入*/ @Resource private JmsTemplate jmsTemplate1; /** * 直接将消息转化并入队 * @param rbGoods 发送的商品对象 */ public void simpleSend(final Goods goods) { jmsTemplate1.convertAndSend(goods); } /** * 发送消息到队列中 * @param rbGoods 发送的商品对象 */ public void send(final Goods goods) { jmsTemplate1.send(new MessageCreator() { @Override public Message createMessage(Session session) throws JMSException { return session.createObjectMessage(goods); } }); } /** * 从队列中接收消息并返回(手动方式) */ public Goods receive() { ObjectMessage message = (ObjectMessage) jmsTemplate1.receive(); if (message == null) { return null; } try { Goods goods = (Goods) message.getObject(); return goods; } catch (JMSException e) { e.printStackTrace(); } return null; }
四.ActiveMQ类2:即时通信型
import com.huaxia.entity.Goods; import com.huaxia.dao.GoodsRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.ObjectMessage; /** * Created with IntelliJ IDEA.. * User: Leon * Date: 14-3-1 * Time: 上午10:10 * To change this template use File | Settings | File Templates. * 通过监听器实时监听并接收消息 */ @Service public class RealTimeActiveMQ implements MessageListener { @Resource private JmsTemplate jmsTemplate2; @Autowired private GoodsRepository roodsRepository; /** * 商品入队 * @param rbGoods 商品 */ public void send(final Goods goods){ jmsTemplate2.convertAndSend(goods); } /** * 商品即时出队并持久化 * @param message */ @Override public void onMessage(Message message) { if (message instanceof ObjectMessage) { try { Goods goods = (Goods) ((ObjectMessage) message).getObject(); Goods roodsTemp = goodsRepository.save(goods); if (goodsTemp.getId() == null) { send(goods); } } catch (JMSException e) { e.printStackTrace(); } } }
五.接口
@Controller @RequestMapping("/brandsource") public class BrandSourceController { @Autowired private QuartzActiveMQ activeMQController;、 @Autowired private IGoodsRestTemplate iGoodsRestTemplate; @RequestMapping(value = "/goods/check", method = RequestMethod.GET) private void checkGoods() { while (true) { int count = 0; RbGoods rbGoods = activeMQController.receive(); if (rbGoods != null) { boolean flag = iGoodsRestTemplate.postUpdateGoodsStatus(rbGoods); while (!flag) { count += 1; if (count == 3) { activeMQController.send(rbGoods); break; } flag = iGoodsRestTemplate.postUpdateGoodsStatus(rbGoods); } continue; } else { break; } } } }
六.测试类1:手动型
import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Created with IntelliJ IDEA.. * User: Leon * Date: 14-2-28 * Time: 下午3:37 * To change this template use File | Settings | File Templates. */ @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration({"/ServletContext.xml"}) public class QuartzActiveMQTest { @Autowired private QuartzActiveMQ activeMQController; @Autowired private RbGoodsRepository rbGoodsRepository; @Autowired WebApplicationContext webApplicationContext; private MockMvc mockMvc; @Before public void init() { mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); } /** * 往队列里添加数据 */ @Test public void sendTest() { RbGoods rbGoods = rbGoodsRepository.findOne(QRbGoods.rbGoods.id.eq("aHR0cDovL3d3dy5obS5jb20vY24vcHJvZHVjdC8wODcwOT9hcnRpY2xlPTA4NzA5LUM")); System.out.println(rbGoods); /*RbGoods rbGoods = new RbGoods(); rbGoods.setBrandId("123234"); rbGoods.setBrandName("sdaf");*/ activeMQController.send(rbGoods); } /** * 批量审核对接接口的测试 */ @Test public void checkGoodsTest() { try { mockMvc.perform(get("/brandsource/goods/check").accept(MediaType.APPLICATION_JSON)) .andDo(print()) .andExpect(status().isOk()) .andReturn(); } catch (Exception e) { e.printStackTrace(); } } /** * 从队列里面拿出数据 */ @Test public void receiveTest() { activeMQController.receive(); } }
七.测试类2:即时通信型
import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; /** * Created with IntelliJ IDEA.. * User: Leon * Date: 14-3-1 * Time: 上午10:25 * To change this template use File | Settings | File Templates. */ @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration({"/ServletContext.xml"}) public class RealTimeActiveMQTest { @Autowired private RealTimeActiveMQ realTimeActiveMQ; @Autowired private RbGoodsRepository rbGoodsRepository; @Autowired WebApplicationContext webApplicationContext; private MockMvc mockMvc; @Before public void init() { mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); } @Test public void sendTest() { realTimeActiveMQ.send(new RbGoods()); } }
八.Web.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="2.5"> <display-name>Weibo Web Application</display-name> <filter> <filter-name>CORS Filter</filter-name> <filter-class>org.ebaysf.web.cors.CORSFilter</filter-class> </filter> <filter-mapping> <filter-name>CORS Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- The definition of the Root Spring Container shared by all Servlets and Filters --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/root-context.xml</param-value> </context-param> <!-- Processes application requests --> <servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <!--<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>--> <param-value>/WEB-INF/spring/root-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>appServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- Creates the Spring Container shared by all Servlets and Filters --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <listener> <listener-class>com.guangjieba.whale.reptile.application.InitApp</listener-class> </listener> <!-- Disables Servlet Container welcome file handling. Needed for compatibility with Servlet 3.0 and Tomcat 7.0 --> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>