package com.taobao.meta.test.gregor;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.taobao.meta.test.BaseMetaTest;
import com.taobao.meta.test.Utils;
import com.taobao.metamorphosis.EnhancedBroker;
import com.taobao.metamorphosis.client.MetaClientConfig;
import com.taobao.metamorphosis.client.MetaMessageSessionFactory;
import com.taobao.metamorphosis.server.utils.MetaConfig;
/**
*
* @author boyan(boyan@taobao.com)
* @date 2011-12-29
*
*/
public class GregorMasterSlaveTest extends BaseMetaTest {
// private final List<EnhancedBroker> slaveBrokers = new
// ArrayList<EnhancedBroker>();
private final String topic = "meta-test";
private EnhancedBroker master, slave;
@Before
@Override
public void setUp() throws Exception {
final MetaClientConfig metaClientConfig = new MetaClientConfig();
super.sessionFactory = new MetaMessageSessionFactory(metaClientConfig);
this.log.info("before run");
}
@Test
public void testOneMasterOneSlaveOneProducerOneConsumer() throws Exception {
// start slave
this.slave = this.startEnhanceBroker("gregor_server1", true, true, this.getSlaveProperties());
// start master
this.master = this.startEnhanceBroker("samsa_server1", true, true, this.getMasterProperties());
try {
this.createProducer();
this.producer.publish(this.topic);
final byte[] data = "testOneMasterOneSlaveOneProducerOneConsumer".getBytes();
this.sendMessage(100, data, this.topic);
final String group = "GregorMasterSlaveTest";
this.createConsumer(group);
this.subscribe(this.topic, 1024 * 1024, 100);
}
finally {
this.producer.shutdown();
this.consumer.shutdown();
}
}
@Test
public void testOneMasterOneSlaveNProducerNConsumer() throws Exception {
// start slave
this.slave = this.startEnhanceBroker("gregor_server1", true, true, this.getSlaveProperties());
// start master
this.master = this.startEnhanceBroker("samsa_server1", true, true, this.getMasterProperties());
try {
this.create_nProducer(10);
this.sendMessage_nProducer(100, "testOneMasterOneSlaveNProducerNConsumer", this.topic, 10);
this.subscribe_nConsumer(this.topic, 1024 * 1024, 100, 10, 10);
// this.subscribe(this.topic, 1024 * 1024, 100);
}
finally {
Utils.shutdown(this.producerList);
Utils.shutdown(this.consumerList);
}
}
@Test
public void testSlaveAsMaster() throws Exception {
// �ȷ���100����Ϣ��master��slave
// start slave
this.testOneMasterOneSlaveOneProducerOneConsumer();
try {
this.stopMasterSlave();
this.queue.clear();
Thread.sleep(5000);
// Ȼ��slave��Ϊmaster������master��Ϊslave�������ٷ���100��
this.slave = this.startEnhanceBroker("samsa_server1", false, false, this.getSlaveProperties());
final Map<String, Properties> masterProperties = this.getMasterProperties();
// ����slave��8123�˿�
masterProperties.get("samsa").put("slave", "localhost:8123");
this.master = this.startEnhanceBroker("gregor_server1", false, false, masterProperties);
// �ȴ�producer��consumer����
Thread.sleep(2000);
final byte[] data = "testSlaveAsMaster".getBytes();
this.createProducer();
this.producer.publish(this.topic);
this.sendMessage(100, data, this.topic);
final String group = "GregorMasterSlaveTest";
this.createConsumer(group);
this.subscribe(this.topic, 1024 * 1024, 100);
}
finally {
Utils.shutdown(this.producer);
Utils.shutdown(this.consumer);
Utils.shutdown(this.producerList);
Utils.shutdown(this.consumerList);
}
}
protected EnhancedBroker startEnhanceBroker(final String name, final boolean isClearConsumerInfo,
final boolean isClearMsg, final Map<String, Properties> pluginsInfo) throws Exception {
final MetaConfig metaConfig = this.metaConfig(name);
metaConfig.setDashboardHttpPort(metaConfig.getServerPort() - 80);
if (isClearMsg) {
Utils.clearDataDir(metaConfig);
}
final EnhancedBroker broker = new EnhancedBroker(metaConfig, pluginsInfo);
if (isClearConsumerInfo) {
Utils.clearConsumerInfoInZk(broker.getBroker().getBrokerZooKeeper().getZkClient(), broker.getBroker()
.getBrokerZooKeeper().getMetaZookeeper());
}
broker.start();
// this.slaveBrokers.add(broker);
return broker;
}
private Map<String, Properties> getSlaveProperties() throws IOException {
final Map<String, Properties> ret = new HashMap<String, Properties>();
final Properties properties =
com.taobao.metamorphosis.utils.Utils.getResourceAsProperties("gregor_slave.properties", "GBK");
ret.put("gregor", properties);
return ret;
}
private Map<String, Properties> getMasterProperties() throws IOException {
final Map<String, Properties> ret = new HashMap<String, Properties>();
final Properties properties =
com.taobao.metamorphosis.utils.Utils.getResourceAsProperties("samsa_master.properties", "GBK");
ret.put("samsa", properties);
return ret;
}
@Override
@After
public void tearDown() throws Exception {
int count = 0;
count = Utils.shutdown(this.producer);
this.log.info(count > 0 ? count : "No" + " producer have been shutdown");
count = Utils.shutdown(this.consumer);
this.log.info(count > 0 ? count : "No" + " producer have been shutdown");
count = Utils.shutdown(super.producerList);
this.log.info(count + " producers have been shutdown");
count = Utils.shutdown(super.consumerList);
this.log.info(count + " consumers have been shutdown");
super.tearDown();
this.stopMasterSlave();
}
private void stopMasterSlave() {
try {
this.master.stop();
}
catch (final Exception e) {
e.printStackTrace();
}
try {
this.slave.stop();
}
catch (final Exception e) {
e.printStackTrace();
}
}
}