ActiveMQ主从配置

1  概述


    ActiveMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。ActiveMQ使用Apache提供的授权,任何人都可以对其实现代码进行修改。

ActiveMQ的设计目标是提供标准的,面向消息的,能够跨越多语言和多系统的应用集成消息通信中间件。ActiveMQ实现了JMS标准并提供了很多附加的特性。这些附加的特性包括,JMX管理(java Management Extensions,即java管理扩展),主从管理(master/salve,这是集群模式的一种,主要体现在可靠性方面,当主中介(代理)出现故障,那么从代理会替代主代理的位置,不至于使消息系统瘫痪)、消息组通信(同一组的消息,仅会提交给一个客户进行处理)、有序消息管理(确保消息能够按照发送的次序被接受者接收)。消息优先级(优先级高的消息先被投递和处理)、订阅消息的延迟接收(订阅消息在发布时,如果订阅者没有开启连接,那么当订阅者开启连接时,消息中介将会向其提交之前的,其未处理的消息)、接收者处理过慢(可以使用动态负载平衡,将多数消息提交到处理快的接收者,这主要是对PTP消息所说)、虚拟接收者(降低与中介的连接数目)、成熟的消息持久化技术(部分消息需要持久化到数据库或文件系统中,当中介崩溃时,信息不会丢失)、支持游标操作(可以处理大消息)、支持消息的转换、通过使用Apache的Camel可以支持EIP、使用镜像队列的形式轻松的对消息队列进行监控等。

 

 

2  自定义安装


2.1  下载地址
官网下载: 

http://activemq.apache.org/download-archives.html

 

2.2  安装步骤
安装步骤如下:

1、解压;

tar -zxvf apache-activemq-5.9.0-bin.tar.gz


 


 

2、相关配置,编辑/conf/activemq.xml配置文件:

Master和Slave添加以下相同配置:

<brokerxmlns="http://activemq.apache.org/schema/core"brokerName="localhost" dataDirectory="${activemq.data}">
 
        <!--
            Configuremessage persistence for the broker. The default persistence
            mechanism isthe KahaDB store (identified by the kahaDB tag).
            For moreinformation, see:
 
           http://activemq.apache.org/persistence.html
        -->
       <persistenceAdapter>
            <!--
            <kahaDBdirectory="${activemq.data}/kahadb"/>
            -->
            <jdbcPersistenceAdapterdataDirectory="${activemq.data}/mysqldb"dataSource="#mySql" useDatabaseLock="true"  />
       </persistenceAdapter>
 
    </broker>
   
     
    <!-- MySQL DataSource-->
    <beanid="mySql"class="org.apache.commons.dbcp.BasicDataSource">
        <propertyname="driverClassName" value="com.mysql.jdbc.Driver"/>
        <propertyname="url"value="jdbc:mysql://192.168.1.101:3306/activemq?relaxAutoCommit=true"/>
        <propertyname="username" value="root"/>
        <propertyname="password" value="root"/>
        <propertyname="poolPreparedStatements" value="true"/>
    </bean>


 

 

 

 

2、启动:

执行/bin目录下activemq

./activemq start &


 

 

3、查看启动后的日志:

Master:

 

Slave;

 

 

如上日志表示启动成功。

 

 

2.3  主从测试


1、使用java客户端发送队列数据,

  • 原连接串: tcp://192.168.1.104:61616
  • 主备连接串: failover:(tcp://192.168.1.104:61616,tcp://192.168.1.105:61616)

 

Product代码:

public class Producer {
 
    private static final String BROKER_URL = "failover:(tcp://192.168.1.104:61616,tcp://192.168.1.105:61616)";
 
    private static final Boolean NON_TRANSACTED = false;
    private static final int NUM_MESSAGES_TO_SEND = 100;
    private static final long DELAY = 100;
 
    public static void main(String[] args) {
        String url = BROKER_URL;
        if (args.length > 0) {
            url = args[0].trim();
        }
        ActiveMQConnectionFactoryconnectionFactory = new ActiveMQConnectionFactory("admin", "admin", url);
        Connection connection = null;
        try {
            connection =connectionFactory.createConnection();
            connection.start();
            Session session =connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
            Destination destination =session.createQueue("test-queue");
            MessageProducer producer =session.createProducer(destination);
            for (int i = 0; i < NUM_MESSAGES_TO_SEND; i++) {
                TextMessage message =session.createTextMessage("Message#" + i);
                System.out.println("Sending message #" + i);
                producer.send(message);
                Thread.sleep(DELAY);
            }
            producer.close();
            session.close();
 
        } catch (Exception e) {
            System.out.println("Caught exception!");
        }
        finally {
            if (connection != null) {
                try {
                    connection.close();
                } catch (JMSException e) {
                    System.out.println("Could not close an open connection...");
                }
            }
        }
    }
}


 

Consumer代码:

public class Consumer {
    private static final String BROKER_URL = "failover:(tcp://192.168.1.104:61616,tcp://192.168.1.105:61616)";
 
    private static final Boolean NON_TRANSACTED = false;
    private static final long TIMEOUT = 20000;
 
    public static void main(String[] args) {
        String url = BROKER_URL;
        if (args.length > 0) {
            url = args[0].trim();
        }
        System.out.println("\nWaiting to receive messages... will timeout after " + TIMEOUT / 1000 +"s");
        ActiveMQConnectionFactoryconnectionFactory = new ActiveMQConnectionFactory("admin", "admin", url);
        Connection connection = null;
        try {
            connection =connectionFactory.createConnection();
            connection.start();
            Session session =connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
            Destination destination =session.createQueue("test-queue");
            MessageConsumer consumer =session.createConsumer(destination);
            int i = 0;
            while (true) {
                Message message =consumer.receive(TIMEOUT);
 
                if (message != null) {
                    if (message instanceof TextMessage) {
                        String text =((TextMessage) message).getText();
                        System.out.println("Got " + i++ + ". message: " + text);
                    }
               } else {
                    break;
                }
            }
            consumer.close();
            session.close();
        } catch (Exception e) {
            System.out.println("Caught exception!");
        }
        finally {
           if (connection != null) {
                try {
                    connection.close();
                } catch (JMSException e) {
                    System.out.println("Could not close an open connection...");
                }
            }
        }
    }
}




 

2、发送队列消息后,查看activeMQ网页信息:

 

查看对应数据库是否已经持久化数据:

 

 

日志输出信息:

 

 

 

 

 

3 主从故障转移测试


3.1     测试Slave自动切换
1)  停止Master:

[root@centosbin]# ./activemq stop


可以查看Slave打印日志:

可以查看到Slave由之前的未获得Lock变成了master获得当前ActiveMQ锁

 

 

 

 

2) 客户端消费者继续访问获取数据:

failover:(tcp://192.168.1.104:61616,tcp://192.168.1.105:61616)


可以查看到客户端消费者在master中断的情况下依旧可以读取消费数据。

 

 

 

3)设置验证密码之后,redis服务关闭需要密码验证通过之后才能关闭,因此命令修改为:

$ redis-cli –a 123456 shutdown

 

3.2     测试旧Master重启后切换


1)  将之前停止掉的Master重新启动;

[root@centos bin]# ./activemqstart &


如下:

 

可以看到旧的Master此时转为了Slave等待获取Lock;

 

 

2) 将当前新的Master停止:

[root@centosbin]# ./activemq stop

查看旧Master日志:

可以看到旧Master重新升级为当前Master

 

使用客户端消费者继续消费数据,可以看到在主从切换过程中依旧不影响业务操作。

 

 

总结:Master-Slave在切换过程中,是轮流进行主从角色充当。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beyondwild

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值