设为首页 收藏本站
查看: 574|回复: 0

[经验分享] Apache ActiveMQ or Spring 使用方法

[复制链接]

尚未签到

发表于 2017-1-6 10:24:08 | 显示全部楼层 |阅读模式
Apache ActiveMQ简介: MQ是Apache出品的一个基于JMS消息处理机制的服务,可以很容易的潜入到Spring中,作为项目消息处理服务。

Apache ActiveMQ用途: jms有两种消息机制一种是消息队列,一种是消息订阅,简单来说就是一对一,和一对多。

一对一可以看做 一组消息对应一个 或 多个消息获取服务,其中每一个单独的消息体都只会被一个消息获取服务获取。

一对多可以看做 一组消息对应一个 或 多个接收服务,其中每一个单独的消息体发出之后都会被所有的接收服务收到一次。

根据以上两种模式我们可以在 发送短信的时候使用 消息队列模式。也可以在分布式的时候使用消息队列模式

消息订阅模式用的不是很多但是,在分布式中也可以应用同时可以结合WebService进行使用。例如一个新闻需要发给多个系统内的单独服务。

只要深刻理解了他的处理机制在很多情况下都可以应用,如果实在不喜欢这种方式也可以遵照java JMS的API用线程自己模拟消息队列机制。

我个人认为区别不是很大。更何况很多时候MQ的很多功能我们有没有用到,用这么个大家伙就是为了图省事。

这里备注一下:按原有设定在创建连接的时候MQ是不发送消息的。

下面我说以下使用方式:

本人目前只会JAVA

需要的包为

        activemq-all-5.2.0.jar
        log4j-1.2.14.jar
        spring-beans-2.5.5.jar
        spring-context-2.5.5.jar
        spring-jms-2.5.5.jar

         spring-core-2.5.5.jar

这些应该就足够了

我做测试的时候用的包为

        activemq-all-5.2.0.jar
        commons-pool-1.4.jar
        log4j-1.2.14.jar
        spring-beans-2.5.5.jar
        spring-context-2.5.5.jar
        spring-core-2.5.5.jar
        spring-jms-2.5.5.jar
        spring-tx-2.5.5.jar
        spring-web-2.5.5.jar
        spring-webmvc-2.5.5.jar
        xbean-spring-3.4.jar
        msbase.jar
        mssqlserver.jar
        msutil.jar
        mysql-connector-java-5.0.4-bin.jar
        mysql.jar



基本配置

下载 Apache ActiveMQ 不知道的googlean

安装服务的文件在

apache-activemq-5.5.0\bin\win32 目录下面Linux版也一样大同小异 运行.sh文件就好,如果出现问题请打开运行文件查看里面参数

activemq.bat直接运行启动服务

InstallService.bat安装成windos服务

UninstallService.bat卸载windos服务

安装成功后

在运行中 cmd

netstat -an|find “61616” 查询端口是否已经打开

D:\apache-activemq-5.5.0\conf\activemq.xml 本文件为服务配置文件

     <transportConnectors>
            <transportConnector name="openwire" uri="tcp://0.0.0.0:61618"/>
        </transportConnectors>

这一项为端口设置

默认为 “61616”

目前以windos为例

把spring和项目联系起来

第一步为web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<!-- 配置Spring-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/classes/NewFileMQ.xml
        </param-value>
    </context-param>
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>


  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
   
</web-app>

先说 一下消息队列(也就是一对一)

NewFileMQ.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:amq="http://activemq.apache.org/schema/core"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  http://activemq.apache.org/schema/core
  http://activemq.apache.org/schema/core/activemq-core.xsd">

  <!-- 配置JMS链接模版 -->  
            <bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">  
                    <property name="brokerURL" value="tcp://localhost:61618"/>  
            </bean>  
      
            <!-- 配置JMS模版 -->  
            <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
                    <property name="connectionFactory" ref="connectionFactory"/>  
        <property name="pubSubDomain" value="false" />  
        <property name="explicitQosEnabled" value="true" /> <!-- deliveryMode, priority, timeToLive 的开关,要生效,必须配置为true,默认false-->  
        <property name="deliveryMode" value="1" /> <!-- 发送模式  DeliveryMode.NON_PERSISTENT=1:非持久 ; DeliveryMode.PERSISTENT=2:持久-->  
                    
            </bean>  
      

            <!-- 发送消息的目的地(一个队列) -->
            <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">  
                    <!-- 设置消息队列的名字 -->
                    <constructor-arg index="0" value="HelloJmsQueue"/>  
            </bean>   

    <bean id="sender" class="message.Sender">
        <property name="jmsTemplate" ref="jmsTemplate"></property>
    </bean>
<!--消息获取类-->
    <bean id="receive" class="message.Receiver"></bean>
    <!--给消息获取类加个监听让他能自动获取消息-->
    <bean id="listenerContainer"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory"></property>
        <property name="destination" ref="destination"></property>
        <property name="messageListener" ref="receive"></property>
    </bean>
</beans>

发送消息的类

package message;

import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;


public class Sender {

    private JmsTemplate jmsTemplate;

    public void setJmsTemplate(JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }
   
    public void send(final String text){
        System.out.println("---Send:"+text);
        jmsTemplate.send(new MessageCreator(){

            public Message createMessage(Session arg0) throws JMSException {
                // TODO Auto-generated method stub
                return arg0.createTextMessage(text);
            }
            
        });
    }
   
    public static void main(String[] args) {  
        ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");  
        JmsTemplate template = (JmsTemplate) ctx.getBean("jmsTemplate");  
        Destination destination = (Destination) ctx.getBean("destination");  
for(int i=0;i<10;i++){
    final String dd = i+"";
//jmsTemplate.convertAndSend(destination,"发送消息: ActiveMQ Text Message!"+dd);
        template.send(destination, new MessageCreator() {  
                public Message createMessage(Session session) throws JMSException {  
                        return session.createTextMessage("发送消息: ActiveMQ Text Message!"+dd);  
                }  
        });  
}
        System.out.println("成功发送了一条JMS消息");  
}  
}
接收消息类

package message;

import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
import org.springframework.context.ApplicationContext;
import org.springframework.jms.core.JmsTemplate;


public class Receiver implements MessageListener {
//接听接收
    public void onMessage(Message message) {
        if (message instanceof TextMessage) {
            TextMessage text = (TextMessage) message;

            try {
                System.out.println("Receive:第四个接收者" + text.getText());
            } catch (JMSException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }
    //手动接收
       public static void main(String[] args) throws JMSException {  
           ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");  
           JmsTemplate template = (JmsTemplate) ctx.getBean("jmsTemplate");  
           Destination destination = (Destination) ctx.getBean("destination");  
           while (true) {  
                   TextMessage txtmsg = (TextMessage) template.receive(destination);  
                   if (null != txtmsg)  
                           System.out.println("收到消息内容为: " + txtmsg.getText());  
                   else  
                           break;  
           }  
   }  
}

发布者模式

其实两种模式其它设置基本相同

唯一不用的就是 Spring配置文件中把一下这段替换一下就可以了

            <!-- 发送消息的目的地(一个队列) -->
            <bean id="destination" class="org.apache.activemq.command.ActiveMQTopic">  
                    <!-- 设置消息队列的名字 -->
                    <constructor-arg index="0" value="HelloJmsTopic"/>  
            </bean>

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-324594-1-1.html 上篇帖子: org.apache.commons.io.FileUtils学习 下篇帖子: 利用apache源码自制服务管理程序
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表