activemq部署安装

一、架构和技术介绍

1、简介

ActiveMQ Apache出品,最流行的,能力强劲的开源消息总线。完全支持JMS1.1J2EE 1.4规范的 JMS Provider实现

2、activemq的特性

1. 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP

2. 完全支持JMS1.1J2EE 1.4规范 (持久化,XA消息,事务)

3. Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性

4. 通过了常见J2EE服务器( Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resourceadaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE1.4商业服务器上

5. 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA

6. 支持通过JDBCjournal提供高速的消息持久化

7. 从设计上保证了高性能的集群,客户端-服务器,点对点

8. 支持Ajax

9. 支持与Axis的整合

10. 可以很容易得调用内嵌JMS provider,进行测试

3、下载和安装ActiveMQ

1、下载

ActiveMQ的最新版本是5.10.0,但由于我们内网下载存在问题,所以目前通过内网只能下载到5.9.0,下载地址:http://activemq.apache.org/activemq-590-release.html

2、安装

         如果是在windows系统中运行,可以直接解压apache-activemq-5.9.0-bin.zip,并运行bin目录下的activemq.bat文件,此时使用的是默认的服务端口:61616和默认的console端口:8161

         如果是在linuxunix下运行,在bin目录下执行命令:./activemq setup

3、修改ActiveMQ的服务端口和console端口

         A、修改服务端口:打开conf/activemq.xml文件,修改以下红色字体部分

        <transportConnectors>

           <transportConnector name="openwire" uri="tcp://10.42.220.72:61618"discoveryUri="multicast://default"/>

       </transportConnectors>

 

B、修改console的地址和端口:打开conf/jetty.xml文件,修改以下红色字体部分

    <bean id="jettyPort"class="org.apache.activemq.web.WebConsolePort"init-method="start">

       <property name="port" value="8162"/>

 </bean>

4、通过客户端代码试用ActiveMQ

        需要提前将activemq解压包中的lib目录下的相关包引入到工程中,再进行如下编码:

1、发送端的代码:

importjavax.jms.Connection;

importjavax.jms.ConnectionFactory;

importjavax.jms.DeliveryMode;

importjavax.jms.Destination;

importjavax.jms.MessageProducer;

importjavax.jms.Session;

importjavax.jms.TextMessage;

importorg.apache.activemq.ActiveMQConnection;

importorg.apache.activemq.ActiveMQConnectionFactory;

publicclass Sender {

    privatestaticfinalintSEND_NUMBER = 5;

 

    publicstaticvoid main(String[] args) {

        // ConnectionFactory:连接工厂,JMS用它创建连接

        ConnectionFactory connectionFactory;

        // ConnectionJMS客户端到JMS Provider的连接

        Connection connection = null;

        // Session一个发送或接收消息的线程

        Session session;

        // Destination:消息的目的地;消息发送给谁.

        Destination destination;

        // MessageProducer:消息发送者

        MessageProducer producer;

        // TextMessage message;

        //构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar

        connectionFactory = new ActiveMQConnectionFactory(

                ActiveMQConnection.DEFAULT_USER,

                ActiveMQConnection.DEFAULT_PASSWORD,

                "failover:(tcp://10.42.220.72:61617,tcp://10.42.220.72:61618)");

        try {

            //构造从工厂得到连接对象

            connection =connectionFactory.createConnection();

            //启动

            connection.start();

            //获取操作连接

            session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);

            //获取session

            destination = session.createQueue("FirstQueue");

            //得到消息生成者【发送者】

            producer =session.createProducer(destination);

            //设置不持久化,此处学习,实际根据项目决定

           producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

            //构造消息,此处写死,项目就是参数,或者方法获取

            sendMessage(session, producer);

            session.commit();

        catch (Exception e) {

            e.printStackTrace();

        finally {

            try {

                if (null != connection)

                    connection.close();

            catch (Throwable ignore) {

            }

        }

        }

   

    publicstaticvoid sendMessage(Session session,MessageProducer producer)

            throws Exception {

        for (int i = 1; i <=SEND_NUMBER; i++) {

            TextMessage message = session

                    .createTextMessage("ActiveMq发送的消息" + i);

            //发送消息到目的地方

            System.out.println("发送消息:" + "ActiveMq 发送的消息" + i);

            producer.send(message);

        }

    }

}

 

2、接收端代码:

importjavax.jms.Connection;

importjavax.jms.ConnectionFactory;

importjavax.jms.Destination;

importjavax.jms.MessageConsumer;

importjavax.jms.Session;

importjavax.jms.TextMessage;

importorg.apache.activemq.ActiveMQConnection;

importorg.apache.activemq.ActiveMQConnectionFactory;

 

publicclass Receive {

    publicstaticvoid main(String[] args) {

        // ConnectionFactory:连接工厂,JMS用它创建连接

        ConnectionFactory connectionFactory;

        // ConnectionJMS客户端到JMS Provider的连接

        Connection connection = null;

        // Session一个发送或接收消息的线程

        Session session;

        // Destination:消息的目的地;消息发送给谁.

        Destination destination;

        //消费者,消息接收者

        MessageConsumer consumer;

        connectionFactory = new ActiveMQConnectionFactory(

                ActiveMQConnection.DEFAULT_USER,

                ActiveMQConnection.DEFAULT_PASSWORD,

                "failover:(tcp://10.42.220.72:61617,tcp://10.42.220.72:61618)");

        try {

            //构造从工厂得到连接对象

            connection =connectionFactory.createConnection();

            //启动

            connection.start();

            //获取操作连接

            session = connection.createSession(false,

                    Session.AUTO_ACKNOWLEDGE);

            //获取session

            destination = session.createQueue("FirstQueue");

            consumer =session.createConsumer(destination);

            while (true) {

                //设置接收者接收消息的时间,为了便于测试,这里谁定为100s

                TextMessage message =(TextMessage) consumer.receive(100000);

                if (null != message) {

                    System.out.println("收到消息" + message.getText());

                else {

                    break;

                }

            }

        catch (Exception e) {

            e.printStackTrace();

        finally {

            try {

                if (null != connection)

                    connection.close();

            } catch (Throwable ignore) {

            }

        }

    }

}

3、通过监控查看消息堆栈的记录:

      登陆http://localhost:8162/admin/queues.jsp,默认的用户名和密码:admin/admin

p1.png

二、ActiveMQ的多种部署方式

         单点的ActiveMQ作为企业应用无法满足高可用和集群的需求,所以ActiveMQ提供了master-slavebroker cluster等多种部署方式,但通过分析多种部署方式之后我认为需要将两种部署方式相结合才能满足我们公司分布式和高可用的需求,所以后面就重点将解如何将两种部署方式相结合。

1、Master-Slave部署方式
1)shared filesystem Master-Slave部署方式

         主要是通过共享存储目录来实现masterslave的热备,所有的ActiveMQ应用都在不断地获取共享目录的控制权,哪个应用抢到了控制权,它就成为master

         多个共享存储目录的应用,谁先启动,谁就可以最早取得共享目录的控制权成为master,其他的应用就只能作为slave

p2.png

2)shared database Master-Slave方式

         shared filesystem方式类似,只是共享的存储介质由文件系统改成了数据库而已。

3)Replicated LevelDB Store方式

         这种主备方式是ActiveMQ5.9以后才新增的特性,使用ZooKeeper协调选择一个node作为master。被选择的master broker node开启并接受客户端连接。

其他node转入slave模式,连接master并同步他们的存储状态。slave不接受客户端连接。所有的存储操作都将被复制到连接至Masterslaves

如果master死了,得到了最新更新的slave被允许成为masterfialed node能够重新加入到网络中并连接master进入slave mode。所有需要同步的disk的消息操作都将等待存储状态被复制到其他法定节点的操作完成才能完成。所以,如果你配置了replicas=3,那么法定大小是(3/2)+1=2. Master将会存储并更新然后等待 (2-1)=1slave存储和更新完成,才汇报success。至于为什么是2-1,熟悉Zookeeper的应该知道,有一个node要作为观擦者存在。

单一个新的master被选中,你需要至少保障一个法定node在线以能够找到拥有最新状态的node。这个node将会成为新的master。因此,推荐运行至少3replica nodes,以防止一个node失败了,服务中断。

p3.png

2、Broker-Cluster部署方式

         前面的Master-Slave的方式虽然能解决多服务热备的高可用问题,但无法解决负载均衡和分布式的问题。Broker-Cluster的部署方式就可以解决负载均衡的问题。

         Broker-Cluster部署方式中,各个broker通过网络互相连接,并共享queue。当broker-A上面指定的queue-A中接收到一个message处于pending状态,而此时没有consumer连接broker-A时。如果cluster中的broker-B上面由一个consumer在消费queue-A的消息,那么broker-B会先通过内部网络获取到broker-A上面的message,并通知自己的consumer来消费。

1)static Broker-Cluster部署

         activemq.xml文件中静态指定Broker需要建立桥连接的其他Broker

1、  首先在Broker-A节点中添加networkConnector节点:

<networkConnectors> 

                <networkConnector   uri="static:(tcp:// 0.0.0.0:61617)"duplex="false"/>

</networkConnectors>

2、  修改Broker-A节点中的服务提供端口为61616

<transportConnectors>

         <transportConnectorname="openwire"uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

</transportConnectors>

3、  Broker-B节点中添加networkConnector节点:

<networkConnectors> 

                <networkConnector   uri="static:(tcp:// 0.0.0.0:61616)"duplex="false"/>

</networkConnectors>

4、  修改Broker-A节点中的服务提供端口为61617

<transportConnectors>

         <transportConnectorname="openwire"uri="tcp://0.0.0.0:61617?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

</transportConnectors>

5、分别启动Broker-ABroker-B

2)Dynamic Broker-Cluster部署

         activemq.xml文件中不直接指定Broker需要建立桥连接的其他Broker,由activemq在启动后动态查找:

1、  首先在Broker-A节点中添加networkConnector节点:

<networkConnectors> 

                <networkConnectoruri="multicast://default"

           dynamicOnly="true"

           networkTTL="3"

           prefetchSize="1"

           decreaseNetworkConsumerPriority="true" />

</networkConnectors>

2、修改Broker-A节点中的服务提供端口为61616

<transportConnectors>

         <transportConnectorname="openwire"uri="tcp://0.0.0.0:61616? " discoveryUri="multicast://default"/>

</transportConnectors>

3、在Broker-B节点中添加networkConnector节点:

<networkConnectors> 

                <networkConnectoruri="multicast://default"

           dynamicOnly="true"

           networkTTL="3"

           prefetchSize="1"

           decreaseNetworkConsumerPriority="true" />

</networkConnectors>

4、修改Broker-B节点中的服务提供端口为61617

<transportConnectors>

         <transportConnectorname="openwire"uri="tcp://0.0.0.0:61617" discoveryUri="multicast://default"/>

</transportConnectors>

5、启动Broker-ABroker-B

2、Master-Slave与Broker-Cluster相结合的部署方式

         可以看到Master-Slave的部署方式虽然解决了高可用的问题,但不支持负载均衡,Broker-Cluster解决了负载均衡,但当其中一个Broker突然宕掉的话,那么存在于该Broker上处于Pending状态的message将会丢失,无法达到高可用的目的。

         由于目前ActiveMQ官网上并没有一个明确的将两种部署方式相结合的部署方案,所以我尝试者把两者结合起来部署:

         p4.png

1、部署的配置修改

         这里以Broker-A + Broker-B建立clusterBroker-C作为Broker-Bslave为例:

1)首先在Broker-A节点中添加networkConnector节点:

