Search in sources :

Example 6 with Bridge

use of org.apache.activemq.artemis.core.server.cluster.Bridge in project activemq-artemis by apache.

the class BridgeStartTest method testManualStopStart.

@Test
public void testManualStopStart() throws Exception {
    Map<String, Object> server0Params = new HashMap<>();
    ActiveMQServer server0 = createClusteredServerWithParams(isNetty(), 0, false, server0Params);
    Map<String, Object> server1Params = new HashMap<>();
    if (isNetty()) {
        server1Params.put("port", org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants.DEFAULT_PORT + 1);
    } else {
        server1Params.put(TransportConstants.SERVER_ID_PROP_NAME, 1);
    }
    ActiveMQServer server1 = createClusteredServerWithParams(isNetty(), 1, false, server1Params);
    final String testAddress = "testAddress";
    final String queueName0 = "queue0";
    final String forwardAddress = "forwardAddress";
    final String queueName1 = "queue1";
    ServerLocator locator = null;
    try {
        Map<String, TransportConfiguration> connectors = new HashMap<>();
        TransportConfiguration server0tc = new TransportConfiguration(getConnector(), server0Params);
        TransportConfiguration server1tc = new TransportConfiguration(getConnector(), server1Params);
        connectors.put(server1tc.getName(), server1tc);
        server0.getConfiguration().setConnectorConfigurations(connectors);
        ArrayList<String> staticConnectors = new ArrayList<>();
        staticConnectors.add(server1tc.getName());
        final String bridgeName = "bridge1";
        BridgeConfiguration bridgeConfiguration = new BridgeConfiguration().setName(bridgeName).setQueueName(queueName0).setForwardingAddress(forwardAddress).setRetryInterval(1000).setReconnectAttempts(1).setReconnectAttemptsOnSameNode(0).setConfirmationWindowSize(1024).setStaticConnectors(staticConnectors);
        List<BridgeConfiguration> bridgeConfigs = new ArrayList<>();
        bridgeConfigs.add(bridgeConfiguration);
        server0.getConfiguration().setBridgeConfigurations(bridgeConfigs);
        CoreQueueConfiguration queueConfig0 = new CoreQueueConfiguration().setAddress(testAddress).setName(queueName0);
        List<CoreQueueConfiguration> queueConfigs0 = new ArrayList<>();
        queueConfigs0.add(queueConfig0);
        server0.getConfiguration().setQueueConfigurations(queueConfigs0);
        CoreQueueConfiguration queueConfig1 = new CoreQueueConfiguration().setAddress(forwardAddress).setName(queueName1);
        List<CoreQueueConfiguration> queueConfigs1 = new ArrayList<>();
        queueConfigs1.add(queueConfig1);
        server1.getConfiguration().setQueueConfigurations(queueConfigs1);
        server1.start();
        waitForServerToStart(server1);
        server0.start();
        waitForServerToStart(server0);
        locator = ActiveMQClient.createServerLocatorWithoutHA(server0tc, server1tc);
        ClientSessionFactory sf0 = locator.createSessionFactory(server0tc);
        ClientSession session0 = sf0.createSession(false, true, true);
        ClientProducer producer0 = session0.createProducer(new SimpleString(testAddress));
        final int numMessages = 10;
        final SimpleString propKey = new SimpleString("testkey");
        for (int i = 0; i < numMessages; i++) {
            ClientMessage message = session0.createMessage(false);
            message.putIntProperty(propKey, i);
            producer0.send(message);
        }
        ClientSessionFactory sf1 = locator.createSessionFactory(server1tc);
        ClientSession session1 = sf1.createSession(false, true, true);
        ClientConsumer consumer1 = session1.createConsumer(queueName1);
        session1.start();
        for (int i = 0; i < numMessages; i++) {
            ClientMessage message = consumer1.receive(1000);
            Assert.assertNotNull(message);
            Assert.assertEquals(i, message.getObjectProperty(propKey));
            message.acknowledge();
        }
        Assert.assertNull(consumer1.receiveImmediate());
        // Now stop the bridge manually
        Bridge bridge = server0.getClusterManager().getBridges().get(bridgeName);
        BridgeStartTest.log.info("stopping bridge manually");
        bridge.stop();
        bridge.flushExecutor();
        for (int i = numMessages; i < numMessages * 2; i++) {
            ClientMessage message = session0.createMessage(false);
            message.putIntProperty(propKey, i);
            producer0.send(message);
        }
        Assert.assertNull(consumer1.receiveImmediate());
        bridge.start();
        BridgeStartTest.log.info("started bridge");
        for (int i = numMessages; i < numMessages * 2; i++) {
            ClientMessage message = consumer1.receive(1000);
            Assert.assertNotNull(message);
            Assert.assertEquals(i, message.getObjectProperty(propKey));
            message.acknowledge();
        }
        Assert.assertNull(consumer1.receiveImmediate());
        bridge.stop();
        bridge.flushExecutor();
        for (int i = 0; i < numMessages; i++) {
            ClientMessage message = session0.createMessage(false);
            message.putIntProperty(propKey, i);
            producer0.send(message);
        }
        Assert.assertNull(consumer1.receiveImmediate());
        bridge.start();
        for (int i = 0; i < numMessages; i++) {
            ClientMessage message = consumer1.receive(1000);
            Assert.assertNotNull(message);
            Assert.assertEquals(i, message.getObjectProperty(propKey));
            message.acknowledge();
        }
        Assert.assertNull(consumer1.receiveImmediate());
        session1.close();
        sf1.close();
        session0.close();
        sf0.close();
    } finally {
        if (locator != null) {
            locator.close();
        }
        server0.stop();
        server1.stop();
    }
}
Also used : HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) BridgeConfiguration(org.apache.activemq.artemis.core.config.BridgeConfiguration) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) TransportConfiguration(org.apache.activemq.artemis.api.core.TransportConfiguration) CoreQueueConfiguration(org.apache.activemq.artemis.core.config.CoreQueueConfiguration) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) ActiveMQServer(org.apache.activemq.artemis.core.server.ActiveMQServer) ClientSession(org.apache.activemq.artemis.api.core.client.ClientSession) ClientSessionFactory(org.apache.activemq.artemis.api.core.client.ClientSessionFactory) ClientConsumer(org.apache.activemq.artemis.api.core.client.ClientConsumer) ClientProducer(org.apache.activemq.artemis.api.core.client.ClientProducer) ServerLocator(org.apache.activemq.artemis.api.core.client.ServerLocator) Bridge(org.apache.activemq.artemis.core.server.cluster.Bridge) Test(org.junit.Test)

