Example usage for java.util.concurrent.atomic AtomicReference getAndSet

List of usage examples for java.util.concurrent.atomic AtomicReference getAndSet

Introduction

In this page you can find the example usage for java.util.concurrent.atomic AtomicReference getAndSet.

Prototype

@SuppressWarnings("unchecked")
public final V getAndSet(V newValue) 

Source Link

Document

Atomically sets the value to newValue and returns the old value, with memory effects as specified by VarHandle#getAndSet .

Usage

From source file:com.springsource.insight.plugin.apache.http.hc4.HttpClientExecutionCollectionAspectTest.java

private void runResponseHandlerTest(String testName, HttpHost host, HttpContext context) throws IOException {
    HttpClient httpClient = new DefaultHttpClient();
    String uri = createTestUri(testName);
    HttpGet request = new HttpGet(uri);
    // must be final or the anonymous class cannot reference it...
    final AtomicReference<HttpResponse> rspRef = new AtomicReference<HttpResponse>(null);
    ResponseHandler<HttpResponse> handler = new ResponseHandler<HttpResponse>() {
        public HttpResponse handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
            HttpResponse prevValue = rspRef.getAndSet(response);
            assertNull("Duplicate response handling", prevValue);
            return response;
        }//from w  w w. j  av  a  2  s.  c  o m
    };

    HttpResponse response;
    if (host == null) {
        response = (context == null) ? httpClient.execute(request, handler)
                : httpClient.execute(request, handler, context);
    } else {
        response = (context == null) ? httpClient.execute(host, request, handler)
                : httpClient.execute(host, request, handler, context);
    }

    assertSame("Mismatched reference and return value", response, rspRef.get());
    handleResponse(testName, uri, request, response, true);
}

From source file:info.archinnov.achilles.embedded.ServerStarter.java

private void start(final TypedMap parameters) {
    if (isAlreadyRunning()) {
        log.debug("Cassandra is already running, not starting new one");
        return;//  www. j a  v  a 2s .  c  o m
    }

    final String triggersDir = createTriggersFolder();

    log.info(" Random embedded Cassandra RPC port/Thrift port = {}",
            parameters.<Integer>getTyped(CASSANDRA_THRIFT_PORT));
    log.info(" Random embedded Cassandra Native port/CQL port = {}",
            parameters.<Integer>getTyped(CASSANDRA_CQL_PORT));
    log.info(" Random embedded Cassandra Storage port = {}",
            parameters.<Integer>getTyped(CASSANDRA_STORAGE_PORT));
    log.info(" Random embedded Cassandra Storage SSL port = {}",
            parameters.<Integer>getTyped(CASSANDRA_STORAGE_SSL_PORT));
    log.info(" Random embedded Cassandra Remote JMX port = {}",
            System.getProperty("com.sun.management.jmxremote.port", "null"));
    log.info(" Embedded Cassandra triggers directory = {}", triggersDir);

    log.info("Starting Cassandra...");

    System.setProperty("cassandra.triggers_dir", triggersDir);
    System.setProperty("cassandra-foreground", "true");
    System.setProperty("cassandra.embedded.concurrent.reads",
            parameters.getTypedOr(CASSANDRA_CONCURRENT_READS, 32).toString());
    System.setProperty("cassandra.embedded.concurrent.writes",
            parameters.getTypedOr(CASSANDRA_CONCURRENT_WRITES, 32).toString());
    System.setProperty("cassandra-foreground", "true");

    final boolean useUnsafeCassandra = parameters.getTyped(USE_UNSAFE_CASSANDRA_DAEMON);

    if (useUnsafeCassandra) {
        System.setProperty("cassandra-num-tokens", "1");
    }

    System.setProperty("cassandra.config.loader", "info.archinnov.achilles.embedded.AchillesCassandraConfig");

    final CountDownLatch startupLatch = new CountDownLatch(1);
    final ExecutorService executor = Executors.newSingleThreadExecutor();
    final AtomicReference<CassandraDaemon> daemonRef = new AtomicReference<>();
    executor.execute(() -> {
        if (useUnsafeCassandra) {
            LOGGER.warn(
                    "******* WARNING, starting unsafe embedded Cassandra deamon. This should be only used for unit testing or development and not for production !");
        }

        CassandraDaemon cassandraDaemon = useUnsafeCassandra == true ? new AchillesCassandraDaemon()
                : new CassandraDaemon();

        cassandraDaemon.completeSetup();
        cassandraDaemon.activate();
        daemonRef.getAndSet(cassandraDaemon);
        startupLatch.countDown();
    });

    try {
        startupLatch.await(30, SECONDS);
    } catch (InterruptedException e) {
        log.error("Timeout starting Cassandra embedded", e);
        throw new IllegalStateException("Timeout starting Cassandra embedded", e);
    }

    // Generate an OrderedShutdownHook to shutdown all connections from java clients before closing the server
    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
            log.info("Calling stop on Embedded Cassandra server");
            daemonRef.get().stop();

            log.info("Calling shutdown on all Cluster instances");
            // First call shutdown on all registered Java driver Cluster instances
            orderedShutdownHook.callShutDown();

            log.info("Shutting down embedded Cassandra server");
            // Then shutdown the server
            executor.shutdownNow();
        }
    });
}

