Spring mvc 注入activemq

一、pom.xml中添加相关依赖

    <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-core</artifactId>
      <version>5.7.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-pool</artifactId>
      <version>5.12.1</version>
    </dependency>

二、加入activemq.xml配置文件

<?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:amq="http://activemq.apache.org/schema/core"
       xmlns:jms="http://www.springframework.org/schema/jms"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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/jms/spring-jms-4.1.xsd
        http://activemq.apache.org/schema/core
        http://activemq.apache.org/schema/core/activemq-core-5.12.1.xsd"
>

    <!--配置生产者所在的包-->
    <context:component-scan base-package="service" />
    <mvc:annotation-driven />

    <amq:connectionFactory id="amqConnectionFactory"
                           brokerURL="tcp://127.0.0.1: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="demoQueueDestination" class="org.apache.activemq.command.ActiveMQQueue">
        <!-- 设置消息队列的名字 -->
        <!--<constructor-arg>-->
            <!--<value>qiao,xiao</value>-->
        <!--</constructor-arg>-->
        <constructor-arg index="0" value="MQ-FTP,MQ-Analysis,MQ-AnalysisResult,MQ-ImageBack" />
    </bean>

    <!-- 配置JMS模板(Queue),Spring提供的JMS工具类,它发送、接收消息。 -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="defaultDestination" ref="demoQueueDestination" />
        <property name="receiveTimeout" value="10000" />
        <!-- true是topic,false是queue,默认是false,此处显示写出false -->
        <property name="pubSubDomain" value="false" />
    </bean>

    <!-- 配置消息队列监听者(Queue) -->
    <!--配置监听类的路径-->
    <bean id="queueMessageListener" class="MQ.QueueMessageListener" />

    <!-- 显示注入消息监听容器(Queue),配置连接工厂,监听的目标是demoQueueDestination,监听器是上面定义的监听器 -->
    <bean id="queueListenerContainer"
          class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="destination" ref="demoQueueDestination" />
        <property name="messageListener" ref="queueMessageListener" />
        <!--<property name="concurrentConsumers" value="4"/>-->
    </bean>

</beans>

三、web.xml里边配置activemq.xml的路径

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:activemq.xml</param-value>
  </context-param>

四、添加消息生产者Service

package service;

import model.User;
import org.springframework.stereotype.Service;
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 java.io.Serializable;

@Service
public class ProducerService {
    @Resource(name="jmsTemplate")
    private JmsTemplate jmsTemplate;

    /**
     * 向指定队列发送消息
     */
    public void sendMessage(Destination destination, final String msg) {
        System.out.println("向队列" + destination.toString() + "发送了消息------------" + msg);
        jmsTemplate.send(destination, new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(msg);
            }
        });
    }

    /**
     * 向默认队列发送消息
     */
    public void sendMessage(final String msg) {
        String destination =  jmsTemplate.getDefaultDestination().toString();
        System.out.println("向队列" +destination+ "发送了消息------------" + msg);
        jmsTemplate.send(new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(msg);

            }
        });

    }

    /**
     * 向指定Destination发送序列化的对象
     *
     * @param destination
     * @param object
     *            object 必须序列化
     */
    public void sendObjectMessage(Destination destination, final Serializable object) {
        if (null == destination) {
            destination = jmsTemplate.getDefaultDestination();
        }
        jmsTemplate.send(destination, new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                return session.createObjectMessage(object);
            }
        });
        System.out.println("springJMS send object message...");
    }

}

五、加入消息监听器自动消费消息

package MQ;

import ftpManage.FtpEntity;
import ftpManage.FtpUtil;
import model.TvdsImage;
import model.TvdsResult;
import org.apache.activemq.command.ActiveMQDestination;
import org.springframework.beans.factory.annotation.Autowired;
import service.ProducerService;
import service.TvdsImageService;
import service.TvdsResultService;

import javax.annotation.Resource;
import javax.jms.*;

/**
 * 当收到消息自动调用onMessage方法
 * 一旦有新消息,将自动读取消费
 * 监听器检测到消息,将立即消费掉
 */

