Beispiel #1
0
  @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());
  }
Beispiel #2
0
  @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());
  }