From source file:info.archinnov.achilles.test.integration.tests.AsyncQueryIT.java

@Test
public void should_query_async_with_default_params() throws Exception {
    long partitionKey = RandomUtils.nextLong(0, Long.MAX_VALUE);
    final CountDownLatch latch1 = new CountDownLatch(1);
    AchillesFuture<List<ClusteredEntity>> futureEntities = asyncManager.sliceQuery(ClusteredEntity.class)
            .forSelect().withPartitionComponents(partitionKey).fromClusterings(1, "name2")
            .toClusterings(1, "name4").withAsyncListeners(countDownLatch(latch1)).get();

    latch1.await();/*from w w  w. j  a  v a  2s .  c o  m*/

    List<ClusteredEntity> entities = futureEntities.get();
    assertThat(entities).isEmpty();

    final CountDownLatch latch2 = new CountDownLatch(1);
    final AtomicReference<Object> successSpy = new AtomicReference<>();

    FutureCallback<Object> successCallBack = new FutureCallback<Object>() {
        @Override
        public void onSuccess(Object result) {
            successSpy.getAndSet(result);
            latch2.countDown();
        }

        @Override
        public void onFailure(Throwable t) {
            latch2.countDown();
        }
    };

    String clusteredValuePrefix = insertValues(partitionKey, 1, 5);

    futureEntities = asyncManager.sliceQuery(ClusteredEntity.class).forSelect()
            .withPartitionComponents(partitionKey).fromClusterings(1, "name2").toClusterings(1, "name4")
            .withAsyncListeners(successCallBack).get();

    latch2.await();

    entities = futureEntities.get();

    assertThat(entities).hasSize(3);

    assertThat(entities.get(0).getValue()).isEqualTo(clusteredValuePrefix + 2);
    assertThat(entities.get(0).getId().getId()).isEqualTo(partitionKey);
    assertThat(entities.get(0).getId().getCount()).isEqualTo(1);
    assertThat(entities.get(0).getId().getName()).isEqualTo("name2");
    assertThat(entities.get(1).getValue()).isEqualTo(clusteredValuePrefix + 3);
    assertThat(entities.get(1).getId().getId()).isEqualTo(partitionKey);
    assertThat(entities.get(1).getId().getCount()).isEqualTo(1);
    assertThat(entities.get(1).getId().getName()).isEqualTo("name3");
    assertThat(entities.get(2).getValue()).isEqualTo(clusteredValuePrefix + 4);
    assertThat(entities.get(2).getId().getId()).isEqualTo(partitionKey);
    assertThat(entities.get(2).getId().getCount()).isEqualTo(1);
    assertThat(entities.get(2).getId().getName()).isEqualTo("name4");

    assertThat(successSpy.get()).isNotNull().isInstanceOf(List.class);
    List<CompleteBean> raws = (List<CompleteBean>) successSpy.get();
    assertThat(raws).hasSize(3);
    assertThat(raws.get(0)).isNotInstanceOf(Factory.class);

}

From source file:info.archinnov.achilles.test.integration.tests.AsyncQueryIT.java

@Test
public void should_return_rows_for_native_query_async() throws Exception {
    CompleteBean entity1 = builder().randomId().name("DuyHai").age(35L).addFriends("foo", "bar")
            .addFollowers("George", "Paul").addPreference(1, "FR").addPreference(2, "Paris")
            .addPreference(3, "75014").version(CounterBuilder.incr(15L)).buid();

    CompleteBean entity2 = builder().randomId().name("John DOO").age(35L).addFriends("qux", "twix")
            .addFollowers("Isaac", "Lara").addPreference(1, "US").addPreference(2, "NewYork")
            .version(CounterBuilder.incr(17L)).buid();

    asyncManager.insert(entity1).getImmediately();
    asyncManager.insert(entity2).getImmediately();

    final RegularStatement statement = select("name", "age_in_years", "friends", "followers", "preferences")
            .from("CompleteBean").where(eq("id", bindMarker("id")));

    final CountDownLatch latch = new CountDownLatch(1);
    final AtomicReference<Object> successSpy = new AtomicReference<>();
    FutureCallback<Object> successCallBack = new FutureCallback<Object>() {
        @Override//from  w ww .j a v a 2s  . c  o m
        public void onSuccess(Object result) {
            successSpy.getAndSet(result);
            latch.countDown();
        }

        @Override
        public void onFailure(Throwable t) {
            latch.countDown();
        }
    };

    final AchillesFuture<List<TypedMap>> future1 = asyncManager.nativeQuery(statement, entity1.getId())
            .get(successCallBack);
    final AchillesFuture<List<TypedMap>> future2 = asyncManager.nativeQuery(statement, entity2.getId()).get();

    latch.await();

    final List<TypedMap> typedMaps1 = future1.get();
    assertThat(typedMaps1).hasSize(1);
    TypedMap typedMap1 = typedMaps1.get(0);

    while (!future2.isDone()) {
        Thread.sleep(2);
    }

    final List<TypedMap> typedMaps2 = future2.get();
    assertThat(typedMaps2).hasSize(1);
    TypedMap typedMap2 = typedMaps2.get(0);

    assertThat(typedMap1.get("name")).isEqualTo("DuyHai");
    assertThat(typedMap1.get("age_in_years")).isEqualTo(35L);
    assertThat(typedMap1.<List<String>>getTyped("friends")).containsExactly("foo", "bar");
    assertThat(typedMap1.<Set<String>>getTyped("followers")).contains("George", "Paul");
    Map<Integer, String> preferences1 = typedMap1.getTyped("preferences");
    assertThat(preferences1.get(1)).isEqualTo("FR");
    assertThat(preferences1.get(2)).isEqualTo("Paris");
    assertThat(preferences1.get(3)).isEqualTo("75014");

    assertThat(typedMap2.get("name")).isEqualTo("John DOO");
    assertThat(typedMap2.get("age_in_years")).isEqualTo(35L);
    assertThat(typedMap2.<List<String>>getTyped("friends")).containsExactly("qux", "twix");
    assertThat(typedMap2.<Set<String>>getTyped("followers")).contains("Isaac", "Lara");
    Map<Integer, String> preferences2 = typedMap2.getTyped("preferences");
    assertThat(preferences2.get(1)).isEqualTo("US");
    assertThat(preferences2.get(2)).isEqualTo("NewYork");

    latch.await();
    assertThat(successSpy.get()).isNotNull().isInstanceOf(List.class);
}