Example 7 with Bridge

use of org.apache.activemq.artemis.core.server.cluster.Bridge in project activemq-artemis by apache.

the class BridgeStartTest method testStartStop.

@Test
public void testStartStop() throws Exception {
    Map<String, Object> server0Params = new HashMap<>();
    ActiveMQServer server0 = createClusteredServerWithParams(isNetty(), 0, true, server0Params);
    Map<String, Object> server1Params = new HashMap<>();
    if (isNetty()) {
        server1Params.put("port", org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants.DEFAULT_PORT + 1);
    } else {
        server1Params.put(TransportConstants.SERVER_ID_PROP_NAME, 1);
    }
    ActiveMQServer server1 = createClusteredServerWithParams(isNetty(), 1, true, server1Params);
    ServerLocator locator = null;
    try {
        final String testAddress = "testAddress";
        final String queueName0 = "queue0";
        final String forwardAddress = "forwardAddress";
        final String queueName1 = "queue1";
        Map<String, TransportConfiguration> connectors = new HashMap<>();
        TransportConfiguration server0tc = new TransportConfiguration(getConnector(), server0Params);
        TransportConfiguration server1tc = new TransportConfiguration(getConnector(), server1Params);
        connectors.put(server1tc.getName(), server1tc);
        server0.getConfiguration().setConnectorConfigurations(connectors);
        ArrayList<String> staticConnectors = new ArrayList<>();
        staticConnectors.add(server1tc.getName());
        final String bridgeName = "bridge1";
        BridgeConfiguration bridgeConfiguration = new BridgeConfiguration().setName(bridgeName).setQueueName(queueName0).setForwardingAddress(forwardAddress).setRetryInterval(1000).setReconnectAttempts(0).setReconnectAttemptsOnSameNode(0).setConfirmationWindowSize(1024).setStaticConnectors(staticConnectors);
        List<BridgeConfiguration> bridgeConfigs = new ArrayList<>();
        bridgeConfigs.add(bridgeConfiguration);
        server0.getConfiguration().setBridgeConfigurations(bridgeConfigs);
        CoreQueueConfiguration queueConfig0 = new CoreQueueConfiguration().setAddress(testAddress).setName(queueName0);
        List<CoreQueueConfiguration> queueConfigs0 = new ArrayList<>();
        queueConfigs0.add(queueConfig0);
        server0.getConfiguration().setQueueConfigurations(queueConfigs0);
        CoreQueueConfiguration queueConfig1 = new CoreQueueConfiguration().setAddress(forwardAddress).setName(queueName1);
        List<CoreQueueConfiguration> queueConfigs1 = new ArrayList<>();
        queueConfigs1.add(queueConfig1);
        server1.getConfiguration().setQueueConfigurations(queueConfigs1);
        server1.start();
        waitForServerToStart(server1);
        server0.start();
        waitForServerToStart(server0);
        locator = ActiveMQClient.createServerLocatorWithoutHA(server0tc, server1tc);
        ClientSessionFactory sf0 = locator.createSessionFactory(server0tc);
        ClientSessionFactory sf1 = locator.createSessionFactory(server1tc);
        ClientSession session0 = sf0.createSession(false, true, true);
        ClientSession session1 = sf1.createSession(false, true, true);
        ClientProducer producer0 = session0.createProducer(new SimpleString(testAddress));
        ClientConsumer consumer1 = session1.createConsumer(queueName1);
        session1.start();
        final int numMessages = 10;
        final SimpleString propKey = new SimpleString("testkey");
        for (int i = 0; i < numMessages; i++) {
            ClientMessage message = session0.createMessage(false);
            message.putIntProperty(propKey, i);
            producer0.send(message);
        }
        for (int i = 0; i < numMessages; i++) {
            ClientMessage message = consumer1.receive(200);
            Assert.assertNotNull(message);
            Assert.assertEquals(i, message.getObjectProperty(propKey));
            message.acknowledge();
        }
        Assert.assertNull(consumer1.receiveImmediate());
        Bridge bridge = server0.getClusterManager().getBridges().get(bridgeName);
        bridge.stop();
        bridge.flushExecutor();
        for (int i = 0; i < numMessages; i++) {
            ClientMessage message = session0.createMessage(false);
            message.putIntProperty(propKey, i);
            producer0.send(message);
        }
        Assert.assertNull(consumer1.receiveImmediate());
        bridge.start();
        for (int i = 0; i < numMessages; i++) {
            ClientMessage message = consumer1.receive(1000);
            Assert.assertNotNull(message);
            Assert.assertEquals(i, message.getObjectProperty(propKey));
            message.acknowledge();
        }
        Assert.assertNull(consumer1.receiveImmediate());
        session0.close();
        session1.close();
        sf0.close();
        sf1.close();
    } finally {
        if (locator != null) {
            locator.close();
        }
        server0.stop();
        server1.stop();
    }
}
Also used : HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) BridgeConfiguration(org.apache.activemq.artemis.core.config.BridgeConfiguration) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) TransportConfiguration(org.apache.activemq.artemis.api.core.TransportConfiguration) CoreQueueConfiguration(org.apache.activemq.artemis.core.config.CoreQueueConfiguration) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) ActiveMQServer(org.apache.activemq.artemis.core.server.ActiveMQServer) ClientSession(org.apache.activemq.artemis.api.core.client.ClientSession) ClientSessionFactory(org.apache.activemq.artemis.api.core.client.ClientSessionFactory) ClientConsumer(org.apache.activemq.artemis.api.core.client.ClientConsumer) ClientProducer(org.apache.activemq.artemis.api.core.client.ClientProducer) ServerLocator(org.apache.activemq.artemis.api.core.client.ServerLocator) Bridge(org.apache.activemq.artemis.core.server.cluster.Bridge) Test(org.junit.Test)

