Package com.taobao.meta.test

Source Code of com.taobao.meta.test.BaseMetaTest

package com.taobao.meta.test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.Executor;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;

import com.taobao.gecko.core.util.ResourcesUtils;
import com.taobao.metamorphosis.Message;
import com.taobao.metamorphosis.client.MetaClientConfig;
import com.taobao.metamorphosis.client.MetaMessageSessionFactory;
import com.taobao.metamorphosis.client.consumer.ConsumerConfig;
import com.taobao.metamorphosis.client.consumer.MessageConsumer;
import com.taobao.metamorphosis.client.consumer.MessageListener;
import com.taobao.metamorphosis.client.producer.MessageProducer;
import com.taobao.metamorphosis.client.producer.SendResult;
import com.taobao.metamorphosis.exception.MetaClientException;
import com.taobao.metamorphosis.server.assembly.MetaMorphosisBroker;
import com.taobao.metamorphosis.server.utils.MetaConfig;
import com.taobao.metamorphosis.server.utils.TopicConfig;


/**
* meta���ɲ��Ի�����
*
* @author gongyangyu(gongyangyu@taobao.com)
*
*/
@Ignore
public abstract class BaseMetaTest {
    protected final Log log = LogFactory.getLog(this.getClass());
    protected final List<MetaMorphosisBroker> brokers = new ArrayList<MetaMorphosisBroker>();
    protected MetaMessageSessionFactory sessionFactory;

    protected final ConcurrentLinkedQueue<Message> queue = new ConcurrentLinkedQueue<Message>();

    protected MessageProducer producer;
    protected MessageConsumer consumer;
    protected List<Message> messages;
    protected List<MessageConsumer> consumerList;
    protected List<MessageProducer> producerList;


    public void createProducer() {
        this.producer = this.sessionFactory.createProducer();
    }


    public void create_nProducer(final int num) {
        this.producerList = new ArrayList<MessageProducer>();
        for (int i = 0; i < num; i++) {
            this.producerList.add(i, this.sessionFactory.createProducer());
        }
    }


    public void createConsumer(final String group) {
        this.consumer = this.sessionFactory.createConsumer(new ConsumerConfig(group));
    }


    public void createConsumer2() {
        this.consumer = this.sessionFactory.createConsumer(new ConsumerConfig());
    }

    MetaClientConfig metaClientConfig;

    @Before
    public void setUp() throws Exception {
        this.metaClientConfig = new MetaClientConfig();
        this.sessionFactory = new MetaMessageSessionFactory(this.metaClientConfig);
        this.startServer("server1");
        System.out.println("before run");
    }


    @After
    public void tearDown() throws Exception {
        this.sessionFactory.shutdown();
        Utils.stopServers(this.brokers);
        System.out.println("after run");
    }


    public MetaMorphosisBroker startServer(final String name) throws Exception {
        return this.startServer(name, true, true);
    }


    protected MetaMorphosisBroker startServer(final String name, final boolean isClearConsumerInfo,
            final boolean isCleanData) throws Exception {
        final MetaConfig metaConfig = this.metaConfig(name);
        metaConfig.setDashboardHttpPort(metaConfig.getServerPort() - 20);
        if (isCleanData) {
            Utils.clearDataDir(metaConfig);
        }
        final MetaMorphosisBroker broker = new MetaMorphosisBroker(metaConfig);
        if (isClearConsumerInfo) {
            Utils.clearConsumerInfoInZk(broker.getBrokerZooKeeper().getZkClient(), broker.getBrokerZooKeeper()
                .getMetaZookeeper());
        }
        broker.start();
        this.brokers.add(broker);
        return broker;
    }


    protected MetaConfig metaConfig(final String name) throws IOException, FileNotFoundException {
        final File file = ResourcesUtils.getResourceAsFile(name + ".ini");
        if (file == null || !file.exists()) {
            throw new FileNotFoundException("�Ҳ��������ļ�" + name + ".ini");
        }
        final MetaConfig metaConfig = new MetaConfig();
        final File dataDir = new File(System.getProperty("user.home") + File.separator + "meta");
        if (!dataDir.exists()) {
            dataDir.mkdir();
        }

        metaConfig.loadFromFile(file.getAbsolutePath());
        metaConfig.setDataPath(metaConfig.getDataPath() + File.separator + name);
        for (final TopicConfig topicConfig : metaConfig.getTopicConfigMap().values()) {
            topicConfig.setDataPath(metaConfig.getDataPath());
        }
        return metaConfig;
    }


    public void sendMessage(final int count, final String strdata, final String topic) throws Exception {
        this.messages = new ArrayList<Message>();
        for (int i = 0; i < count; i++) {
            final byte[] data = (strdata + i).getBytes();
            final Message msg = new Message(topic, data);
            final SendResult result = this.producer.sendMessage(msg);
            if (!result.isSuccess()) {
                throw new RuntimeException("Send message failed:" + result.getErrorMessage());
            }
            System.out.println(i);
            this.messages.add(msg);
        }
    }