<networkConnectors> 

                <networkConnector   uri="masterslave:(tcp://0.0.0.0:61617,tcp:// 0.0.0.0:61618)" duplex="false"/>

</networkConnectors>

2)修改Broker-A节点中的服务提供端口为61616

<transportConnectors>

         <transportConnectorname="openwire"uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

</transportConnectors>

3)Broker-B节点中添加networkConnector节点:

<networkConnectors> 

                <networkConnector   uri="static:(tcp:// 0.0.0.0:61616)"duplex="false"/>

</networkConnectors>

4)修改Broker-B节点中的服务提供端口为61617

<transportConnectors>

         <transportConnectorname="openwire"uri="tcp://0.0.0.0:61617?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

</transportConnectors>

5)修改Broker-B节点中的持久化方式:

      <persistenceAdapter>

           <kahaDB directory="/localhost/kahadb"/>

        </persistenceAdapter>

6)Broker-C节点中添加networkConnector节点:

<networkConnectors> 

                <networkConnector   uri="static:(tcp:// 0.0.0.0:61616)"duplex="false"/>

</networkConnectors>

7)修改Broker-C节点中的服务提供端口为61618

<transportConnectors>

         <transportConnectorname="openwire"uri="tcp://0.0.0.0:61618?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

</transportConnectors>