From source file:info.archinnov.achilles.test.integration.tests.AsyncQueryIT.java

@Test
public void should_excecute_DML_native_query_with_async_listeners() throws Exception {
    //Given//from   w  w  w . ja  v  a  2 s  .com
    Long id = RandomUtils.nextLong(0, Long.MAX_VALUE);

    final CountDownLatch latch = new CountDownLatch(2);
    final AtomicReference<Object> successSpy = new AtomicReference<>();
    final AtomicReference<Throwable> exceptionSpy = new AtomicReference<>();

    FutureCallback<Object> successCallBack = new FutureCallback<Object>() {
        @Override
        public void onSuccess(Object result) {
            successSpy.getAndSet(result);
            latch.countDown();
        }

        @Override
        public void onFailure(Throwable t) {
            latch.countDown();
        }
    };

    FutureCallback<Object> exceptionCallBack = new FutureCallback<Object>() {
        @Override
        public void onSuccess(Object result) {
            latch.countDown();
        }

        @Override
        public void onFailure(Throwable t) {
            exceptionSpy.getAndSet(t);
            latch.countDown();
        }
    };

    final RegularStatement insert = insertInto("completebean").value("id", bindMarker("id"));
    final RegularStatement delete = delete().from("completebean").where(eq("name", "test"));

    //When
    asyncManager.nativeQuery(insert, id).execute(successCallBack);
    asyncManager.nativeQuery(delete).execute(exceptionCallBack);

    latch.await();

    //Then
    assertThat(successSpy.get()).isNotNull().isSameAs(Empty.INSTANCE);
    assertThat(exceptionSpy.get()).isNotNull().isInstanceOf(InvalidQueryException.class);
}

From source file:info.archinnov.achilles.test.integration.tests.AsyncQueryIT.java

@Test
public void should_return_raw_entities_for_raw_typed_query_async() throws Exception {
    Counter counter1 = CounterBuilder.incr(15L);
    CompleteBean paul = builder().randomId().name("Paul").age(35L).addFriends("foo", "bar")
            .addFollowers("George", "Jack").addPreference(1, "FR").addPreference(2, "Paris")
            .addPreference(3, "75014").version(counter1).buid();

    Counter counter2 = CounterBuilder.incr(17L);
    CompleteBean john = builder().randomId().name("John").age(34L).addFriends("qux", "twix")
            .addFollowers("Isaac", "Lara").addPreference(1, "US").addPreference(2, "NewYork").version(counter2)
            .buid();/*  w ww  .j  a  v  a 2s . com*/

    asyncManager.insert(paul).getImmediately();
    asyncManager.insert(john).getImmediately();

    final CountDownLatch latch = new CountDownLatch(2);
    final AtomicReference<Object> successSpy1 = new AtomicReference<>();
    final AtomicReference<Object> successSpy2 = new AtomicReference<>();

    FutureCallback<Object> successCallBack1 = new FutureCallback<Object>() {
        @Override
        public void onSuccess(Object result) {
            successSpy1.getAndSet(result);
            latch.countDown();
        }

        @Override
        public void onFailure(Throwable t) {
            latch.countDown();
        }
    };

    FutureCallback<Object> successCallBack2 = new FutureCallback<Object>() {
        @Override
        public void onSuccess(Object result) {
            successSpy2.getAndSet(result);
            latch.countDown();
        }

        @Override
        public void onFailure(Throwable t) {
            latch.countDown();
        }
    };

    final RegularStatement selectStar = select().from("CompleteBean").where(eq("id", bindMarker("id")));

    final AchillesFuture<CompleteBean> futurePaul = asyncManager
            .rawTypedQuery(CompleteBean.class, selectStar, paul.getId()).getFirst(successCallBack1);
    final AchillesFuture<CompleteBean> futureJohn = asyncManager
            .rawTypedQuery(CompleteBean.class, selectStar, john.getId()).getFirst(successCallBack2);

    latch.await();

    CompleteBean foundPaul = futurePaul.get();

    assertThat(foundPaul.getName()).isEqualTo(paul.getName());
    assertThat(foundPaul.getAge()).isEqualTo(paul.getAge());
    assertThat(foundPaul.getFriends()).containsAll(paul.getFriends());
    assertThat(foundPaul.getFollowers()).containsAll(paul.getFollowers());
    assertThat(foundPaul.getPreferences().get(1)).isEqualTo("FR");
    assertThat(foundPaul.getPreferences().get(2)).isEqualTo("Paris");
    assertThat(foundPaul.getPreferences().get(3)).isEqualTo("75014");
    assertThat(foundPaul.getVersion()).isNull();

    CompleteBean foundJohn = futureJohn.get();
    assertThat(foundJohn.getName()).isEqualTo(john.getName());
    assertThat(foundJohn.getAge()).isEqualTo(john.getAge());
    assertThat(foundJohn.getFriends()).containsAll(john.getFriends());
    assertThat(foundJohn.getFollowers()).containsAll(john.getFollowers());
    assertThat(foundJohn.getPreferences().get(1)).isEqualTo("US");
    assertThat(foundJohn.getPreferences().get(2)).isEqualTo("NewYork");
    assertThat(foundJohn.getVersion()).isNull();

    assertThat(successSpy1.get()).isNotNull().isInstanceOf(CompleteBean.class).isNotInstanceOf(Factory.class);
    assertThat(successSpy2.get()).isNotNull().isInstanceOf(CompleteBean.class).isNotInstanceOf(Factory.class);
}

