zoukankan      html  css  js  c++  java
  • java实现基于activeMQ的消息推送

    此文章是基于  搭建Jquery+SpringMVC+Spring+Hibernate+MySQL平台

     一. jar包介绍

      1. 点击此下载 apache-activemq-5.3.0,得到:

    activemq-all-5.3.0.jar
    activemq-web-5.3.0.jar

      2. spring-framework-4.3.4.RELEASE 的 libs 文件夹下得到:

    spring-jms-4.3.4.RELEASE.jar

    二. 相关程序代码

      1. applicationInterface.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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
        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.1.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">    
            
        <!-- vm: 表示客户端和activeMQ代理在同一个Java虚拟机(VM)中运行 -->
        <bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
            <property name="brokerURL" value="vm://localhost?broker.persistent=false&amp;broker.useJmx=false" />
        </bean>
        
        <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">    
            <property name="connectionFactory" ref="jmsConnectionFactory" />
            <property name="receiveTimeout" value="60000" />
        </bean>
        
        <!-- 消息队列,表示是点到点(P2P)消息通讯模型 -->
        <bean id="msgQueue" class="org.apache.activemq.command.ActiveMQQueue">
            <constructor-arg index="0" value="msgQueue" />
        </bean>        
        
        <!-- 消息发送端 -->
        <bean id="jmsSender" 
            class="com.ims.interfaces.jms.activeMQ.JmsSenderImpl">
            <property name="jmsTemplate" ref="jmsTemplate" />
            <property name="msgQueue" ref="msgQueue"/>
        </bean>    
        
        <!-- 消息异步接收端-->
        <bean id="msgListenerContainer" 
            class="org.springframework.jms.listener.SimpleMessageListenerContainer">        
            <property name="connectionFactory" ref="jmsConnectionFactory" />
            <property name="destination" ref="msgQueue" />
            <property name="messageListener" ref="msgListener"/>
        </bean>
        
        <!-- 消息监听、执行器 -->
        <bean id="msgListener" 
            class="com.ims.interfaces.jms.activeMQ.MsgListener">    
        </bean>
    
    </beans>
    View Code

      2. JmsSender.java,消息发送器接口

    package com.ims.interfaces.jms.activeMQ;
    
    public interface JmsSender {
        public void send(final MsgContext context);
    }
    View Code

      3. JmsSenderImpl.java,消息发送器实现

    package com.ims.interfaces.jms.activeMQ;
    
    import javax.jms.Destination;
    import javax.jms.JMSException;
    import javax.jms.Message;
    import javax.jms.ObjectMessage;
    import javax.jms.Session;
    
    import org.springframework.jms.core.JmsTemplate;
    import org.springframework.jms.core.MessageCreator;
    
    public class JmsSenderImpl implements JmsSender{
        private JmsTemplate jmsTemplate;
        
        /**
         * 消息通告队列,表示点到点通讯模型
         */
        private Destination msgQueue;    
        
        /**
         * 发送消息
         * @param context 消息上下文
         */
        public void send(final MsgContext context) {
            getJmsTemplate().send(getMsgQueue(), new MessageCreator() {
                public Message createMessage(Session session) throws JMSException {
                    final ObjectMessage message = session.createObjectMessage();
                    message.setObject(context);
                    return message;
                }
            });
        }
        
        public JmsTemplate getJmsTemplate() {
            return jmsTemplate;
        }
        public void setJmsTemplate(JmsTemplate jmsTemplate) {
            this.jmsTemplate = jmsTemplate;
        }
        
        
        public Destination getMsgQueue() {
            return msgQueue;
        }
        public void setMsgQueue(Destination msgQueue) {
            this.msgQueue = msgQueue;
        }
            
    }
    View Code

      4. MsgContext.java,消息上下文类

    package com.ims.interfaces.jms.activeMQ;
    
    import java.io.Serializable;
    import java.util.Collection;
    
    public class MsgContext implements Serializable{
        
        private static final long serialVersionUID = -7877770277875813295L;
    
        /**
         * 消息接收者
         */
        private final Collection<String> users;         
        
        /**
         * 发送的消息
         */
        private final String message; 
        
        /**
         * 发送的方式
         */
        private final Collection<String> modes;         
        
        public MsgContext(Collection<String> users, String message, 
                Collection<String> modes){
            this.users = users;
            this.message = message;
            this.modes = modes;
        }
    
        public Collection<String> getUsers() {
            return users;
        }
    
        public String getMessage() {
            return message;
        }
    
        public Collection<String> getModes() {
            return modes;
        }
    }
    View Code

      5. MsgListener.java,消息监听、执行器

    package com.ims.interfaces.jms.activeMQ;
    
    import javax.jms.JMSException;
    import javax.jms.Message;
    import javax.jms.MessageListener;
    import javax.jms.ObjectMessage;
    
    import org.springframework.jms.support.JmsUtils;
    
    public class MsgListener implements MessageListener{
    
        /**
         * 监听到有消息时,执行的操作
         * @param msg 消息对象
         */
        @Override
        public void onMessage(Message message) {
            if(message == null) { return; }    
            // 获取对象消息
            final ObjectMessage objectMessage = (ObjectMessage) message;    
            
            // 消息上下文
            MsgContext context = null;        
            
            try {
                // 从对象消息中获取消息上下文对象
                context = (MsgContext) objectMessage.getObject();
            }catch (JMSException e) {
                JmsUtils.convertJmsAccessException(e);
                return;
            }
            
            System.out.println(context.getMessage());
            if(context==null || context.getModes()==null || context.getModes().size()==0){
                return;
            }
            
            // 取到消息上下文后,可执行自定义操作
        }
    
    }
    View Code

      6. TestController.java,测试jms消息发送

    package com.ims.web.controller;
    
    import java.util.Collection;
    import java.util.HashSet;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.servlet.ModelAndView;
    
    import com.ims.common.ServiceLocator;
    import com.ims.interfaces.jms.activeMQ.JmsSender;
    import com.ims.interfaces.jms.activeMQ.MsgContext;
    
    @Controller
    @RequestMapping("test")
    public class TestController extends BaseController{
        
        @RequestMapping("view")
        public ModelAndView test(){
            ModelAndView view = new ModelAndView("test.jsp");
            return view;
        }
        
        @RequestMapping("jms!send")
        public void send(@RequestParam String msg){
            JmsSender jmsSender = ServiceLocator.getService("jmsSender");
            Collection<String> users = new HashSet<String>();
            Collection<String> modes = new HashSet<String>();
            MsgContext msgContext = new MsgContext(users, msg, modes);
            jmsSender.send(msgContext);
        }
    }
    View Code

      7. jms.jsp,测试jms消息发送

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
    <%@ 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>测试</title>
        <%@ include file="/common/basePath.jsp"%>
     </head>
     <body>
     ~~~~~~~~~~~~~~~~~~~~~~jms消息发送~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     <br><br>  
       消息: <input type="text" name="msg" id="msg"> 
     <br><br>
     <button type="button" onclick="send();">发送</button>
     
     <script type="text/javascript" src="content/js/jquery/jquery-1.8.1.min.js"></script>
     <script type="text/javascript">
         function send(){
             $.ajax({
                 url:rootPath+"/test/jms!send.do?msg="+$('#msg').val(),
                 async:false
             });            
         }
     </script>
     </body>
    </html>
    View Code


    三. 测试

      1. 访问:http://localhost:8080/ims/test/jms.do

      2. 输入消息内容,点击发送,MsgListener 类会在后台输出消息内容

  • 相关阅读:
    ArcGIS Engine渲染
    C# char 和string之间转换
    C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法
    Navicat Premium 12安装及永久破解方法,亲测有效~
    使用WebDriver采样器将JMeter与Selenium集成
    jmeter响应结果中文乱码解决
    jmeter元件执行顺序
    jmeter使用函数助手实现参数化
    jmeter使用csv进行参数化
    jmeter利用http代理服务器录制脚本
  • 原文地址:https://www.cnblogs.com/Mr-kevin/p/5796442.html
Copyright © 2011-2022 走看看