高并发:
当一个应用被部署于生产环境,灾备计划是非常重要的,以便从网络故障,硬件故障,软件故障或者电源故障中恢复。通过合理的配置ActiveMQ,可以解决上诉问题。最典型的配置方法是运行多个Broker,一旦某台机器或者某个broker失效,其他broker能够顶上去。这种方式叫做Master/Slave,一个broker作为Master提供服务,而其他broker则作为slave等待master失效从而顶上。客户端需使用failover transport方式来连接broker。
1,master-slave模式之Share File System Master
activemq.xml配置文件:
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
客户端在连接时,使用failover:
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("failover:(tcp://127.0.0.1:61616,tcp://127.0.0.1:61617)");
负载均衡:
Broker-Cluster部署方式中,各个broker通过网络互相连接并共享queue。这在一定程度上可视为负载均衡的一种方法。有两种实现方式:静态发现和动态发现。
将ActiveMq拷贝2份,并将example下conf下的activemq-static-network-broker1.xml, activemq-static-network-broker2.xml分别替换在\bin\win64 (32)下的activemq.xml(名字改为activemq.xml)
静态发现,主要在其中一个配置文件中增加:
<networkConnectors>
<networkConnector uri="static:(tcp://localhost:61618)"/>
</networkConnectors>
通过以上配置这两个 broker通过网络互相连接,并共享queue,
测试代码:
//Broker1消息接收:
// init connection factory with activemq 初始化
QueueConnectionFactory factoryA = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
// specify the destination 指定一个目标地址
Queue queueB = new ActiveMQQueue("queue ");
// create connection,session,consumer and receive message 创建连接 session ,顾客 ,接收消息
QueueConnection connA = factoryA.createQueueConnection();
connA.start();
// first receiver on broker1 代理1的第一个接收者
QueueSession sessionA1 = connA.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueReceiver receiverA1 = sessionA1.createReceiver(queueB);
final AtomicInteger aint1 = new AtomicInteger(0);
MessageListener listenerA1 = new MessageListener(){
public void onMessage(Message message) {
try {
System.out.println(aint1.incrementAndGet()+" => first receiver A1 receive from kk.b: " + ((TextMessage)message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}};
receiverA1.setMessageListener(listenerA1 );
// second receiver on broker1 第二个接收者
QueueSession sessionA2 = connA.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueReceiver receiverA2 = sessionA2.createReceiver(queueB);
final AtomicInteger aint2 = new AtomicInteger(0);
MessageListener listenerA2 = new MessageListener(){
public void onMessage(Message message) {
try {
System.out.println(aint2.incrementAndGet()+" => second receiver A2 receive from kk.b: " + ((TextMessage)message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}};
receiverA2.setMessageListener(listenerA2 );
//Broker2消息生产及接收:
QueueConnectionFactory factoryB = new ActiveMQConnectionFactory("tcp://127.0.0.1:61618");
Queue queueB1 = new ActiveMQQueue("queue");
QueueConnection connB = factoryB.createQueueConnection();
connB.start();
// receiver on broker2
QueueSession sessionB1 = connB.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueReceiver receiverB1 = sessionB1.createReceiver(queueB1);
final AtomicInteger bint1 = new AtomicInteger(0);
MessageListener listenerB1 = new MessageListener(){
public void onMessage(Message message) {
try {
System.out.println(bint1.incrementAndGet()+" => first receiver B1 receive from kk.a: " + ((TextMessage)message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}};
receiverB1.setMessageListener(listenerB1 );
// producer on broker2 生产者broker2 ,broker1 并不是生产者
QueueSession sessionBp = connB.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = sessionBp.createProducer(queueB1);
int index = 0;
while(index++<300){
TextMessage message = sessionBp.createTextMessage(index + " ****from kk.b on broker2");
producer.send(message);
}