/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.transport.jms; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.fail; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.jms.ConnectionFactory; import org.apache.activemq.pool.PooledConnectionFactory; import org.springframework.jms.core.JmsTemplate; import org.testng.annotations.Test; import com.opengamma.transport.BatchByteArrayMessageReceiver; import com.opengamma.util.test.ActiveMQTestUtils; import com.opengamma.util.test.TestGroup; /** * Test. */ @Test(groups = TestGroup.INTEGRATION) public class JmsBatchMessageDispatcherTest { @Test(invocationCount = 5, successPercentage = 19) public void queueOperation() throws InterruptedException { String queueName = "JmsBatchMessageDispatcherTest-queueOperation-" + System.getProperty("user.name") + "-" + System.currentTimeMillis(); ConnectionFactory cf = new PooledConnectionFactory(ActiveMQTestUtils.createTestConnectionFactory()); JmsTemplate sendingTemplate = new JmsTemplate(); sendingTemplate.setConnectionFactory(cf); sendingTemplate.setPubSubDomain(false); sendingTemplate.setDefaultDestinationName(queueName); sendingTemplate.afterPropertiesSet(); JmsTemplate receivingTemplate = new JmsTemplate(); receivingTemplate.setConnectionFactory(cf); receivingTemplate.setPubSubDomain(false); receivingTemplate.setDefaultDestinationName(queueName); receivingTemplate.afterPropertiesSet(); JmsByteArrayMessageSender messageSender = new JmsByteArrayMessageSender(queueName, sendingTemplate); JmsBatchMessageDispatcher dispatcher = new JmsBatchMessageDispatcher(receivingTemplate); final List<Integer> batchSizes = Collections.synchronizedList(new ArrayList<Integer>()); BatchByteArrayMessageReceiver receiver = new BatchByteArrayMessageReceiver() { @Override public void messagesReceived(List<byte[]> messages) { batchSizes.add(messages.size()); } }; dispatcher.addReceiver(receiver); // First we put messages into the queue messageSender.send(new byte[10]); messageSender.send(new byte[10]); messageSender.send(new byte[10]); messageSender.send(new byte[10]); messageSender.send(new byte[10]); // Add in a delay. Thread.sleep(1000l); // Now start the dispatcher. dispatcher.start(); assertBatchSize(batchSizes, 5); batchSizes.clear(); messageSender.send(new byte[20]); assertBatchSize(batchSizes, 1); dispatcher.stop(); } private static void assertBatchSize(List<Integer> batchSizes, int totalSize) throws InterruptedException { int actualTotal = 0; long startTime = System.currentTimeMillis(); while(actualTotal < totalSize) { while(batchSizes.isEmpty()) { Thread.sleep(100); if ((System.currentTimeMillis() - startTime) > 5000l) { fail("Did not receive a batch in 5 seconds."); } } synchronized(batchSizes) { for(Integer batchSize : batchSizes) { actualTotal += batchSize; } batchSizes.clear(); } if ((System.currentTimeMillis() - startTime) > 5000l) { fail("Did not receive expected total batches in 5 seconds."); } } assertEquals(actualTotal, totalSize); } }