Example 8 with Bridge

use of org.apache.activemq.artemis.core.server.cluster.Bridge in project activemq-artemis by apache.

the class BridgeReconnectTest method testReconnectSameNode.

// Fail bridge and reconnect same node, no backup specified
@Test
public void testReconnectSameNode() throws Exception {
    server0 = createActiveMQServer(0, isNetty(), server0Params);
    TransportConfiguration server0tc = new TransportConfiguration(getConnector(), server0Params, "server0tc");
    server0.getConfiguration().setConnectorConfigurations(connectors);
    server1.getConfiguration().setConnectorConfigurations(connectors);
    BridgeConfiguration bridgeConfiguration = createBridgeConfig();
    List<BridgeConfiguration> bridgeConfigs = new ArrayList<>();
    bridgeConfigs.add(bridgeConfiguration);
    server0.getConfiguration().setBridgeConfigurations(bridgeConfigs);
    CoreQueueConfiguration queueConfig0 = new CoreQueueConfiguration().setAddress(testAddress).setName(queueName);
    List<CoreQueueConfiguration> queueConfigs0 = new ArrayList<>();
    queueConfigs0.add(queueConfig0);
    server0.getConfiguration().setQueueConfigurations(queueConfigs0);
    CoreQueueConfiguration queueConfig1 = new CoreQueueConfiguration().setAddress(forwardAddress).setName(queueName);
    List<CoreQueueConfiguration> queueConfigs1 = new ArrayList<>();
    queueConfigs1.add(queueConfig1);
    server1.getConfiguration().setQueueConfigurations(queueConfigs1);
    startServers();
    locator = addServerLocator(ActiveMQClient.createServerLocatorWithHA(server0tc, server1tc));
    ClientSessionFactory csf0 = locator.createSessionFactory(server0tc);
    session0 = csf0.createSession(false, true, true);
    ClientSessionFactory csf1 = locator.createSessionFactory(server1tc);
    session1 = csf1.createSession(false, true, true);
    ClientProducer prod0 = session0.createProducer(testAddress);
    ClientConsumer cons1 = session1.createConsumer(queueName);
    session1.start();
    // Now we will simulate a failure of the bridge connection between server0 and server1
    Bridge bridge = server0.getClusterManager().getBridges().get(bridgeName);
    assertNotNull(bridge);
    RemotingConnection forwardingConnection = getForwardingConnection(bridge);
    InVMConnector.failOnCreateConnection = true;
    InVMConnector.numberOfFailures = reconnectAttempts - 1;
    forwardingConnection.fail(new ActiveMQNotConnectedException());
    forwardingConnection = getForwardingConnection(bridge);
    forwardingConnection.fail(new ActiveMQNotConnectedException());
    final ManagementService managementService = server0.getManagementService();
    QueueControl coreQueueControl = (QueueControl) managementService.getResource(ResourceNames.QUEUE + queueName);
    assertEquals(0, coreQueueControl.getDeliveringCount());
    final int numMessages = NUM_MESSAGES;
    SimpleString propKey = new SimpleString("propkey");
    for (int i = 0; i < numMessages; i++) {
        ClientMessage message = session0.createMessage(false);
        message.putIntProperty(propKey, i);
        prod0.send(message);
    }
    for (int i = 0; i < numMessages; i++) {
        ClientMessage r1 = cons1.receive(1500);
        assertNotNull(r1);
        assertEquals(i, r1.getObjectProperty(propKey));
    }
    closeServers();
    assertNoMoreConnections();
}
Also used : BridgeConfiguration(org.apache.activemq.artemis.core.config.BridgeConfiguration) ArrayList(java.util.ArrayList) RemotingConnection(org.apache.activemq.artemis.spi.core.protocol.RemotingConnection) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) TransportConfiguration(org.apache.activemq.artemis.api.core.TransportConfiguration) CoreQueueConfiguration(org.apache.activemq.artemis.core.config.CoreQueueConfiguration) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) QueueControl(org.apache.activemq.artemis.api.core.management.QueueControl) ManagementService(org.apache.activemq.artemis.core.server.management.ManagementService) ActiveMQNotConnectedException(org.apache.activemq.artemis.api.core.ActiveMQNotConnectedException) ClientSessionFactory(org.apache.activemq.artemis.api.core.client.ClientSessionFactory) ClientConsumer(org.apache.activemq.artemis.api.core.client.ClientConsumer) ClientProducer(org.apache.activemq.artemis.api.core.client.ClientProducer) Bridge(org.apache.activemq.artemis.core.server.cluster.Bridge) Test(org.junit.Test)

