Sping整合ActiveMQ(四.实例详解)

一.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>

猜你喜欢

转载自zyjustin9.iteye.com/blog/2024375