use of org.mule.runtime.api.util.concurrent.Latch in project mule by mulesoft.
the class RoutersExecutionTestCase method concurrentRouterExecution.
/**
* Executes the same flow concurrently to check that no race condition exists because
* two different instances of Chain are being used
*/
@Test
public void concurrentRouterExecution() throws Exception {
executor = newFixedThreadPool(2);
final Latch beginLatch = new Latch();
final CountDownLatch assertLatch = new CountDownLatch(2);
final Consumer<Reference<CoreEvent>> runner = reference -> {
try {
beginLatch.await(10000, MILLISECONDS);
reference.set(flowRunner("singleRouteRouter").withPayload("CustomPayload").run());
assertLatch.countDown();
} catch (Exception e) {
fail(e.getMessage());
}
};
final Reference<CoreEvent> first = new Reference<>();
final Reference<CoreEvent> second = new Reference<>();
executor.submit(() -> runner.accept(first));
executor.submit(() -> runner.accept(second));
beginLatch.release();
assertLatch.await(10000, MILLISECONDS);
CoreEvent firstResult = first.get();
assertThat(firstResult, is(notNullValue()));
CoreEvent secondResult = second.get();
assertThat(secondResult, is(notNullValue()));
assertThat(secondResult, is(not(sameInstance(firstResult))));
assertThat(firstResult.getMessage().getPayload().getValue(), is("CustomPayload"));
assertThat(secondResult.getMessage().getPayload().getValue(), is("CustomPayload"));
}
use of org.mule.runtime.api.util.concurrent.Latch in project mule by mulesoft.
the class AbstractTransactionQueueManagerTestCase method testTakePutRollbackPut.
@Test
public void testTakePutRollbackPut() throws Exception {
final QueueManager mgr = createQueueManager();
mgr.start();
final Latch latch = new Latch();
Thread t = new Thread() {
@Override
public void run() {
try {
latch.countDown();
Thread.sleep(200);
QueueSession s = mgr.getQueueSession();
Queue q = s.getQueue("queue1");
assertEquals("Queue size", 0, q.size());
s.begin();
q.put("String1");
s.rollback();
s.begin();
q.put("String2");
s.commit();
} catch (Exception e) {
// ignore, let test fail
}
}
};
t.start();
latch.await();
long t0 = System.currentTimeMillis();
QueueSession s = mgr.getQueueSession();
Queue q = s.getQueue("queue1");
assertEquals("Queue size", 0, q.size());
Object o = q.take();
long t1 = System.currentTimeMillis();
t.join();
assertNotNull(o);
assertEquals("Queue content", "String2", o);
assertEquals("Queue size", 0, q.size());
assertTrue(t1 - t0 > 100);
mgr.stop();
}
use of org.mule.runtime.api.util.concurrent.Latch in project mule by mulesoft.
the class AbstractTransactionQueueManagerTestCase method testPutTakeUntakeRollbackUntake.
@Test
public void testPutTakeUntakeRollbackUntake() throws Exception {
final QueueManager mgr = createQueueManager();
mgr.start();
final Latch latch = new Latch();
final Serializable object1 = "string1";
final Serializable object2 = "string2";
Thread t = new Thread() {
@Override
public void run() {
try {
latch.countDown();
Thread.sleep(200);
QueueSession s = mgr.getQueueSession();
Queue q = s.getQueue("queue1");
assertEquals("Queue size", 0, q.size());
s.begin();
q.untake(object1);
s.commit();
s.begin();
q.untake(object2);
s.rollback();
} catch (Exception e) {
// ignore, let test fail
}
}
};
t.start();
latch.await();
long t0 = System.currentTimeMillis();
QueueSession s = mgr.getQueueSession();
Queue q = s.getQueue("queue1");
assertEquals("Queue size", 0, q.size());
Object o = q.take();
long t1 = System.currentTimeMillis();
t.join();
assertNotNull(o);
assertEquals("Queue content", object1, o);
assertEquals("Queue size", 0, q.size());
assertTrue(t1 - t0 > 100);
mgr.stop();
}
use of org.mule.runtime.api.util.concurrent.Latch in project mule by mulesoft.
the class AbstractTransactionQueueManagerTestCase method testPutTakeUntake.
@Test
public void testPutTakeUntake() throws Exception {
final QueueManager mgr = createQueueManager();
mgr.start();
final Latch latch = new Latch();
Thread t = new Thread() {
@Override
public void run() {
try {
latch.countDown();
Thread.sleep(200);
QueueSession s = mgr.getQueueSession();
Queue q = s.getQueue("queue1");
assertEquals("Queue size", 0, q.size());
q.put("String1");
q.put("String2");
} catch (Exception e) {
// ignore, let test fail
}
}
};
t.start();
latch.await();
long t0 = System.currentTimeMillis();
QueueSession s = mgr.getQueueSession();
Queue q = s.getQueue("queue1");
assertEquals("Queue size", 0, q.size());
Serializable o = q.take();
long t1 = System.currentTimeMillis();
t.join();
assertNotNull(o);
assertEquals("Queue content", "String1", o);
assertEquals("Queue size", 1, q.size());
assertTrue(t1 - t0 > 100);
// Same as put/take until now, but now we do an untake
q.untake(o);
// Ensure queue size is now 2
assertEquals("Queue size", 2, q.size());
// Take to ensure order is correct
Object o2 = q.take();
assertEquals("Queue content", "String1", o2);
assertEquals("Queue size", 1, q.size());
mgr.stop();
}
Aggregations