Package com.alibaba.otter.shared.communication.rmi

Source Code of com.alibaba.otter.shared.communication.rmi.RmiConnectionTest$PoolEvent

/*
* Copyright (C) 2010-2101 Alibaba Group Holding Limited.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.alibaba.otter.shared.communication.rmi;

import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import com.alibaba.otter.shared.communication.core.CommunicationRegistry;
import com.alibaba.otter.shared.communication.core.impl.connection.CommunicationConnection;
import com.alibaba.otter.shared.communication.core.impl.connection.CommunicationConnectionFactory;
import com.alibaba.otter.shared.communication.core.impl.connection.CommunicationConnectionPoolFactory;
import com.alibaba.otter.shared.communication.core.impl.rmi.RmiCommunicationConnectionFactory;
import com.alibaba.otter.shared.communication.core.impl.rmi.RmiCommunicationEndpoint;
import com.alibaba.otter.shared.communication.core.model.CommunicationParam;
import com.alibaba.otter.shared.communication.core.model.Event;
import com.alibaba.otter.shared.communication.core.model.EventType;
import com.alibaba.otter.shared.communication.core.model.heart.HeartEvent;

/**
* 测试下rmi的连接池
*
* @author jianghang
*/
public class RmiConnectionTest extends org.jtester.testng.JTester {

    @BeforeClass
    public void initial() {
        // 创建endpoint
        RmiCommunicationEndpoint endpoint = new RmiCommunicationEndpoint(1099);
        endpoint.setAlwaysCreateRegistry(false);
        endpoint.initial();
    }

    @Test
    public void testSingle() {
        CommunicationConnectionFactory factory = new RmiCommunicationConnectionFactory();
        CommunicationParam param = new CommunicationParam();
        param.setIp("127.0.0.1");
        param.setPort(1099);
        CommunicationConnection connection = factory.createConnection(param);
        Object result = connection.call(new HeartEvent());
        want.object(result).notNull();
    }

    @Test
    public void testPool() {
        CommunicationConnectionFactory factory = new RmiCommunicationConnectionFactory();
        CommunicationConnectionFactory poolFactory = new CommunicationConnectionPoolFactory(factory);
        ((CommunicationConnectionPoolFactory) poolFactory).initial();
        CommunicationParam param = new CommunicationParam();
        param.setIp("127.0.0.1");
        param.setPort(1099);
        CommunicationRegistry.regist(PoolEventType.pool, new TestPoolService());

        CommunicationConnection last = null;
        for (int i = 0; i < 11; i++) {
            CommunicationConnection connection = null;
            try {
                connection = poolFactory.createConnection(param);
                connection.call(new PoolEvent(PoolEventType.pool));
                last = connection;
                if (last != null) { // 检查链接是否是重用
                    want.object(last).isEqualTo(connection);
                }
            } finally {
                connection.close();
            }
        }
    }

    @Test
    public void testPool_exhaust() {
        CommunicationConnectionFactory factory = new RmiCommunicationConnectionFactory();
        CommunicationConnectionFactory poolFactory = new CommunicationConnectionPoolFactory(factory);
        ((CommunicationConnectionPoolFactory) poolFactory).initial();
        CommunicationParam param = new CommunicationParam();
        param.setIp("127.0.0.1");
        param.setPort(1099);
        CommunicationRegistry.regist(PoolEventType.exhaust, new TestPoolService());

        ExecutorService executor = Executors.newCachedThreadPool();
        long start = System.currentTimeMillis();
        final CountDownLatch count = new CountDownLatch(11);
        for (int i = 0; i < 11; i++) {
            final CommunicationConnection connection = poolFactory.createConnection(param);
            final PoolEvent event = new PoolEvent(PoolEventType.exhaust);
            event.setSleep(1000);
            executor.submit(new Callable() {

                public Object call() throws Exception {
                    try {
                        Object obj = connection.call(event);
                        count.countDown();
                        return obj;
                    } finally {
                        connection.close();
                    }
                }
            });
        }
        try {
            count.await();
        } catch (InterruptedException e) {
            want.fail();
        }
        long end = System.currentTimeMillis();
        want.number(end - start).isGe(1500L).isLe(2500L);
    }

    public static class PoolEvent extends Event {

        private static final long serialVersionUID = -7387998054696636166L;

        public PoolEvent(PoolEventType event){
            super(event);
        }

        private long sleep;

        public long getSleep() {
            return sleep;
        }

        public void setSleep(long sleep) {
            this.sleep = sleep;
        }

    }

    public static enum PoolEventType implements EventType {
        pool, exhaust;
    }

    public static class TestPoolService {

        public void onPool(PoolEvent event) {
        }

        public void onExhaust(PoolEvent event) {
            try {
                Thread.sleep(event.getSleep());
            } catch (InterruptedException e) {
                want.fail();
            }
        }
    }
}
TOP

Related Classes of com.alibaba.otter.shared.communication.rmi.RmiConnectionTest$PoolEvent

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.