Example 9 with Bridge

use of org.apache.activemq.artemis.core.server.cluster.Bridge in project activemq-artemis by apache.

the class BridgeReconnectTest method testFailoverThenFailAgainAndReconnect.

@Test
public void testFailoverThenFailAgainAndReconnect() throws Exception {
    server0 = createActiveMQServer(0, isNetty(), server0Params);
    TransportConfiguration server0tc = new TransportConfiguration(getConnector(), server0Params, "server0tc");
    server0.getConfiguration().setConnectorConfigurations(connectors);
    BridgeConfiguration bridgeConfiguration = createBridgeConfig();
    List<BridgeConfiguration> bridgeConfigs = new ArrayList<>();
    bridgeConfigs.add(bridgeConfiguration);
    server0.getConfiguration().setBridgeConfigurations(bridgeConfigs);
    CoreQueueConfiguration queueConfig0 = new CoreQueueConfiguration().setAddress(testAddress).setName(queueName);
    List<CoreQueueConfiguration> queueConfigs0 = new ArrayList<>();
    queueConfigs0.add(queueConfig0);
    server0.getConfiguration().setQueueConfigurations(queueConfigs0);
    CoreQueueConfiguration queueConfig1 = new CoreQueueConfiguration().setAddress(forwardAddress).setName(queueName);
    List<CoreQueueConfiguration> queueConfigs1 = new ArrayList<>();
    queueConfigs1.add(queueConfig1);
    server1.getConfiguration().setQueueConfigurations(queueConfigs1);
    startServers();
    locator = addServerLocator(ActiveMQClient.createServerLocatorWithHA(server0tc, server1tc));
    ClientSessionFactory csf0 = locator.createSessionFactory(server0tc);
    session0 = csf0.createSession(false, true, true);
    ClientSessionFactory csf1 = locator.createSessionFactory(server1tc);
    session1 = csf1.createSession(false, true, true);
    ClientProducer prod0 = session0.createProducer(testAddress);
    ClientConsumer cons1 = session1.createConsumer(queueName);
    session1.start();
    Bridge bridge = server0.getClusterManager().getBridges().get(bridgeName);
    RemotingConnection forwardingConnection = getForwardingConnection(bridge);
    InVMConnector.failOnCreateConnection = true;
    InVMConnector.numberOfFailures = reconnectAttempts - 1;
    forwardingConnection.fail(new ActiveMQNotConnectedException());
    final int numMessages = NUM_MESSAGES;
    SimpleString propKey = new SimpleString("propkey");
    for (int i = 0; i < numMessages; i++) {
        ClientMessage message = session0.createMessage(false);
        message.putIntProperty(propKey, i);
        prod0.send(message);
    }
    int outOfOrder = -1;
    int supposed = -1;
    for (int i = 0; i < numMessages; i++) {
        ClientMessage r1 = cons1.receive(1500);
        assertNotNull(r1);
        if (outOfOrder == -1 && i != r1.getIntProperty(propKey).intValue()) {
            outOfOrder = r1.getIntProperty(propKey).intValue();
            supposed = i;
        }
    }
    if (outOfOrder != -1) {
        fail("Message " + outOfOrder + " was received out of order, it was supposed to be " + supposed);
    }
    log.info("=========== second failure, sending message");
    // Fail again - should reconnect
    forwardingConnection = ((BridgeImpl) bridge).getForwardingConnection();
    InVMConnector.failOnCreateConnection = true;
    InVMConnector.numberOfFailures = reconnectAttempts - 1;
    forwardingConnection.fail(new ActiveMQException(ActiveMQExceptionType.UNBLOCKED));
    for (int i = 0; i < numMessages; i++) {
        ClientMessage message = session0.createMessage(false);
        message.putIntProperty(propKey, i);
        prod0.send(message);
    }
    for (int i = 0; i < numMessages; i++) {
        ClientMessage r1 = cons1.receive(1500);
        assertNotNull("Didn't receive message", r1);
        if (outOfOrder == -1 && i != r1.getIntProperty(propKey).intValue()) {
            outOfOrder = r1.getIntProperty(propKey).intValue();
            supposed = i;
        }
    }
    if (outOfOrder != -1) {
        fail("Message " + outOfOrder + " was received out of order, it was supposed to be " + supposed);
    }
    closeServers();
    assertNoMoreConnections();
}
Also used : BridgeConfiguration(org.apache.activemq.artemis.core.config.BridgeConfiguration) ArrayList(java.util.ArrayList) RemotingConnection(org.apache.activemq.artemis.spi.core.protocol.RemotingConnection) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) TransportConfiguration(org.apache.activemq.artemis.api.core.TransportConfiguration) CoreQueueConfiguration(org.apache.activemq.artemis.core.config.CoreQueueConfiguration) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) ActiveMQException(org.apache.activemq.artemis.api.core.ActiveMQException) ActiveMQNotConnectedException(org.apache.activemq.artemis.api.core.ActiveMQNotConnectedException) ClientSessionFactory(org.apache.activemq.artemis.api.core.client.ClientSessionFactory) ClientConsumer(org.apache.activemq.artemis.api.core.client.ClientConsumer) ClientProducer(org.apache.activemq.artemis.api.core.client.ClientProducer) Bridge(org.apache.activemq.artemis.core.server.cluster.Bridge) Test(org.junit.Test)

