Search in sources :

Example 1 with Incrementor

use of org.jboss.as.test.clustering.cluster.ejb.remote.bean.Incrementor in project wildfly by wildfly.

the class RemoteFailoverTestCase method testConcurrentFailover.

public void testConcurrentFailover(Lifecycle lifecycle) throws Exception {
    // TODO Elytron: Once support for legacy EJB properties has been added back, actually set the EJB properties
    // that should be used for this test using CLIENT_PROPERTIES and ensure the EJB client context is reset
    // to its original state at the end of the test
    EJBClientContextSelector.setup(CLIENT_PROPERTIES);
    try (EJBDirectory directory = new RemoteEJBDirectory(MODULE_NAME)) {
        Incrementor bean = directory.lookupStateful(SlowToDestroyStatefulIncrementorBean.class, Incrementor.class);
        AtomicInteger count = new AtomicInteger();
        // Allow sufficient time for client to receive full topology
        Thread.sleep(CLIENT_TOPOLOGY_UPDATE_WAIT);
        String target = bean.increment().getNode();
        count.incrementAndGet();
        ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
        try {
            CountDownLatch latch = new CountDownLatch(1);
            Future<?> future = executor.scheduleWithFixedDelay(new IncrementTask(bean, count, latch), 0, INVOCATION_WAIT, TimeUnit.MILLISECONDS);
            latch.await();
            lifecycle.stop(target);
            future.cancel(false);
            try {
                future.get();
            } catch (CancellationException e) {
            // Ignore
            }
            lifecycle.start(target);
            latch = new CountDownLatch(1);
            future = executor.scheduleWithFixedDelay(new LookupTask(directory, SlowToDestroyStatefulIncrementorBean.class, latch), 0, INVOCATION_WAIT, TimeUnit.MILLISECONDS);
            latch.await();
            lifecycle.stop(target);
            future.cancel(false);
            try {
                future.get();
            } catch (CancellationException e) {
            // Ignore
            }
            lifecycle.start(target);
        } finally {
            executor.shutdownNow();
        }
    }
}
Also used : ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) CancellationException(java.util.concurrent.CancellationException) Incrementor(org.jboss.as.test.clustering.cluster.ejb.remote.bean.Incrementor) RemoteEJBDirectory(org.jboss.as.test.clustering.ejb.RemoteEJBDirectory) CountDownLatch(java.util.concurrent.CountDownLatch) RemoteEJBDirectory(org.jboss.as.test.clustering.ejb.RemoteEJBDirectory) EJBDirectory(org.jboss.as.test.clustering.ejb.EJBDirectory)

Example 2 with Incrementor

use of org.jboss.as.test.clustering.cluster.ejb.remote.bean.Incrementor in project wildfly by wildfly.

the class RemoteFailoverTestCase method testStatefulFailover.

