@Test public void testStartWithFailureThenSuccess() throws Exception { HornetQJMSConnectionFactory failingSourceCF = new HornetQJMSConnectionFactory( false, new TransportConfiguration(InVMConnectorFactory.class.getName())) { private static final long serialVersionUID = 4657153922210359725L; boolean firstTime = true; @Override public Connection createConnection() throws JMSException { if (firstTime) { firstTime = false; throw new JMSException("unable to create a conn"); } else { return super.createConnection(); } } }; // Note! We disable automatic reconnection on the session factory. The bridge needs to do the // reconnection failingSourceCF.setReconnectAttempts(0); failingSourceCF.setBlockOnNonDurableSend(true); failingSourceCF.setBlockOnDurableSend(true); ConnectionFactoryFactory sourceCFF = JMSBridgeImplTest.newConnectionFactoryFactory(failingSourceCF); ConnectionFactoryFactory targetCFF = JMSBridgeImplTest.newConnectionFactoryFactory(JMSBridgeImplTest.createConnectionFactory()); DestinationFactory sourceDF = JMSBridgeImplTest.newDestinationFactory( HornetQJMSClient.createQueue(JMSBridgeImplTest.SOURCE)); DestinationFactory targetDF = JMSBridgeImplTest.newDestinationFactory( HornetQJMSClient.createQueue(JMSBridgeImplTest.TARGET)); TransactionManager tm = JMSBridgeImplTest.newTransactionManager(); JMSBridgeImpl bridge = new JMSBridgeImpl(); bridge.setSourceConnectionFactoryFactory(sourceCFF); bridge.setSourceDestinationFactory(sourceDF); bridge.setTargetConnectionFactoryFactory(targetCFF); bridge.setTargetDestinationFactory(targetDF); // retry after 10 ms bridge.setFailureRetryInterval(10); // retry only once bridge.setMaxRetries(1); bridge.setMaxBatchSize(1); bridge.setMaxBatchTime(-1); bridge.setTransactionManager(tm); bridge.setQualityOfServiceMode(QualityOfServiceMode.AT_MOST_ONCE); Assert.assertFalse(bridge.isStarted()); bridge.start(); Thread.sleep(500); Assert.assertTrue(bridge.isStarted()); Assert.assertFalse(bridge.isFailed()); bridge.stop(); }
private static ConnectionFactory createConnectionFactory() { HornetQJMSConnectionFactory cf = (HornetQJMSConnectionFactory) HornetQJMSClient.createConnectionFactoryWithoutHA( JMSFactoryType.CF, new TransportConfiguration(InVMConnectorFactory.class.getName())); // Note! We disable automatic reconnection on the session factory. The bridge needs to do the // reconnection cf.setReconnectAttempts(0); cf.setBlockOnNonDurableSend(true); cf.setBlockOnDurableSend(true); return cf; }
@Test public void testExceptionOnSourceAndRetryFails() throws Exception { final AtomicReference<Connection> sourceConn = new AtomicReference<Connection>(); HornetQJMSConnectionFactory failingSourceCF = new HornetQJMSConnectionFactory(false, new TransportConfiguration(INVM_CONNECTOR_FACTORY)) { private static final long serialVersionUID = 8216804886099984645L; boolean firstTime = true; @Override public Connection createConnection() throws JMSException { if (firstTime) { firstTime = false; sourceConn.set(super.createConnection()); return sourceConn.get(); } else { throw new JMSException("exception while retrying to connect"); } } }; // Note! We disable automatic reconnection on the session factory. The bridge needs to do the // reconnection failingSourceCF.setReconnectAttempts(0); failingSourceCF.setBlockOnNonDurableSend(true); failingSourceCF.setBlockOnDurableSend(true); ConnectionFactoryFactory sourceCFF = JMSBridgeImplTest.newConnectionFactoryFactory(failingSourceCF); ConnectionFactoryFactory targetCFF = JMSBridgeImplTest.newConnectionFactoryFactory(JMSBridgeImplTest.createConnectionFactory()); DestinationFactory sourceDF = JMSBridgeImplTest.newDestinationFactory( HornetQJMSClient.createQueue(JMSBridgeImplTest.SOURCE)); DestinationFactory targetDF = JMSBridgeImplTest.newDestinationFactory( HornetQJMSClient.createQueue(JMSBridgeImplTest.TARGET)); TransactionManager tm = JMSBridgeImplTest.newTransactionManager(); JMSBridgeImpl bridge = new JMSBridgeImpl(); Assert.assertNotNull(bridge); bridge.setSourceConnectionFactoryFactory(sourceCFF); bridge.setSourceDestinationFactory(sourceDF); bridge.setTargetConnectionFactoryFactory(targetCFF); bridge.setTargetDestinationFactory(targetDF); bridge.setFailureRetryInterval(100); bridge.setMaxRetries(1); bridge.setMaxBatchSize(1); bridge.setMaxBatchTime(-1); bridge.setTransactionManager(tm); bridge.setQualityOfServiceMode(QualityOfServiceMode.AT_MOST_ONCE); Assert.assertFalse(bridge.isStarted()); bridge.start(); Assert.assertTrue(bridge.isStarted()); sourceConn .get() .getExceptionListener() .onException(new JMSException("exception on the source")); Thread.sleep(4 * bridge.getFailureRetryInterval()); // reconnection must have failed Assert.assertFalse(bridge.isStarted()); }
@Test public void testExceptionOnSourceAndRetrySucceeds() throws Exception { final AtomicReference<Connection> sourceConn = new AtomicReference<Connection>(); HornetQJMSConnectionFactory failingSourceCF = new HornetQJMSConnectionFactory( false, new TransportConfiguration(InVMConnectorFactory.class.getName())) { private static final long serialVersionUID = -8866390811966688830L; @Override public Connection createConnection() throws JMSException { sourceConn.set(super.createConnection()); return sourceConn.get(); } }; // Note! We disable automatic reconnection on the session factory. The bridge needs to do the // reconnection failingSourceCF.setReconnectAttempts(0); failingSourceCF.setBlockOnNonDurableSend(true); failingSourceCF.setBlockOnDurableSend(true); ConnectionFactoryFactory sourceCFF = JMSBridgeImplTest.newConnectionFactoryFactory(failingSourceCF); ConnectionFactoryFactory targetCFF = JMSBridgeImplTest.newConnectionFactoryFactory(JMSBridgeImplTest.createConnectionFactory()); DestinationFactory sourceDF = JMSBridgeImplTest.newDestinationFactory( HornetQJMSClient.createQueue(JMSBridgeImplTest.SOURCE)); DestinationFactory targetDF = JMSBridgeImplTest.newDestinationFactory( HornetQJMSClient.createQueue(JMSBridgeImplTest.TARGET)); TransactionManager tm = JMSBridgeImplTest.newTransactionManager(); JMSBridgeImpl bridge = new JMSBridgeImpl(); Assert.assertNotNull(bridge); bridge.setSourceConnectionFactoryFactory(sourceCFF); bridge.setSourceDestinationFactory(sourceDF); bridge.setTargetConnectionFactoryFactory(targetCFF); bridge.setTargetDestinationFactory(targetDF); bridge.setFailureRetryInterval(10); bridge.setMaxRetries(2); bridge.setMaxBatchSize(1); bridge.setMaxBatchTime(-1); bridge.setTransactionManager(tm); bridge.setQualityOfServiceMode(QualityOfServiceMode.AT_MOST_ONCE); Assert.assertFalse(bridge.isStarted()); bridge.start(); Assert.assertTrue(bridge.isStarted()); sourceConn .get() .getExceptionListener() .onException(new JMSException("exception on the source")); Thread.sleep(4 * bridge.getFailureRetryInterval()); // reconnection must have succeeded Assert.assertTrue(bridge.isStarted()); bridge.stop(); Assert.assertFalse(bridge.isStarted()); }
@Test public void testPagingOverCreatedDestinationQueues() throws Exception { Configuration config = createDefaultConfig(); config.setJournalSyncNonTransactional(false); HornetQServer server = createServer( true, config, -1, -1, AddressFullMessagePolicy.BLOCK, new HashMap<String, AddressSettings>()); JMSServerManagerImpl jmsServer = new JMSServerManagerImpl(server); InVMNamingContext context = new InVMNamingContext(); jmsServer.setContext(context); jmsServer.start(); server .getHornetQServerControl() .addAddressSettings( "jms.queue.Q1", "DLQ", "DLQ", -1, false, 5, 100 * 1024, 10 * 1024, 5, 5, 1, 1000, 0, false, "PAGE", -1, 10, "KILL"); jmsServer.createQueue(true, "Q1", null, true, "/queue/Q1"); HornetQJMSConnectionFactory cf = (HornetQJMSConnectionFactory) HornetQJMSClient.createConnectionFactoryWithoutHA( JMSFactoryType.CF, new TransportConfiguration(INVM_CONNECTOR_FACTORY)); conn = cf.createConnection(); conn.setClientID("tst"); Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); javax.jms.Queue queue = (javax.jms.Queue) context.lookup("/queue/Q1"); MessageProducer prod = sess.createProducer(queue); prod.setDeliveryMode(DeliveryMode.PERSISTENT); BytesMessage bmt = sess.createBytesMessage(); bmt.writeBytes(new byte[1024]); for (int i = 0; i < 500; i++) { prod.send(bmt); } PagingStore store = server.getPagingManager().getPageStore(new SimpleString("jms.queue.Q1")); assertEquals(100 * 1024, store.getMaxSize()); assertEquals(10 * 1024, store.getPageSizeBytes()); assertEquals(AddressFullMessagePolicy.PAGE, store.getAddressFullMessagePolicy()); jmsServer.stop(); server = createServer( true, config, -1, -1, AddressFullMessagePolicy.BLOCK, new HashMap<String, AddressSettings>()); jmsServer = new JMSServerManagerImpl(server); context = new InVMNamingContext(); jmsServer.setContext(context); jmsServer.start(); AddressSettings settings = server.getAddressSettingsRepository().getMatch("jms.queue.Q1"); assertEquals(100 * 1024, settings.getMaxSizeBytes()); assertEquals(10 * 1024, settings.getPageSizeBytes()); assertEquals(AddressFullMessagePolicy.PAGE, settings.getAddressFullMessagePolicy()); store = server.getPagingManager().getPageStore(new SimpleString("jms.queue.Q1")); assertEquals(100 * 1024, store.getMaxSize()); assertEquals(10 * 1024, store.getPageSizeBytes()); assertEquals(AddressFullMessagePolicy.PAGE, store.getAddressFullMessagePolicy()); }
@Test public void testPagingOverCreatedDestinationTopics() throws Exception { Configuration config = createDefaultConfig(); config.setJournalSyncNonTransactional(false); HornetQServer server = createServer(true, config, PAGE_SIZE, -1, new HashMap<String, AddressSettings>()); JMSServerManagerImpl jmsServer = new JMSServerManagerImpl(server); InVMNamingContext context = new InVMNamingContext(); jmsServer.setContext(context); jmsServer.start(); jmsServer.createTopic(true, "tt", "/topic/TT"); server .getHornetQServerControl() .addAddressSettings( "jms.topic.TT", "DLQ", "DLQ", -1, false, 5, 1024 * 1024, 1024 * 10, 5, 5, 1, 1000, 0, false, "PAGE", -1, 10, "KILL"); HornetQJMSConnectionFactory cf = (HornetQJMSConnectionFactory) HornetQJMSClient.createConnectionFactoryWithoutHA( JMSFactoryType.CF, new TransportConfiguration(INVM_CONNECTOR_FACTORY)); Connection conn = cf.createConnection(); conn.setClientID("tst"); Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); Topic topic = (Topic) context.lookup("/topic/TT"); sess.createDurableSubscriber(topic, "t1"); MessageProducer prod = sess.createProducer(topic); prod.setDeliveryMode(DeliveryMode.PERSISTENT); TextMessage txt = sess.createTextMessage("TST"); prod.send(txt); PagingStore store = server.getPagingManager().getPageStore(new SimpleString("jms.topic.TT")); assertEquals(1024 * 1024, store.getMaxSize()); assertEquals(10 * 1024, store.getPageSizeBytes()); jmsServer.stop(); server = createServer(true, config, PAGE_SIZE, -1, new HashMap<String, AddressSettings>()); jmsServer = new JMSServerManagerImpl(server); context = new InVMNamingContext(); jmsServer.setContext(context); jmsServer.start(); AddressSettings settings = server.getAddressSettingsRepository().getMatch("jms.topic.TT"); assertEquals(1024 * 1024, settings.getMaxSizeBytes()); assertEquals(10 * 1024, settings.getPageSizeBytes()); assertEquals(AddressFullMessagePolicy.PAGE, settings.getAddressFullMessagePolicy()); store = server.getPagingManager().getPageStore(new SimpleString("TT")); conn.close(); server.stop(); }