Aggregations

ArrayList (java.util.ArrayList)9 SimpleString (org.apache.activemq.artemis.api.core.SimpleString)9 TransportConfiguration (org.apache.activemq.artemis.api.core.TransportConfiguration)9 BridgeConfiguration (org.apache.activemq.artemis.core.config.BridgeConfiguration)9 CoreQueueConfiguration (org.apache.activemq.artemis.core.config.CoreQueueConfiguration)9 Bridge (org.apache.activemq.artemis.core.server.cluster.Bridge)9 Test (org.junit.Test)9 ClientMessage (org.apache.activemq.artemis.api.core.client.ClientMessage)8 ClientSessionFactory (org.apache.activemq.artemis.api.core.client.ClientSessionFactory)8 ClientProducer (org.apache.activemq.artemis.api.core.client.ClientProducer)7 ClientConsumer (org.apache.activemq.artemis.api.core.client.ClientConsumer)6 ActiveMQServer (org.apache.activemq.artemis.core.server.ActiveMQServer)5 HashMap (java.util.HashMap)4 ClientSession (org.apache.activemq.artemis.api.core.client.ClientSession)4 ServerLocator (org.apache.activemq.artemis.api.core.client.ServerLocator)4 RemotingConnection (org.apache.activemq.artemis.spi.core.protocol.RemotingConnection)3 ActiveMQException (org.apache.activemq.artemis.api.core.ActiveMQException)2 ActiveMQNotConnectedException (org.apache.activemq.artemis.api.core.ActiveMQNotConnectedException)2 BroadcastGroupConfiguration (org.apache.activemq.artemis.api.core.BroadcastGroupConfiguration)1 DiscoveryGroupConfiguration (org.apache.activemq.artemis.api.core.DiscoveryGroupConfiguration)1