From source file:info.archinnov.achilles.test.integration.tests.AsyncQueryIT.java

@Test
public void should_return_entities_for_typed_query_async() throws Exception {
    CompleteBean paul = builder().randomId().name("Paul").age(35L).addFriends("foo", "bar")
            .addFollowers("George", "Jack").addPreference(1, "FR").addPreference(2, "Paris")
            .addPreference(3, "75014").buid();

    CompleteBean john = builder().randomId().name("John").age(34L).addFriends("qux", "twix")
            .addFollowers("Isaac", "Lara").addPreference(1, "US").addPreference(2, "NewYork").buid();

    asyncManager.insert(paul).getImmediately();
    asyncManager.insert(john).getImmediately();

    final CountDownLatch latch = new CountDownLatch(2);
    final AtomicReference<Object> successSpy1 = new AtomicReference<>();
    final AtomicReference<Object> successSpy2 = new AtomicReference<>();

    FutureCallback<Object> successCallBack1 = new FutureCallback<Object>() {
        @Override//from  w ww . j av a 2 s .  c om
        public void onSuccess(Object result) {
            successSpy1.getAndSet(result);
            latch.countDown();
        }

        @Override
        public void onFailure(Throwable t) {
            latch.countDown();
        }
    };

    FutureCallback<Object> successCallBack2 = new FutureCallback<Object>() {
        @Override
        public void onSuccess(Object result) {
            successSpy2.getAndSet(result);
            latch.countDown();
        }

        @Override
        public void onFailure(Throwable t) {
            latch.countDown();
        }
    };

    final RegularStatement selectStar = select().from("CompleteBean").where(eq("id", bindMarker("id")));
    final List<CompleteBean> list1 = asyncManager.typedQuery(CompleteBean.class, selectStar, paul.getId())
            .get(successCallBack1).get();
    final CompleteBean foundJohn = asyncManager.typedQuery(CompleteBean.class, selectStar, john.getId())
            .getFirst(successCallBack2).get();

    latch.await();

    assertThat(list1).hasSize(1);

    CompleteBean foundPaul = list1.get(0);

    Factory factory1 = (Factory) foundPaul;
    @SuppressWarnings("unchecked")
    ProxyInterceptor<CompleteBean> interceptor1 = (ProxyInterceptor<CompleteBean>) factory1.getCallback(0);

    CompleteBean realPaul = (CompleteBean) interceptor1.getTarget();

    assertThat(realPaul.getLabel()).isNull();
    assertThat(realPaul.getWelcomeTweet()).isNull();

    assertThat(realPaul.getName()).isEqualTo(paul.getName());
    assertThat(realPaul.getAge()).isEqualTo(paul.getAge());
    assertThat(realPaul.getFriends()).containsAll(paul.getFriends());
    assertThat(realPaul.getFollowers()).containsAll(paul.getFollowers());
    assertThat(realPaul.getPreferences().get(1)).isEqualTo("FR");
    assertThat(realPaul.getPreferences().get(2)).isEqualTo("Paris");
    assertThat(realPaul.getPreferences().get(3)).isEqualTo("75014");

    Factory factory2 = (Factory) foundJohn;
    @SuppressWarnings("unchecked")
    ProxyInterceptor<CompleteBean> interceptor2 = (ProxyInterceptor<CompleteBean>) factory2.getCallback(0);

    CompleteBean realJohn = (CompleteBean) interceptor2.getTarget();

    assertThat(realJohn.getLabel()).isNull();
    assertThat(realJohn.getWelcomeTweet()).isNull();

    assertThat(realJohn.getName()).isEqualTo(john.getName());
    assertThat(realJohn.getAge()).isEqualTo(john.getAge());
    assertThat(realJohn.getFriends()).containsAll(john.getFriends());
    assertThat(realJohn.getFollowers()).containsAll(john.getFollowers());
    assertThat(realJohn.getPreferences().get(1)).isEqualTo("US");
    assertThat(realJohn.getPreferences().get(2)).isEqualTo("NewYork");

    latch.await();
    Thread.sleep(100);
    assertThat(successSpy1.get()).isNotNull().isInstanceOf(List.class);
    assertThat(successSpy2.get()).isNotNull().isInstanceOf(CompleteBean.class).isNotInstanceOf(Factory.class);
}