8)修改Broker-B节点中的持久化方式:

      <persistenceAdapter>

           <kahaDB directory="/localhost/kahadb"/>

       </persistenceAdapter>

9)分别启动broker-Abroker-Bbroker-C,因为是broker-B先启动,所以“/localhost/kahadb”目录被lock住,broker-C将一直处于挂起状态,当人为停掉broker-B之后,broker-C将获取目录“/localhost/kahadb”的控制权,重新与broker-A组成cluster提供服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python初学者_面向初学者的20种重要的Python技巧

python初学者Python is among the most widely used market programming languages in the world. This is because of a variety of driving factors:Python是世界上使用最广泛的市场编程语言之一。 这是由于多种驱动因素&#xff1a; It’s simple to understand. 很容易理解…

主串与模式串的匹配

主串与模式串的匹配 &#xff08;1&#xff09;BF算法&#xff1a; BF算法比较简单直观&#xff0c;其匹配原理是主串S.ch[i]和模式串T.ch[j]比较&#xff0c;若相等&#xff0c;则i和j分别指示串中的下一个位置&#xff0c;继续比较后续字符&#xff0c;若不相等&#xff0c;从…

什么是 DDoS 攻击?

欢迎访问网易云社区&#xff0c;了解更多网易技术产品运营经验。 全称Distributed Denial of Service&#xff0c;中文意思为“分布式拒绝服务”&#xff0c;就是利用大量合法的分布式服务器对目标发送请求&#xff0c;从而导致正常合法用户无法获得服务。通俗点讲就是利用网络…