    public void sendMessage(final int count, final byte[] data, final String topic) throws Exception {
        this.messages = new ArrayList<Message>();
        for (int i = 0; i < count; i++) {
            final Message msg = new Message(topic, data);
            final SendResult result = this.producer.sendMessage(msg);
            if (!result.isSuccess()) {
                throw new RuntimeException("Send message failed:" + result.getErrorMessage());
            }
            this.messages.add(msg);
        }
    }


    public void sendMessage2(final int count, final String strdata, final String topic) throws Exception {
        this.messages = new ArrayList<Message>();
        for (int i = 0; i < count; i++) {
            final byte[] data = strdata.getBytes();
            final Message msg = new Message(topic, data);
            final SendResult result = this.producer.sendMessage(msg);
            if (!result.isSuccess()) {
                throw new RuntimeException("Send message failed:" + result.getErrorMessage());
            }
            this.messages.add(msg);
        }
    }


    public void sendMessage_nProducer(final int count, final String strdata, final String topic, final int num)
            throws Exception {
        this.messages = new ArrayList<Message>();
        for (int j = 0; j < num; j++) {
            // ��Ҫ����topic
            this.producerList.get(j).publish(topic);
            for (int i = 0; i < count; i++) {
                final byte[] data = ("hello" + j + i).getBytes();
                final Message msg = new Message(topic, data);
                final SendResult result = this.producerList.get(j).sendMessage(msg);
                if (!result.isSuccess()) {
                    throw new RuntimeException("Send message failed:" + result.getErrorMessage());
                }
                this.messages.add(msg);
            }
        }
    }


    public void localTxSendMessage_nProducer(final int count, final String strdata, final String topic, final int num)
            throws Exception {
        this.messages = new ArrayList<Message>();
        for (int j = 0; j < num; j++) {
            // ��Ҫ����topic
            final MessageProducer messageProducer = this.producerList.get(j);
            messageProducer.publish(topic);
            for (int i = 0; i < count; i++) {
                final byte[] data = ("hello" + j + i).getBytes();
                final Message msg = new Message(topic, data);
                messageProducer.beginTransaction();
                final SendResult result = messageProducer.sendMessage(msg);
                if (!result.isSuccess()) {
                    messageProducer.rollback();
                    throw new RuntimeException("Send message failed:" + result.getErrorMessage());
                }
                messageProducer.commit();
                this.messages.add(msg);
            }
        }
    }


    public void sendMessage_nProducer_twoTopic(final int count, final String strdata, final String topic1,
            final String topic2, final int num, final Boolean attributed, final String attributed1,
            final String attributed2) throws Exception {
        this.messages = new ArrayList<Message>();
        for (int j = 0; j < num; j++) {
            // ��Ҫ����topic
            this.producerList.get(j).publish(topic1);
            for (int i = 0; i < count; i++) {
                final byte[] data = ("hello" + j + i).getBytes();
                final Message msg;
                if (attributed == true) {
                    msg = new Message(topic1, data, attributed1);
                }
                else {
                    msg = new Message(topic1, data);
                }
                final SendResult result = this.producerList.get(j).sendMessage(msg);
                if (!result.isSuccess()) {
                    throw new RuntimeException("Send message failed:" + result.getErrorMessage());
                }
                this.messages.add(msg);
            }
        }
        for (int j = 0; j < num; j++) {
            // ��Ҫ����topic
            this.producerList.get(j).publish(topic2);
            for (int i = 0; i < count; i++) {
                final byte[] data = ("hello" + i + j).getBytes();
                final Message msg;
                if (attributed == true) {
                    msg = new Message(topic1, data, attributed2);
                }
                else {
                    msg = new Message(topic1, data);
                }
                final SendResult result = this.producerList.get(j).sendMessage(msg);
                if (!result.isSuccess()) {
                    throw new RuntimeException("Send message failed:" + result.getErrorMessage());
                }
                this.messages.add(msg);
            }
        }
    }


    /** ������Ϣ������֤ */
    public void subscribe(final String topic, final int maxsize, final int count) throws Exception {
        this.subscribe(topic, maxsize, count, false);
    }


    /** ������Ķ�����Ϣ������֤ */
    public void subscribeRepeatable(final String topic, final int maxsize, final int count) throws Exception {
        this.subscribe(topic, maxsize, count, true);
    }


