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 类会在后台输出消息内容

  • 相关阅读:
    SQL Azure (17) SQL Azure V12
    Microsoft Azure News(5) Azure新DV2系列虚拟机上线
    Azure Redis Cache (3) 在Windows 环境下使用Redis Benchmark
    Azure PowerShell (11) 使用自定义虚拟机镜像模板,创建Azure虚拟机并绑定公网IP(VIP)和内网IP(DIP)
    Windows Azure Virtual Machine (31) 迁移Azure虚拟机
    Windows Azure Web Site (16) Azure Web Site HTTPS
    Azure China (12) 域名备案问题
    一分钟快速入门openstack
    管理员必备的Linux系统监控工具
    Keepalived+Nginx实现高可用和双主节点负载均衡
  • 原文地址:https://www.cnblogs.com/Mr-kevin/p/5796442.html
Copyright © 2011-2022 走看看