nginx 并发过十万

一般来说nginx 配置文件中对优化比较有作用的为以下几项&#xff1a; worker_processes 8; nginx 进程数&#xff0c;建议按照cpu 数目来指定&#xff0c;一般为它的倍数。 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; 为每…

贝叶斯网络建模

I am feeling sick. Fever. Cough. Stuffy nose. And it’s wintertime. Do I have the flu? Likely. Plus I have muscle pain. More likely.我感到恶心。 发热。 咳嗽。 鼻塞。 现在是冬天。 我有流感吗&#xff1f; 可能吧 另外我有肌肉疼痛。 更倾向于。 Bayesian networ…

长春南关区净月大街附近都有哪些课后班?

长春南关区净月大街附近都有哪些课后班&#xff1f;在学校的教育不能满足广大学生的需求的时候&#xff0c;一对一辅导、文化课辅导、高考辅导等越来越多的家长和孩子的选择。相对于学校的大课教育&#xff0c;一对一辅导有着自身独特的优势&#xff0c;一对一辅导有着学校教学…

dev中文本框等获取焦点事件

<ClientSideEvents GotFocus"GotFocus" /> editContract.SetFocus()//设置文本框等的焦点 function GotFocus(s, e) { window.top.DLG.show(700, 600, "PrePayment/ContractSelect.aspx", "选择", null ); }…

数据科学家数据分析师_使您的分析师和数据科学家在数据处理方面保持一致

数据科学家数据分析师According to a recent survey conducted by Dimensional Research, only 50 percent of data analysts’ time is actually spent analyzing data. What’s the other half spent on? Data cleanup — that tedious and repetitive work that must be do…

神经网络使用情景

神经网络使用情景 人脸&#xff0f;图像识别语音搜索文本到语音&#xff08;转录&#xff09;垃圾邮件筛选&#xff08;异常情况探测&#xff09;欺诈探测推荐系统&#xff08;客户关系管理、广告技术、避免用户流失&#xff09;回归分析 为何选择Deeplearning4j&#xff1f; …

BZOJ4890 Tjoi2017城市