    private void subscribe(final String topic, final int maxsize, final int count, final boolean repeatable)
            throws Exception {
        // ���Ľ�����Ϣ
        try {
            this.consumer.subscribe(topic, maxsize, new MessageListener() {

                public void recieveMessages(final Message messages) {
                    BaseMetaTest.this.queue.add(messages);
                }


                public Executor getExecutor() {
                    return null;
                }
            }).completeSubscribe();
        }
        catch (final MetaClientException e) {
            if (repeatable) {
                this.log.info("no need subscribe again");
            }
            else {
                throw e;
            }
        }
        while (this.queue.size() < count) {
            Thread.sleep(1000);
            System.out.println("�ȴ�������Ϣ" + count + "����Ŀǰ���յ�" + this.queue.size() + "��");
        }

        // �����Ϣ�Ƿ���յ���У������
        assertEquals(count, this.queue.size());
        if (count != 0) {
            for (final Message msg : this.messages) {
                assertTrue(this.queue.contains(msg));
            }
        }
        this.log.info("received message count:" + this.queue.size());
    }


    public void subscribe_nConsumer(final String topic, final int maxsize, final int count, final int consumerNum,
            final int producerNum) throws Exception {
        this.consumerList = new ArrayList<MessageConsumer>();
        for (int i = 0; i < consumerNum; i++) {
            final ConcurrentLinkedQueue<Message> singlequeue = new ConcurrentLinkedQueue<Message>();
            this.consumerList.add(i, this.sessionFactory.createConsumer(new ConsumerConfig("group" + i)));
            this.consumerList.get(i).subscribe(topic, maxsize, new MessageListener() {

                public void recieveMessages(final Message messages) {
                    BaseMetaTest.this.queue.add(messages);
                    singlequeue.add(messages);
                }


                public Executor getExecutor() {
                    return null;
                }
            }).completeSubscribe();

            while (singlequeue.size() < count * producerNum) {
                Thread.sleep(1000);
                System.out.println("�ȴ�������Ϣ" + count * producerNum + "����Ŀǰ���յ�" + singlequeue.size() + "��");
            }
            // ��鵥��consumer��Ϣ�Ƿ���յ���У������
            assertEquals(count * producerNum, singlequeue.size());
            System.out.println(singlequeue.size());
            for (final Message msg : this.messages) {
                assertTrue(singlequeue.contains(msg));
            }
        }
        while (this.queue.size() < count * producerNum * consumerNum) {
            Thread.sleep(1000);
            System.out.println("�ȴ�������Ϣcount*num����Ŀǰ���յ�" + this.queue.size() + "��");
        }
        // ���ȫ����Ϣ�Ƿ���յ���У������
        assertEquals(count * producerNum * consumerNum, this.queue.size());
        System.out.println(this.queue.size());
        for (final Message msg : this.messages) {
            assertTrue(this.queue.contains(msg));
        }
    }


    public void subscribe_nConsumer_twoTopic(final String topic1, final String topic2, final int maxsize,
            final int count, final int consumerNum, final int producerNum) throws Exception {
        this.consumerList = new ArrayList<MessageConsumer>();
        for (int i = 0; i < consumerNum; i++) {
            final ConcurrentLinkedQueue<Message> singlequeue = new ConcurrentLinkedQueue<Message>();
            this.consumerList.add(i, this.sessionFactory.createConsumer(new ConsumerConfig("group" + i)));
            this.consumerList.get(i).subscribe(topic1, maxsize, new MessageListener() {

                public void recieveMessages(final Message messages) {
                    BaseMetaTest.this.queue.add(messages);
                    singlequeue.add(messages);
                }


                public Executor getExecutor() {
                    return null;
                }
            }).subscribe(topic2, maxsize, new MessageListener() {

                public void recieveMessages(final Message messages) {
                    BaseMetaTest.this.queue.add(messages);
                    singlequeue.add(messages);
                }


                public Executor getExecutor() {
                    return null;
                }
            }).completeSubscribe();

            while (singlequeue.size() < count * producerNum) {
                Thread.sleep(1000);
                System.out.println("�ȴ�������Ϣcount * producerNum����Ŀǰ���յ�" + singlequeue.size() + "��");
            }
            // ��鵥��consumer��Ϣ�Ƿ���յ���У������
            assertEquals(count * producerNum, singlequeue.size());
            System.out.println(singlequeue.size());
            for (final Message msg : this.messages) {
                assertTrue(singlequeue.contains(msg));
            }
        }
        while (this.queue.size() < count * producerNum * consumerNum) {
            Thread.sleep(1000);
            System.out.println("�ȴ�������Ϣcount * producerNum*consumerNum����Ŀǰ���յ�" + this.queue.size() + "��");
        }
        // ���ȫ����Ϣ�Ƿ���յ���У������
        assertEquals(count * producerNum * consumerNum, this.queue.size());
        System.out.println(this.queue.size());
        for (final Message msg : this.messages) {
            assertTrue(this.queue.contains(msg));
        }
    }
}
TOP

Related Classes of com.taobao.meta.test.BaseMetaTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.