deadlock2test.java

来自「JGRoups源码」· Java 代码 · 共 213 行

JAVA
213
字号
// $Id: Deadlock2Test.java,v 1.10 2006/05/13 08:48:38 belaban Exp $package org.jgroups.tests;import junit.framework.Test;import junit.framework.TestCase;import junit.framework.TestSuite;import org.jgroups.Address;import org.jgroups.JChannel;import org.jgroups.blocks.GroupRequest;import org.jgroups.blocks.MethodCall;import org.jgroups.blocks.RpcDispatcher;import org.jgroups.util.RspList;import java.util.Enumeration;import java.util.Vector;/** * Test the distributed RPC deadlock detection mechanism, using one or two channels. * * @author John Giorgiadis * @author Ovidiu Feodorov <ovidiuf@users.sourceforge.net> * * * @version $Revision: 1.10 $ */public class Deadlock2Test extends TestCase {    private static boolean DEADLOCK_DETECTION = true;    private String name = "Deadlock2Test";    public Deadlock2Test(String name) {        super(name);    }    /**     * Tests the deadlock resolution using self-calls on a single channel. The deadlock detection     * is turned on so the method call should go straight through. If there is a problem, JUnit will     * timeout.     *     * @throws Exception     */    public void testOneChannel() throws Exception {        JChannel channel = new JChannel();        ServerObject serverObject = new ServerObject("obj1");        RpcDispatcher disp=new RpcDispatcher(channel, null, null, serverObject, DEADLOCK_DETECTION);        serverObject.setRpcDispatcher(disp);        channel.connect(name);        Address localAddress = channel.getLocalAddress();        // call the nested group method on itself        MethodCall call = new MethodCall("outerMethod", new Object[0], new Class[0]);        log("calling outerMethod() on all members");        RspList rspList = disp.callRemoteMethods(null, call, GroupRequest.GET_ALL, 0);        log("results of outerMethod(): " + rspList);        assertEquals(1, rspList.size());        assertEquals("outerMethod[innerMethod]", rspList.getValue(localAddress));        assertTrue(rspList.isReceived(localAddress));        assertFalse(rspList.isSuspected(localAddress));        channel.disconnect();        channel.close();    }    /**     * Tests the deadlock resolution using two different channels. The deadlock detection     * is turned on. It implements the following scenario:     *     * Channel1                              Channel2     *    |                                     |     *    + -------------------------------> outerMethod()     *    |                                    RPC     *    |                                     |     *    |                                     |     *    |                                     |     *    | <-- innerMethod() <-----------------+ ---------+     *    |                                     |          |     *    |                                     | <-- innerMethod()     *     * If there is a deadlock, JUnit will timeout and fail the test.     *     */    public void testTwoChannels() throws Throwable {        ServerObject obj1, obj2 = null;        JChannel c1 = new JChannel();        obj1 = new ServerObject("obj1");        RpcDispatcher disp1=new RpcDispatcher(c1, null, null, obj1, DEADLOCK_DETECTION);        obj1.setRpcDispatcher(disp1);        c1.connect(name);        JChannel c2 = new JChannel();        obj2 = new ServerObject("obj2");        RpcDispatcher disp2=new RpcDispatcher(c2, null, null, obj2, DEADLOCK_DETECTION);        obj2.setRpcDispatcher(disp2);        c2.connect(name);        Address localAddress2 = c2.getLocalAddress();        try {            // call a point-to-point method on Member 2 that triggers a nested distributed RPC            MethodCall call = new MethodCall("outerMethod", new Object[0], new Class[0]);            log("calling outerMethod() on " + localAddress2);            Object retval = disp1.callRemoteMethod(localAddress2, call, GroupRequest.GET_ALL, 0);            log("results of outerMethod(): " + retval);        }        finally {            c2.close();            c1.close();        }    }    public void testTwoChannelsWithInitialMulticast() throws Exception {        ServerObject obj1, obj2 = null;        JChannel c1 = new JChannel();        obj1 = new ServerObject("obj1");        RpcDispatcher disp1=new RpcDispatcher(c1, null, null, obj1, DEADLOCK_DETECTION);        obj1.setRpcDispatcher(disp1);        c1.connect(name);        JChannel c2 = new JChannel();        obj2 = new ServerObject("obj2");        RpcDispatcher disp2=new RpcDispatcher(c2, null, null, obj2, DEADLOCK_DETECTION);        obj2.setRpcDispatcher(disp2);        c2.connect(name);        Vector dests=new Vector();        dests.add(c1.getLocalAddress());        dests.add(c2.getLocalAddress());        try {            // call a point-to-point method on Member 2 that triggers a nested distributed RPC            MethodCall call = new MethodCall("outerMethod", new Object[0], new Class[0]);            log("calling outerMethod() on all members");            RspList rsps = disp1.callRemoteMethods(dests, call, GroupRequest.GET_ALL, 0);            log("results of outerMethod():\n" + rsps);            assertEquals(2, rsps.size());        }        finally {            c2.close();            c1.close();        }    }    public static Test suite() {        TestSuite s=new TestSuite(Deadlock2Test.class);        return s;    }    public static void main(String[] args) {        junit.textui.TestRunner.run(suite());        System.exit(0);    }    static void log(String msg) {        System.out.println("[" + Thread.currentThread() + "] " + msg);    }    public class ServerObject {        String myName;        public ServerObject(String name) {            this.myName=name;        }        private RpcDispatcher disp;        /**        * The ServerObject keeps a reference to its dispatcher to be able to send nested group        * RPCs.        */        public void setRpcDispatcher(RpcDispatcher rpcDispatcher) {            this.disp = rpcDispatcher;        }        public String outerMethod() {            log("**** outerMethod() received, calling innerMethod() on all members");            MethodCall call = new MethodCall("innerMethod", new Object[0], new Class[0]);            // RspList rspList = disp.callRemoteMethods(null, call, GroupRequest.GET_ALL, 5000);            RspList rspList = disp.callRemoteMethods(null, call, GroupRequest.GET_ALL, 0);            Vector results = rspList.getResults();            log("results of calling innerMethod():\n" + rspList);            StringBuffer sb = new StringBuffer("outerMethod[");            for(Enumeration e = results.elements(); e.hasMoreElements(); ) {                String s = (String)e.nextElement();                sb.append(s);                if (e.hasMoreElements()) {                    sb.append(";");                }            }            sb.append("]");            return sb.toString();        }        public String innerMethod() {            log("**** innerMethod() received, returning result");            return "innerMethod";        }	}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?