显然删掉的边肯定是直径上的边。考虑枚举删哪一条。然后考虑怎么连。显然新边应该满足其两端点在各自树中作为根能使树深度最小。只要线性求出这个东西就可以了&#xff0c;这与求树的重心的过程类似。 #include<iostream> #include<cstdio> #include<cmath>…

【国际专场】laravel多用户平台(SaaS, 如淘宝多用户商城)的搭建策略

想不想用Laravel来搭建一个多用户、或多租户平台&#xff1f;比如像淘宝那样的多商户平台呢&#xff1f;听上去很复杂&#xff0c;不是吗&#xff1f;怎么能一个程序&#xff0c;给那么多的机构用户来用呢&#xff1f;如何协调管理它们呢&#xff1f;数据库怎么搭建呢&#xff…

GitHub常用命令及使用

GitHub使用介绍 摘要&#xff1a; 常用命令&#xff1a; git init 新建一个空的仓库git status 查看状态git add . 添加文件git commit -m 注释 提交添加的文件并备注说明git remote add origin gitgithub.com:jinzhaogit/git.git 连接远程仓库git push -u origin master 将本地…

神经网络的类型

KNN DNN SVM DL BP DBN RBF CNN RNN ANN 概述 本文主要介绍了当前常用的神经网络&#xff0c;这些神经网络主要有哪些用途&#xff0c;以及各种神经网络的优点和局限性。 1 BP神经网络 BP (Back Propagation)神经网络是一种神经网络学习算法。其由输入层、中间层、输出层组成的…

python db2查询_如何将DB2查询转换为python脚本

python db2查询Many companies are running common data analytics tasks using python scripts. They are asking employees to convert scripts that may currently exist in SAS or other toolsets to python. One step of this process is being able to pull in the same …

Dapper基础知识三

在下刚毕业工作&#xff0c;之前实习有用到Dapper&#xff1f;这几天新项目想用上Dapper&#xff0c;在下比较菜鸟&#xff0c;这块只是个人对Dapper的一种总结。 Dapper&#xff0c;当项目在开发的时候&#xff0c;在没有必要使用依赖注入的时候&#xff0c;如何做到对项目的快…

deeplearning4j

deeplearning4j 是基于java的深度学习库&#xff0c;当然&#xff0c;它有许多特点&#xff0c;但暂时还没学那么深入&#xff0c;所以就不做介绍了 需要学习dl4j&#xff0c;无从下手&#xff0c;就想着先看看官网的examples&#xff0c;于是&#xff0c;下载了examples程序&a…

PostgreSQL 11 1Kw TPCC , 1亿 TPCB 7*24 强压耐久测试

标签 PostgreSQL , tpcc , tpcb 背景 TPCC, TPCB是工业标准的OLTP类型业务的数据库测试&#xff0c;包含大量的读、写、更新、删除操作。 7*24小时强压耐久测试&#xff0c;主要看数据库在长时间最大压力下的 性能、稳定性、可靠性。 测试CASE &#xff1a; 1、1000万 tpcc 2、…

推理编程_答案集编程的知识表示和推理

推理编程Read about the difference between declarative and imperative programming and learn from code examples (Answer Set Programming, Python and C).了解声明式和命令式编程之间的区别&#xff0c;并从代码示例(答案集编程&#xff0c;Python和C)中学习。 介绍 (In…

给Hadoop初学者的一些建议

我们介绍了新手学习hadoop的入门注意事项。这篇来谈谈hadoop核心知识学习。 hadoop核心知识学习: hadoop分为hadoop1.X和hadoop2.X&#xff0c;并且还有hadoop生态系统。这里只能慢慢介绍了。一口也吃不成胖子。 那么下面我们以hadoop2.x为例进行详细介绍&#xff1a; Hadoop…

Guide AHOI2017 洛谷P3720

Description 农场主John最近在网上买了一辆新车&#xff0c;在购买汽车配件时&#xff0c;John不小心点了两次“提交”按钮。导致汽车上安装了两套GPS系统&#xff0c;更糟糕的是John在使用GPS导航时&#xff0c;两套系统常常给出不同的路线。从地图上看&#xff0c;John居住的…