From source file:com.coinblesk.client.MainActivity.java

private void initSwitch(Menu menu) {
    MenuItem item = menu.findItem(R.id.myswitch);
    View view = item.getActionView();
    final Switch mySwitch = (Switch) view.findViewById(R.id.switchAB);
    final AtomicReference<CountDownTimer> ref = new AtomicReference<>();
    mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override/*  w ww  .  j  a v a 2 s  . c  o  m*/
        public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
            if (isChecked) {
                //enable BT
                ref.set(new CountDownTimer(30000, 1000) {
                    int i = 0;

                    public void onTick(final long millisUntilFinished) {
                        mySwitch.setButtonDrawable(
                                (i++ % 2) == 0 ? R.drawable.bluetooth_onon : R.drawable.bluetooth_on);
                        mySwitch.setTextOn("" + millisUntilFinished / 1000);
                    }

                    public void onFinish() {
                        mySwitch.setButtonDrawable(R.drawable.bluetooth_on);
                        mySwitch.setChecked(false);
                    }

                });
                ref.get().start();
                LocalBroadcastManager.getInstance(MainActivity.this)
                        .sendBroadcast(new Intent(Constants.START_CLIENTS_ACTION));

            } else {
                //mySwitch.setShowText(false);
                CountDownTimer tmp;
                if ((tmp = ref.getAndSet(null)) != null) {
                    tmp.cancel();
                }
                LocalBroadcastManager.getInstance(MainActivity.this)
                        .sendBroadcast(new Intent(Constants.STOP_CLIENTS_ACTION));
            }
        }
    });
}

From source file:org.springframework.amqp.rabbit.connection.CachingConnectionFactoryTests.java