@InSequence(2)
@Test
public void testStatefulFailover() throws Exception {
    // TODO Elytron: Once support for legacy EJB properties has been added back, actually set the EJB properties
    // that should be used for this test using CLIENT_PROPERTIES and ensure the EJB client context is reset
    // to its original state at the end of the test
    EJBClientContextSelector.setup(CLIENT_PROPERTIES);
    try (EJBDirectory context = new RemoteEJBDirectory(MODULE_NAME)) {
        Incrementor bean = context.lookupStateful(StatefulIncrementorBean.class, Incrementor.class);
        Result<Integer> result = bean.increment();
        String target = result.getNode();
        int count = 1;
        Assert.assertEquals(count++, result.getValue().intValue());
        // Bean should retain weak affinity for this node
        for (int i = 0; i < COUNT; ++i) {
            result = bean.increment();
            Assert.assertEquals(count++, result.getValue().intValue());
            Assert.assertEquals(String.valueOf(i), target, result.getNode());
        }
        undeploy(this.findDeployment(target));
        result = bean.increment();
        // Bean should failover to other node
        String failoverTarget = result.getNode();
        Assert.assertEquals(count++, result.getValue().intValue());
        Assert.assertNotEquals(target, failoverTarget);
        deploy(this.findDeployment(target));
        // Allow sufficient time for client to receive new topology
        Thread.sleep(CLIENT_TOPOLOGY_UPDATE_WAIT);
        result = bean.increment();
        String failbackTarget = result.getNode();
        Assert.assertEquals(count++, result.getValue().intValue());
        // Bean should retain weak affinity for this node
        Assert.assertEquals(failoverTarget, failbackTarget);
        result = bean.increment();
        // Bean may have acquired new weak affinity
        target = result.getNode();
        Assert.assertEquals(count++, result.getValue().intValue());
        // Bean should retain weak affinity for this node
        for (int i = 0; i < COUNT; ++i) {
            result = bean.increment();
            Assert.assertEquals(count++, result.getValue().intValue());
            Assert.assertEquals(String.valueOf(i), target, result.getNode());
        }
        stop(this.findContainer(target));
        result = bean.increment();
        // Bean should failover to other node
        failoverTarget = result.getNode();
        Assert.assertEquals(count++, result.getValue().intValue());
        Assert.assertNotEquals(target, failoverTarget);
        start(this.findContainer(target));
        // Allow sufficient time for client to receive new topology
        Thread.sleep(CLIENT_TOPOLOGY_UPDATE_WAIT);
        result = bean.increment();
        failbackTarget = result.getNode();
        Assert.assertEquals(count++, result.getValue().intValue());
        // Bean should retain weak affinity for this node
        Assert.assertEquals(failoverTarget, failbackTarget);
        result = bean.increment();
        // Bean may have acquired new weak affinity
        target = result.getNode();
        Assert.assertEquals(count++, result.getValue().intValue());
        // Bean should retain weak affinity for this node
        for (int i = 0; i < COUNT; ++i) {
            result = bean.increment();
            Assert.assertEquals(count++, result.getValue().intValue());
            Assert.assertEquals(String.valueOf(i), target, result.getNode());
        }
    }
}
Also used : AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Incrementor(org.jboss.as.test.clustering.cluster.ejb.remote.bean.Incrementor) RemoteEJBDirectory(org.jboss.as.test.clustering.ejb.RemoteEJBDirectory) RemoteEJBDirectory(org.jboss.as.test.clustering.ejb.RemoteEJBDirectory) EJBDirectory(org.jboss.as.test.clustering.ejb.EJBDirectory) InSequence(org.jboss.arquillian.junit.InSequence) Test(org.junit.Test)

Example 3 with Incrementor

use of org.jboss.as.test.clustering.cluster.ejb.remote.bean.Incrementor in project wildfly by wildfly.

the class RemoteFailoverTestCase method testClientException.

/**
     * Test for WFLY-5788.
     */
@InSequence(5)
@Test
public void testClientException() throws Exception {
    // TODO Elytron: Once support for legacy EJB properties has been added back, actually set the EJB properties
    // that should be used for this test using CLIENT_PROPERTIES and ensure the EJB client context is reset
    // to its original state at the end of the test
    EJBClientContextSelector.setup(CLIENT_PROPERTIES);
    try (EJBDirectory context = new RemoteEJBDirectory(MODULE_NAME)) {
        Incrementor bean = context.lookupStateful(InfinispanExceptionThrowingIncrementorBean.class, Incrementor.class);
        bean.increment();
    } catch (Exception ejbException) {
        assertTrue("Expected exception wrapped in EJBException", ejbException instanceof EJBException);
        assertNull("Cause of EJBException has not been removed", ejbException.getCause());
        return;
    }
    fail("Expected EJBException but didn't catch it");
}
Also used : Incrementor(org.jboss.as.test.clustering.cluster.ejb.remote.bean.Incrementor) RemoteEJBDirectory(org.jboss.as.test.clustering.ejb.RemoteEJBDirectory) EJBException(javax.ejb.EJBException) RemoteEJBDirectory(org.jboss.as.test.clustering.ejb.RemoteEJBDirectory) EJBDirectory(org.jboss.as.test.clustering.ejb.EJBDirectory) NamingException(javax.naming.NamingException) CancellationException(java.util.concurrent.CancellationException) EJBException(javax.ejb.EJBException) InSequence(org.jboss.arquillian.junit.InSequence) Test(org.junit.Test)

Example 4 with Incrementor

use of org.jboss.as.test.clustering.cluster.ejb.remote.bean.Incrementor in project wildfly by wildfly.

the class RemoteFailoverTestCase method testStatelessFailover.

