Spring mvc 注入activemq

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

    <dependency>
      <groupId>org.apache.activemqgroupId>
      <artifactId>activemq-coreartifactId>
      <version>5.7.0version>
    dependency>
    <dependency>
      <groupId>org.apache.activemqgroupId>
      <artifactId>activemq-poolartifactId>
      <version>5.12.1version>
    dependency>

二、加入activemq.xml配置文件


<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" />

    
    <bean id="connectionFactory"
          class="org.springframework.jms.connection.CachingConnectionFactory">
        <constructor-arg ref="amqConnectionFactory" />
        <property name="sessionCacheSize" value="100" />
    bean>

    
    <bean id="demoQueueDestination" class="org.apache.activemq.command.ActiveMQQueue">
        
        
            
        
        <constructor-arg index="0" value="MQ-FTP,MQ-Analysis,MQ-AnalysisResult,MQ-ImageBack" />
    bean>

    
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="defaultDestination" ref="demoQueueDestination" />
        <property name="receiveTimeout" value="10000" />
        
        <property name="pubSubDomain" value="false" />
    bean>

    
    
    <bean id="queueMessageListener" class="MQ.QueueMessageListener" />

    
    <bean id="queueListenerContainer"
          class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="destination" ref="demoQueueDestination" />
        <property name="messageListener" ref="queueMessageListener" />
        
    bean>

beans>

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

  param>
    <param-name>contextConfigLocationparam-name>
    <param-value>classpath:activemq.xmlparam-value>
  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"%>

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Welcometitle>
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"%>

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JMS-Producertitle>
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>

你可能感兴趣的:(Java,web)