@Test
public void testWithConnectionFactoryCachedConnection() throws Exception {
    com.rabbitmq.client.ConnectionFactory mockConnectionFactory = mock(
            com.rabbitmq.client.ConnectionFactory.class);

    final List<com.rabbitmq.client.Connection> mockConnections = new ArrayList<com.rabbitmq.client.Connection>();
    final List<Channel> mockChannels = new ArrayList<Channel>();

    doAnswer(new Answer<com.rabbitmq.client.Connection>() {

        private int connectionNumber;

        @Override/* w w w. j a  v  a2 s .  c o  m*/
        public com.rabbitmq.client.Connection answer(InvocationOnMock invocation) throws Throwable {
            com.rabbitmq.client.Connection connection = mock(com.rabbitmq.client.Connection.class);
            doAnswer(new Answer<Channel>() {

                private int channelNumber;

                @Override
                public Channel answer(InvocationOnMock invocation) throws Throwable {
                    Channel channel = mock(Channel.class);
                    when(channel.isOpen()).thenReturn(true);
                    int channelNumnber = ++this.channelNumber;
                    when(channel.toString())
                            .thenReturn("mockChannel" + connectionNumber + ":" + channelNumnber);
                    mockChannels.add(channel);
                    return channel;
                }
            }).when(connection).createChannel();
            int connectionNumber = ++this.connectionNumber;
            when(connection.toString()).thenReturn("mockConnection" + connectionNumber);
            when(connection.isOpen()).thenReturn(true);
            mockConnections.add(connection);
            return connection;
        }
    }).when(mockConnectionFactory).newConnection(any(ExecutorService.class), anyString());

    CachingConnectionFactory ccf = new CachingConnectionFactory(mockConnectionFactory);
    ccf.setExecutor(mock(ExecutorService.class));
    ccf.setCacheMode(CacheMode.CONNECTION);
    ccf.afterPropertiesSet();

    Set<?> allocatedConnections = TestUtils.getPropertyValue(ccf, "allocatedConnections", Set.class);
    assertEquals(0, allocatedConnections.size());
    BlockingQueue<?> idleConnections = TestUtils.getPropertyValue(ccf, "idleConnections", BlockingQueue.class);
    assertEquals(0, idleConnections.size());

    final AtomicReference<com.rabbitmq.client.Connection> createNotification = new AtomicReference<com.rabbitmq.client.Connection>();
    final AtomicReference<com.rabbitmq.client.Connection> closedNotification = new AtomicReference<com.rabbitmq.client.Connection>();
    ccf.setConnectionListeners(Collections.singletonList(new ConnectionListener() {

        @Override
        public void onCreate(Connection connection) {
            assertNull(createNotification.get());
            createNotification.set(targetDelegate(connection));
        }

        @Override
        public void onClose(Connection connection) {
            assertNull(closedNotification.get());
            closedNotification.set(targetDelegate(connection));
        }
    }));

    Connection con1 = ccf.createConnection();
    verifyConnectionIs(mockConnections.get(0), con1);
    assertEquals(1, allocatedConnections.size());
    assertEquals(0, idleConnections.size());
    assertNotNull(createNotification.get());
    assertSame(mockConnections.get(0), createNotification.getAndSet(null));

    Channel channel1 = con1.createChannel(false);
    verifyChannelIs(mockChannels.get(0), channel1);
    channel1.close();
    //AMQP-358
    verify(mockChannels.get(0), never()).close();

    con1.close(); // should be ignored, and placed into connection cache.
    verify(mockConnections.get(0), never()).close();
    assertEquals(1, allocatedConnections.size());
    assertEquals(1, idleConnections.size());
    assertNull(closedNotification.get());

    /*
     * will retrieve same connection that was just put into cache, and reuse single channel from cache as well
     */
    Connection con2 = ccf.createConnection();
    verifyConnectionIs(mockConnections.get(0), con2);
    Channel channel2 = con2.createChannel(false);
    verifyChannelIs(mockChannels.get(0), channel2);
    channel2.close();
    verify(mockChannels.get(0), never()).close();
    con2.close();
    verify(mockConnections.get(0), never()).close();
    assertEquals(1, allocatedConnections.size());
    assertEquals(1, idleConnections.size());
    assertNull(createNotification.get());

    /*
     * Now check for multiple connections/channels
     */
    con1 = ccf.createConnection();
    verifyConnectionIs(mockConnections.get(0), con1);
    con2 = ccf.createConnection();
    verifyConnectionIs(mockConnections.get(1), con2);
    channel1 = con1.createChannel(false);
    verifyChannelIs(mockChannels.get(0), channel1);
    channel2 = con2.createChannel(false);
    verifyChannelIs(mockChannels.get(1), channel2);
    assertEquals(2, allocatedConnections.size());
    assertEquals(0, idleConnections.size());
    assertNotNull(createNotification.get());
    assertSame(mockConnections.get(1), createNotification.getAndSet(null));

    // put mock1 in cache
    channel1.close();
    verify(mockChannels.get(1), never()).close();
    con1.close();
    verify(mockConnections.get(0), never()).close();
    assertEquals(2, allocatedConnections.size());
    assertEquals(1, idleConnections.size());
    assertNull(closedNotification.get());

    Connection con3 = ccf.createConnection();
    assertNull(createNotification.get());
    verifyConnectionIs(mockConnections.get(0), con3);
    Channel channel3 = con3.createChannel(false);
    verifyChannelIs(mockChannels.get(0), channel3);

    assertEquals(2, allocatedConnections.size());
    assertEquals(0, idleConnections.size());

    channel2.close();
    con2.close();
    assertEquals(2, allocatedConnections.size());
    assertEquals(1, idleConnections.size());
    channel3.close();
    con3.close();
    assertEquals(2, allocatedConnections.size());
    assertEquals(2, idleConnections.size());
    assertEquals("1", ccf.getCacheProperties().get("openConnections"));
    /*
     *  Cache size is 1; con3 (mock1) should have been a real close.
     *  con2 (mock2) should still be in the cache.
     */
    verify(mockConnections.get(0)).close(30000);
    assertNotNull(closedNotification.get());
    assertSame(mockConnections.get(0), closedNotification.getAndSet(null));
    verify(mockChannels.get(1), never()).close();
    verify(mockConnections.get(1), never()).close(30000);
    verify(mockChannels.get(1), never()).close();
    verifyConnectionIs(mockConnections.get(1), idleConnections.iterator().next());
    /*
     * Now a closed cached connection
     */
    when(mockConnections.get(1).isOpen()).thenReturn(false);
    when(mockChannels.get(1).isOpen()).thenReturn(false);
    con3 = ccf.createConnection();
    assertNotNull(closedNotification.get());
    assertSame(mockConnections.get(1), closedNotification.getAndSet(null));
    verifyConnectionIs(mockConnections.get(2), con3);
    assertNotNull(createNotification.get());
    assertSame(mockConnections.get(2), createNotification.getAndSet(null));
    assertEquals(2, allocatedConnections.size());
    assertEquals(1, idleConnections.size());
    assertEquals("1", ccf.getCacheProperties().get("openConnections"));
    channel3 = con3.createChannel(false);
    verifyChannelIs(mockChannels.get(2), channel3);
    channel3.close();
    con3.close();
    assertNull(closedNotification.get());
    assertEquals(2, allocatedConnections.size());
    assertEquals(2, idleConnections.size());
    assertEquals("1", ccf.getCacheProperties().get("openConnections"));

    /*
     * Now a closed cached connection when creating a channel
     */
    con3 = ccf.createConnection();
    verifyConnectionIs(mockConnections.get(2), con3);
    assertNull(createNotification.get());
    assertEquals(2, allocatedConnections.size());
    assertEquals(1, idleConnections.size());
    when(mockConnections.get(2).isOpen()).thenReturn(false);
    channel3 = con3.createChannel(false);
    assertNotNull(closedNotification.getAndSet(null));
    assertNotNull(createNotification.getAndSet(null));

    verifyChannelIs(mockChannels.get(3), channel3);
    channel3.close();
    con3.close();
    assertNull(closedNotification.get());
    assertEquals(2, allocatedConnections.size());
    assertEquals(2, idleConnections.size());
    assertEquals("1", ccf.getCacheProperties().get("openConnections"));

    // destroy
    ccf.destroy();
    assertNotNull(closedNotification.get());
    verify(mockConnections.get(3)).close(30000);
}