private void testStatelessFailover(String properties, Class<? extends Incrementor> beanClass) throws Exception {
    // TODO Elytron: Once support for legacy EJB properties has been added back, actually set the EJB properties
    // that should be used for this test using properties and ensure the EJB client context is reset
    // to its original state at the end of the test
    EJBClientContextSelector.setup(properties);
    try (EJBDirectory context = new RemoteEJBDirectory(MODULE_NAME)) {
        Incrementor bean = context.lookupStateless(beanClass, Incrementor.class);
        // Allow sufficient time for client to receive full topology
        Thread.sleep(CLIENT_TOPOLOGY_UPDATE_WAIT);
        List<String> results = new ArrayList<>(COUNT);
        for (int i = 0; i < COUNT; ++i) {
            Result<Integer> result = bean.increment();
            results.add(result.getNode());
            Thread.sleep(INVOCATION_WAIT);
        }
        for (String node : NODES) {
            int frequency = Collections.frequency(results, node);
            assertTrue(String.valueOf(frequency) + " invocations were routed to " + node, frequency > 0);
        }
        undeploy(DEPLOYMENT_1);
        for (int i = 0; i < COUNT; ++i) {
            Result<Integer> result = bean.increment();
            results.set(i, result.getNode());
            Thread.sleep(INVOCATION_WAIT);
        }
        Assert.assertEquals(0, Collections.frequency(results, NODE_1));
        Assert.assertEquals(COUNT, Collections.frequency(results, NODE_2));
        deploy(DEPLOYMENT_1);
        // Allow sufficient time for client to receive new topology
        Thread.sleep(CLIENT_TOPOLOGY_UPDATE_WAIT);
        for (int i = 0; i < COUNT; ++i) {
            Result<Integer> result = bean.increment();
            results.set(i, result.getNode());
            Thread.sleep(INVOCATION_WAIT);
        }
        for (String node : NODES) {
            int frequency = Collections.frequency(results, node);
            assertTrue(String.valueOf(frequency) + " invocations were routed to " + node, frequency > 0);
        }
        stop(CONTAINER_2);
        for (int i = 0; i < COUNT; ++i) {
            Result<Integer> result = bean.increment();
            results.set(i, result.getNode());
            Thread.sleep(INVOCATION_WAIT);
        }
        Assert.assertEquals(COUNT, Collections.frequency(results, NODE_1));
        Assert.assertEquals(0, Collections.frequency(results, NODE_2));
        start(CONTAINER_2);
        // Allow sufficient time for client to receive new topology
        Thread.sleep(CLIENT_TOPOLOGY_UPDATE_WAIT);
        for (int i = 0; i < COUNT; ++i) {
            Result<Integer> result = bean.increment();
            results.set(i, result.getNode());
            Thread.sleep(INVOCATION_WAIT);
        }
        for (String node : NODES) {
            int frequency = Collections.frequency(results, node);
            assertTrue(String.valueOf(frequency) + " invocations were routed to " + node, frequency > 0);
        }
    }
}
Also used : AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ArrayList(java.util.ArrayList) Incrementor(org.jboss.as.test.clustering.cluster.ejb.remote.bean.Incrementor) RemoteEJBDirectory(org.jboss.as.test.clustering.ejb.RemoteEJBDirectory) RemoteEJBDirectory(org.jboss.as.test.clustering.ejb.RemoteEJBDirectory) EJBDirectory(org.jboss.as.test.clustering.ejb.EJBDirectory)

Aggregations

Incrementor (org.jboss.as.test.clustering.cluster.ejb.remote.bean.Incrementor)4 EJBDirectory (org.jboss.as.test.clustering.ejb.EJBDirectory)4 RemoteEJBDirectory (org.jboss.as.test.clustering.ejb.RemoteEJBDirectory)4 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)3 CancellationException (java.util.concurrent.CancellationException)2 InSequence (org.jboss.arquillian.junit.InSequence)2 Test (org.junit.Test)2 ArrayList (java.util.ArrayList)1 CountDownLatch (java.util.concurrent.CountDownLatch)1 ScheduledExecutorService (java.util.concurrent.ScheduledExecutorService)1 EJBException (javax.ejb.EJBException)1 NamingException (javax.naming.NamingException)1