1 /* 2 * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test 26 * @bug 7009998 27 * @summary Tests the correct processing of concurrent ClientComunicatorAdmin reconnect requests. 28 * @author Jaroslav Bachorik 29 * @modules java.management/com.sun.jmx.remote.internal 30 * @run clean CCAdminReconnectTest 31 * @run build CCAdminReconnectTest 32 * @run main CCAdminReconnectTest 33 */ 34 35 import com.sun.jmx.remote.internal.ClientCommunicatorAdmin; 36 import java.io.*; 37 import java.util.Collection; 38 import java.util.LinkedList; 39 import java.util.concurrent.ExecutorService; 40 import java.util.concurrent.Executors; 41 import java.util.concurrent.TimeUnit; 42 import java.util.concurrent.atomic.AtomicBoolean; 43 44 public class CCAdminReconnectTest { 45 final private static int THREAD_COUNT = 3; 46 47 public static void main(String ... args) throws Exception { 48 final ExecutorService e = Executors.newFixedThreadPool(THREAD_COUNT); 49 final AtomicBoolean beingReconnected = new AtomicBoolean(); 50 final Collection<Exception> thrownExceptions = new LinkedList<>(); 51 52 System.out.println(": Testing concurrent restart of ClientCommunicatorAdmin"); 53 54 final ClientCommunicatorAdmin cca = new ClientCommunicatorAdmin(50) { 55 56 @Override 57 protected void checkConnection() throws IOException { 58 // empty 59 } 60 61 @Override 62 protected void doStart() throws IOException { 63 if (!beingReconnected.compareAndSet(false, true)) { 64 IOException e = new IOException("Detected overlayed reconnect requests"); 65 thrownExceptions.add(e); 66 throw e; 67 } 68 try { 69 Thread.sleep(800); // simulating a workload 70 beingReconnected.set(false); 71 } catch (InterruptedException e) { 72 } 73 } 74 75 @Override 76 protected void doStop() { 77 // empty 78 } 79 }; 80 81 Runnable r = new Runnable() { 82 final private IOException e = new IOException("Forced reconnect"); 83 @Override 84 public void run() { 85 try { 86 // forcing the reconnect request 87 cca.gotIOException(e); 88 } catch (Exception ex) { 89 ex.printStackTrace(); 90 } 91 } 92 }; 93 94 System.out.println(": Spawning " + THREAD_COUNT + " concurrent reconnect requests"); 95 96 for(int i=0;i<THREAD_COUNT;i++) { 97 e.execute(r); 98 } 99 100 Thread.sleep(THREAD_COUNT * 1000); 101 e.shutdown(); 102 e.awaitTermination(10, TimeUnit.SECONDS); 103 104 cca.terminate(); 105 106 for(Exception thrown : thrownExceptions) { 107 throw thrown; 108 } 109 System.out.println(": Requests processed successfully"); 110 } 111 } 112