From source file:org.springframework.amqp.rabbit.connection.CachingConnectionFactoryTests.java

@Test
public void testWithConnectionFactoryCachedConnectionAndChannels() throws Exception {
    com.rabbitmq.client.ConnectionFactory mockConnectionFactory = mock(
            com.rabbitmq.client.ConnectionFactory.class);

    final List<com.rabbitmq.client.Connection> mockConnections = new ArrayList<com.rabbitmq.client.Connection>();
    final List<Channel> mockChannels = new ArrayList<Channel>();

    doAnswer(new Answer<com.rabbitmq.client.Connection>() {

        private int connectionNumber;

        @Override//from w w  w. jav a2s. com
        public com.rabbitmq.client.Connection answer(InvocationOnMock invocation) throws Throwable {
            com.rabbitmq.client.Connection connection = mock(com.rabbitmq.client.Connection.class);
            doAnswer(new Answer<Channel>() {

                private int channelNumber;

                @Override
                public Channel answer(InvocationOnMock invocation) throws Throwable {
                    Channel channel = mock(Channel.class);
                    when(channel.isOpen()).thenReturn(true);
                    int channelNumnber = ++this.channelNumber;
                    when(channel.toString())
                            .thenReturn("mockChannel" + connectionNumber + ":" + channelNumnber);
                    mockChannels.add(channel);
                    return channel;
                }
            }).when(connection).createChannel();
            int connectionNumber = ++this.connectionNumber;
            when(connection.toString()).thenReturn("mockConnection" + connectionNumber);
            when(connection.isOpen()).thenReturn(true);
            mockConnections.add(connection);
            return connection;
        }
    }).when(mockConnectionFactory).newConnection(any(ExecutorService.class), anyString());

    CachingConnectionFactory ccf = new CachingConnectionFactory(mockConnectionFactory);
    ccf.setExecutor(mock(ExecutorService.class));
    ccf.setCacheMode(CacheMode.CONNECTION);
    ccf.setConnectionCacheSize(2);
    ccf.setChannelCacheSize(2);
    ccf.afterPropertiesSet();

    Set<?> allocatedConnections = TestUtils.getPropertyValue(ccf, "allocatedConnections", Set.class);
    assertEquals(0, allocatedConnections.size());
    BlockingQueue<?> idleConnections = TestUtils.getPropertyValue(ccf, "idleConnections", BlockingQueue.class);
    assertEquals(0, idleConnections.size());
    @SuppressWarnings("unchecked")
    Map<?, List<?>> cachedChannels = TestUtils.getPropertyValue(ccf,
            "allocatedConnectionNonTransactionalChannels", Map.class);

    final AtomicReference<com.rabbitmq.client.Connection> createNotification = new AtomicReference<com.rabbitmq.client.Connection>();
    final AtomicReference<com.rabbitmq.client.Connection> closedNotification = new AtomicReference<com.rabbitmq.client.Connection>();
    ccf.setConnectionListeners(Collections.singletonList(new ConnectionListener() {

        @Override
        public void onCreate(Connection connection) {
            assertNull(createNotification.get());
            createNotification.set(targetDelegate(connection));
        }

        @Override
        public void onClose(Connection connection) {
            assertNull(closedNotification.get());
            closedNotification.set(targetDelegate(connection));
        }
    }));

    Connection con1 = ccf.createConnection();
    verifyConnectionIs(mockConnections.get(0), con1);
    assertEquals(1, allocatedConnections.size());
    assertEquals(0, idleConnections.size());
    assertNotNull(createNotification.get());
    assertSame(mockConnections.get(0), createNotification.getAndSet(null));

    Channel channel1 = con1.createChannel(false);
    verifyChannelIs(mockChannels.get(0), channel1);
    channel1.close();
    //AMQP-358
    verify(mockChannels.get(0), never()).close();

    con1.close(); // should be ignored, and placed into connection cache.
    verify(mockConnections.get(0), never()).close();
    assertEquals(1, allocatedConnections.size());
    assertEquals(1, idleConnections.size());
    assertEquals(1, cachedChannels.get(con1).size());
    assertNull(closedNotification.get());

    /*
     * will retrieve same connection that was just put into cache, and reuse single channel from cache as well
     */
    Connection con2 = ccf.createConnection();
    verifyConnectionIs(mockConnections.get(0), con2);
    Channel channel2 = con2.createChannel(false);
    verifyChannelIs(mockChannels.get(0), channel2);
    channel2.close();
    verify(mockChannels.get(0), never()).close();
    con2.close();
    verify(mockConnections.get(0), never()).close();
    assertEquals(1, allocatedConnections.size());
    assertEquals(1, idleConnections.size());
    assertNull(createNotification.get());

    /*
     * Now check for multiple connections/channels
     */
    con1 = ccf.createConnection();
    verifyConnectionIs(mockConnections.get(0), con1);
    con2 = ccf.createConnection();
    verifyConnectionIs(mockConnections.get(1), con2);
    channel1 = con1.createChannel(false);
    verifyChannelIs(mockChannels.get(0), channel1);
    channel2 = con2.createChannel(false);
    verifyChannelIs(mockChannels.get(1), channel2);
    assertEquals(2, allocatedConnections.size());
    assertEquals(0, idleConnections.size());
    assertNotNull(createNotification.get());
    assertSame(mockConnections.get(1), createNotification.getAndSet(null));

    // put mock1 in cache
    channel1.close();
    verify(mockChannels.get(1), never()).close();
    con1.close();
    verify(mockConnections.get(0), never()).close();
    assertEquals(2, allocatedConnections.size());
    assertEquals(1, idleConnections.size());
    assertNull(closedNotification.get());

    Connection con3 = ccf.createConnection();
    assertNull(createNotification.get());
    verifyConnectionIs(mockConnections.get(0), con3);
    Channel channel3 = con3.createChannel(false);
    verifyChannelIs(mockChannels.get(0), channel3);

    assertEquals(2, allocatedConnections.size());
    assertEquals(0, idleConnections.size());

    channel2.close();
    con2.close();
    assertEquals(2, allocatedConnections.size());
    assertEquals(1, idleConnections.size());
    channel3.close();
    con3.close();
    assertEquals(2, allocatedConnections.size());
    assertEquals(2, idleConnections.size());
    assertEquals(1, cachedChannels.get(con1).size());
    assertEquals(1, cachedChannels.get(con2).size());
    /*
     *  Cache size is 2; neither should have been a real close.
     *  con2 (mock2) and con1 should still be in the cache.
     */
    verify(mockConnections.get(0), never()).close(30000);
    assertNull(closedNotification.get());
    verify(mockChannels.get(1), never()).close();
    verify(mockConnections.get(1), never()).close(30000);
    verify(mockChannels.get(1), never()).close();
    assertEquals(2, idleConnections.size());
    Iterator<?> iterator = idleConnections.iterator();
    verifyConnectionIs(mockConnections.get(1), iterator.next());
    verifyConnectionIs(mockConnections.get(0), iterator.next());
    /*
     * Now a closed cached connection
     */
    when(mockConnections.get(1).isOpen()).thenReturn(false);
    con3 = ccf.createConnection();
    assertNotNull(closedNotification.get());
    assertSame(mockConnections.get(1), closedNotification.getAndSet(null));
    verifyConnectionIs(mockConnections.get(0), con3);
    assertNull(createNotification.get());
    assertEquals(2, allocatedConnections.size());
    assertEquals(1, idleConnections.size());
    channel3 = con3.createChannel(false);
    verifyChannelIs(mockChannels.get(0), channel3);
    channel3.close();
    con3.close();
    assertNull(closedNotification.get());
    assertEquals(2, allocatedConnections.size());
    assertEquals(2, idleConnections.size());

    /*
     * Now a closed cached connection when creating a channel
     */
    con3 = ccf.createConnection();
    verifyConnectionIs(mockConnections.get(0), con3);
    assertNull(createNotification.get());
    assertEquals(2, allocatedConnections.size());
    assertEquals(1, idleConnections.size());
    when(mockConnections.get(0).isOpen()).thenReturn(false);
    channel3 = con3.createChannel(false);
    assertNotNull(closedNotification.getAndSet(null));
    assertNotNull(createNotification.getAndSet(null));

    verifyChannelIs(mockChannels.get(2), channel3);
    channel3.close();
    con3.close();
    assertNull(closedNotification.get());
    assertEquals(2, allocatedConnections.size());
    assertEquals(2, idleConnections.size());

    Connection con4 = ccf.createConnection();
    assertSame(con3, con4);
    assertEquals(1, idleConnections.size());
    Channel channelA = con4.createChannel(false);
    Channel channelB = con4.createChannel(false);
    Channel channelC = con4.createChannel(false);
    channelA.close();
    assertEquals(1, cachedChannels.get(con4).size());
    channelB.close();
    assertEquals(2, cachedChannels.get(con4).size());
    channelC.close();
    assertEquals(2, cachedChannels.get(con4).size());

    // destroy
    ccf.destroy();
    assertNotNull(closedNotification.get());
    // physical wasn't invoked, because this mockConnection marked with 'false' for 'isOpen()'
    verify(mockConnections.get(0)).close(30000);
    verify(mockConnections.get(1)).close(30000);
    verify(mockConnections.get(2)).close(30000);
}