public class QueueMessageListener implements MessageListener {

    //队列消息生产者
    @Resource(name="producerService")
    private ProducerService producerService;

    @Autowired
    private TvdsResultService tvdsResultService;

    @Autowired
    private TvdsImageService tvdsImageService;

    //当收到消息后,自动调用该方法
    public void onMessage(Message message) {

//        TextMessage tm = (TextMessage) message;
//        try {
//            System.out.println("QueueMessageListener监听到了文本消息:\t" + tm.getText());
//            //do something ...
//        } catch (JMSException e) {
//            e.printStackTrace();
//        }

        //测试发送多个队列的
        try {
            ActiveMQDestination activeMQDestination=(ActiveMQDestination)message.getJMSDestination();

            /**
             * 监听消息队列queue1中的消息
             * ftp下载0
             */
            if(activeMQDestination.getPhysicalName().equalsIgnoreCase("MQ-FTP"))
            {
                System.out.println("监听队列:"+activeMQDestination.getPhysicalName()+"消费了消息:");
                // 如果是文本消息
                if (message instanceof TextMessage) {
                    TextMessage _tm = (TextMessage) message;
                    try {
                        System.out.println("from get textMessage:\t" + _tm.getText());
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }

                // 如果是Object消息
                if (message instanceof ObjectMessage) {
                    ObjectMessage objMsg = (ObjectMessage) message;
                    try {
                        FtpEntity ftp=(FtpEntity) objMsg.getObject();
                        System.out.println("addrIp:"+ftp.getIpAddr()+"  port:"+ftp.getPort()+"用户名:"+ftp.getUserName()+"密码:"+ftp.getPwd());
                        //开始ftp 下载
                        FtpUtil ftpUtil = new FtpUtil();
                        ftpUtil.startDown(ftp,ftp.getLocalPath(),ftp.getRemotePath());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }

            /**
             * 监听消息队列queue2中的消息
             * 视频分析
             */
            if(activeMQDestination.getPhysicalName().equalsIgnoreCase("MQ-Analysis"))
            {
                System.out.println("监听队列:"+activeMQDestination.getPhysicalName()+"消费了消息:");
                // 如果是文本消息
                if (message instanceof TextMessage) {
                    TextMessage __tm = (TextMessage) message;
                    try {
                        System.out.println("from get textMessage:\t" + __tm.getText());
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }

                // 如果是Object消息
                if (message instanceof ObjectMessage) {
                    ObjectMessage objMsg = (ObjectMessage) message;
                    try {



                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

            }
            /**
             * 监听消息队列queue3
             * 识别结果队列
             */
            if(activeMQDestination.getPhysicalName().equalsIgnoreCase("MQ-AnalysisResult"))
            {
                System.out.println("监听队列:"+activeMQDestination.getPhysicalName()+"消费了消息:");
                // 如果是文本消息
                if (message instanceof TextMessage) {
                    TextMessage __tm = (TextMessage) message;
                    try {
                        System.out.println("from get textMessage:\t" + __tm.getText());
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }

                // 如果是Object消息
                if (message instanceof ObjectMessage) {
                    ObjectMessage objMsg = (ObjectMessage) message;
                    try {
                        TvdsResult tvdsResult = (TvdsResult)objMsg.getObject();
                        tvdsResultService.insertByEntity(tvdsResult);

                        System.out.println("往队列"+activeMQDestination.getCompositeDestinations()[2].getPhysicalName()+"中发送对象消息");
                        producerService.sendObjectMessage(activeMQDestination.getCompositeDestinations()[2], tvdsResult);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

            }


            /**
             * 监听消息队列queue4
             * 图片队列
             */
            if(activeMQDestination.getPhysicalName().equalsIgnoreCase("MQ-ImageBack"))
            {
                System.out.println("监听队列:"+activeMQDestination.getPhysicalName()+"消费了消息:");
                // 如果是文本消息
                if (message instanceof TextMessage) {
                    TextMessage __tm = (TextMessage) message;
                    try {
                        System.out.println("from get textMessage:\t" + __tm.getText());
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }

                // 如果是Object消息
                if (message instanceof ObjectMessage) {
                    ObjectMessage objMsg = (ObjectMessage) message;
                    try {

                        TvdsImage tvdsImage = (TvdsImage)objMsg.getObject();
                        tvdsImageService.insertByEntity(tvdsImage);
                        System.out.println("往队列"+activeMQDestination.getCompositeDestinations()[3].getPhysicalName()+"中发送对象消息");
                        producerService.sendObjectMessage(activeMQDestination.getCompositeDestinations()[3], tvdsImage);

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

            }

        } catch (JMSException e1) {
            e1.printStackTrace();
        }
    }

}

六、处理页面的Controller

(1)欢迎页WelcomeController

package controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class WelcomeController {

    @RequestMapping(value="/welcome",method=RequestMethod.GET)
    public ModelAndView welcome(){
        System.out.println("------------welcome");
        ModelAndView mv = new ModelAndView();
        mv.setViewName("welcome");
        return mv;
    }
}

欢迎页welcome.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2017/12/28 0028
  Time: 13:08
  To change this template use File | Settings | File Templates.
--%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Welcome</title>
</head>
<body>
<h1>Welcome!!!</h1>
<h2><a href="producer">去发消息</a></h2>
<h2><a href="receive">从队列中取一个消息</a></h2>
</body>
</html>

(2)发送消息页面DemoController

package controller;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

import javax.annotation.Resource;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.TextMessage;
import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import service.ConsumerService;
import service.ProducerService;
import service.UserService;


@Controller
public class DemoController {

    @Autowired
    protected UserService userService;

    //队列名gzframe.demo
    @Resource(name="demoQueueDestination")
    private Destination demoQueueDestination;

    //队列消息生产者
    @Resource(name="producerService")
    private ProducerService producer;

    //队列消息消费者
    @Resource(name="consumerService")
    private ConsumerService consumer;

    @RequestMapping(value="/producer",method=RequestMethod.GET)
    public ModelAndView producer(){
        System.out.println("------------go producer");

        Date now = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = dateFormat.format( now );

        ModelAndView mv = new ModelAndView();
        mv.addObject("time", time);
        mv.setViewName("jms_producer");
        return mv;
    }

    @RequestMapping(value="/onsend",method=RequestMethod.POST)  //发消息
    public ModelAndView producer(@RequestParam("message") String message) {
        System.out.println("开始发送消息------------send to jms");
        ModelAndView mv = new ModelAndView();
        producer.sendMessage(demoQueueDestination, message);
        mv.setViewName("welcome");
        return mv;
    }

    @RequestMapping(value="/receive",method=RequestMethod.GET)
    public ModelAndView queue_receive() throws JMSException {
        System.out.println("------------receive message");
        ModelAndView mv = new ModelAndView();

        TextMessage tm = consumer.receive(demoQueueDestination);
        mv.addObject("textMessage", tm.getText());

        mv.setViewName("queue_receive");
        return mv;
    }

    /*
     * ActiveMQ Manager Test
     */
    @RequestMapping(value="/jms",method=RequestMethod.GET)
    public ModelAndView jmsManager() throws IOException {
        System.out.println("------------jms manager");
        ModelAndView mv = new ModelAndView();
        mv.setViewName("welcome");

        JMXServiceURL url = new JMXServiceURL("");
        JMXConnector connector = JMXConnectorFactory.connect(url);
        connector.connect();
        MBeanServerConnection connection = connector.getMBeanServerConnection();

        return mv;
    }
}

发送消息页面jms_producer.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2017/12/28 0028
  Time: 13:09
  To change this template use File | Settings | File Templates.
--%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JMS-Producer</title>
</head>
<body>
<h1>JMS-Producer!!!</h1>
<form action="onsend" method="post">

    MessageText:<textarea name="message">${time }</textarea>

    <input type="submit" value="提交" />
</form>
<h2><a href="welcome">返回主页</a></h2>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值