Search in sources :

Example 1 with BrokerPluginSupport

use of org.apache.activemq.broker.BrokerPluginSupport in project activemq-artemis by apache.

the class TwoBrokerQueueClientsReconnectTest method testDuplicateSendWithNoAuditEnqueueCountStat.

public void testDuplicateSendWithNoAuditEnqueueCountStat() throws Exception {
    broker1 = "BrokerA";
    broker2 = "BrokerB";
    NetworkConnector networkConnector = bridgeBrokers(broker1, broker2);
    final AtomicBoolean first = new AtomicBoolean();
    final CountDownLatch gotMessageLatch = new CountDownLatch(1);
    BrokerService brokerService = brokers.get(broker2).broker;
    brokerService.setPersistent(true);
    brokerService.setDeleteAllMessagesOnStartup(true);
    // disable concurrent dispatch otherwise store duplicate suppression will be skipped b/c cursor audit is already
    // disabled so verification of stats will fail - ie: duplicate will be dispatched
    ((KahaDBPersistenceAdapter) brokerService.getPersistenceAdapter()).setConcurrentStoreAndDispatchQueues(false);
    brokerService.setPlugins(new BrokerPlugin[] { new BrokerPluginSupport() {

        @Override
        public void send(final ProducerBrokerExchange producerExchange, org.apache.activemq.command.Message messageSend) throws Exception {
            super.send(producerExchange, messageSend);
            if (first.compareAndSet(false, true)) {
                producerExchange.getConnectionContext().setDontSendReponse(true);
                new Thread() {

                    @Override
                    public void run() {
                        try {
                            LOG.info("Waiting for recepit");
                            assertTrue("message received on time", gotMessageLatch.await(60, TimeUnit.SECONDS));
                            LOG.info("Stopping connection post send and receive and multiple producers");
                            producerExchange.getConnectionContext().getConnection().stop();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }.start();
            }
        }
    } });
    // Create queue
    ActiveMQDestination dest = createDestination("TEST.FOO", false);
    // statically include our destination
    networkConnector.addStaticallyIncludedDestination(dest);
    // Run brokers
    startAllBrokers();
    waitForBridgeFormation();
    sendMessages("BrokerA", dest, 1);
    // wait for broker2 to get the initial forward
    Wait.waitFor(new Wait.Condition() {

        @Override
        public boolean isSatisified() throws Exception {
            return brokers.get(broker2).broker.getAdminView().getTotalMessageCount() == 1;
        }
    });
    // message still pending on broker1
    assertEquals("messages message still there", 1, brokers.get(broker1).broker.getAdminView().getTotalMessageCount());
    // allow the bridge to be shutdown and restarted
    gotMessageLatch.countDown();
    // verify message is forwarded after restart
    assertTrue("no messages enqueued on origin", Wait.waitFor(new Wait.Condition() {

        @Override
        public boolean isSatisified() throws Exception {
            return 0 == brokers.get(broker1).broker.getAdminView().getTotalMessageCount();
        }
    }));
    assertEquals("one messages pending", 1, brokers.get(broker2).broker.getAdminView().getTotalMessageCount());
    assertEquals("one messages enqueued", 1, brokers.get(broker2).broker.getDestination(dest).getDestinationStatistics().getEnqueues().getCount());
}
Also used : ProducerBrokerExchange(org.apache.activemq.broker.ProducerBrokerExchange) BrokerPluginSupport(org.apache.activemq.broker.BrokerPluginSupport) CountDownLatch(java.util.concurrent.CountDownLatch) ActiveMQDestination(org.apache.activemq.command.ActiveMQDestination) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) NetworkConnector(org.apache.activemq.network.NetworkConnector) Wait(org.apache.activemq.util.Wait) BrokerService(org.apache.activemq.broker.BrokerService) KahaDBPersistenceAdapter(org.apache.activemq.store.kahadb.KahaDBPersistenceAdapter)

Example 2 with BrokerPluginSupport

use of org.apache.activemq.broker.BrokerPluginSupport in project activemq-artemis by apache.

the class TwoBrokerQueueClientsReconnectTest method testDuplicateSend.

public void testDuplicateSend() throws Exception {
    broker1 = "BrokerA";
    broker2 = "BrokerB";
    // enable producer audit for the network connector, off by default b/c of interference with composite
    // dests and virtual topics
    brokers.get(broker2).broker.getTransportConnectors().get(0).setAuditNetworkProducers(true);
    bridgeBrokers(broker1, broker2);
    final AtomicBoolean first = new AtomicBoolean();
    final CountDownLatch gotMessageLatch = new CountDownLatch(1);
    BrokerService brokerService = brokers.get(broker2).broker;
    brokerService.setPersistent(true);
    brokerService.setDeleteAllMessagesOnStartup(true);
    brokerService.setPlugins(new BrokerPlugin[] { new BrokerPluginSupport() {

        @Override
        public void send(final ProducerBrokerExchange producerExchange, org.apache.activemq.command.Message messageSend) throws Exception {
            super.send(producerExchange, messageSend);
            if (first.compareAndSet(false, true)) {
                producerExchange.getConnectionContext().setDontSendReponse(true);
                new Thread() {

                    @Override
                    public void run() {
                        try {
                            LOG.info("Waiting for recepit");
                            assertTrue("message received on time", gotMessageLatch.await(60, TimeUnit.SECONDS));
                            LOG.info("Stopping connection post send and receive and multiple producers");
                            producerExchange.getConnectionContext().getConnection().stop();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }.start();
            }
        }
    } });
    // Run brokers
    startAllBrokers();
    waitForBridgeFormation();
    // Create queue
    Destination dest = createDestination("TEST.FOO", false);
    MessageConsumer client2 = createConsumer(broker2, dest);
    sendMessages("BrokerA", dest, 1);
    assertEquals("Client got message", 1, receiveExactMessages(client2, 1));
    client2.close();
    gotMessageLatch.countDown();
    // message still pending on broker1
    assertEquals("messages message still there", 1, brokers.get(broker1).broker.getAdminView().getTotalMessageCount());
    client2 = createConsumer(broker2, dest);
    LOG.info("Let the second client receive the rest of the messages");
    assertEquals("no duplicate message", 0, receiveAllMessages(client2));
    assertEquals("no duplicate message", 0, receiveAllMessages(client2));
    assertEquals("no messages enqueued", 0, brokers.get(broker2).broker.getAdminView().getTotalMessageCount());
    assertTrue("no messages enqueued on origin", Wait.waitFor(new Wait.Condition() {

        @Override
        public boolean isSatisified() throws Exception {
            return 0 == brokers.get(broker1).broker.getAdminView().getTotalMessageCount();
        }
    }));
}
Also used : ActiveMQDestination(org.apache.activemq.command.ActiveMQDestination) Destination(javax.jms.Destination) ProducerBrokerExchange(org.apache.activemq.broker.ProducerBrokerExchange) MessageConsumer(javax.jms.MessageConsumer) BrokerPluginSupport(org.apache.activemq.broker.BrokerPluginSupport) CountDownLatch(java.util.concurrent.CountDownLatch) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) BrokerService(org.apache.activemq.broker.BrokerService)

Example 3 with BrokerPluginSupport

use of org.apache.activemq.broker.BrokerPluginSupport in project activemq-artemis by apache.

the class BrokerQueueNetworkWithDisconnectTest method testNoStuckConnectionsWithTransportDisconnect.

public void testNoStuckConnectionsWithTransportDisconnect() throws Exception {
    inactiveDuration = 60000L;
    useDuplexNetworkBridge = true;
    bridgeBrokers(SPOKE, HUB);
    final BrokerItem hub = brokers.get(HUB);
    hub.broker.setPlugins(new BrokerPlugin[] { new BrokerPluginSupport() {

        int sleepCount = 2;

        @Override
        public void removeConnection(ConnectionContext context, ConnectionInfo info, Throwable error) throws Exception {
            try {
                while (--sleepCount >= 0) {
                    LOG.info("sleeping for a bit in close impl to simulate load where reconnect fails due to a pending close");
                    TimeUnit.SECONDS.sleep(2);
                }
            } catch (Exception ignored) {
            }
            super.removeConnection(context, info, error);
        }
    } });
    startAllBrokers();
    waitForBridgeFormation();
    // remote side will need to spot duplicate network and stop/kill the original
    for (int i = 0; i < 3; i++) {
        socketProxy.halfClose();
        sleep(10000);
    }
    // wait for full reformation of bridge
    // verify no extra connections
    boolean allGood = Wait.waitFor(new Wait.Condition() {

        @Override
        public boolean isSatisified() throws Exception {
            long numConnections = hub.broker.getTransportConnectors().get(0).getConnections().size();
            LOG.info("Num connetions:" + numConnections);
            return numConnections == 1;
        }
    });
    if (!allGood) {
        dumpAllThreads("ExtraHubConnection");
    }
    assertTrue("should be only one transport connection for the single duplex network connector", allGood);
    allGood = Wait.waitFor(new Wait.Condition() {

        @Override
        public boolean isSatisified() throws Exception {
            long numVmConnections = VMTransportFactory.SERVERS.get(HUB).getConnectionCount();
            LOG.info("Num VM connetions:" + numVmConnections);
            return numVmConnections == 2;
        }
    });
    if (!allGood) {
        dumpAllThreads("ExtraHubVMConnection");
    }
    assertTrue("should be only 2 vm connections for the single network duplex network connector", allGood);
}
Also used : BrokerPluginSupport(org.apache.activemq.broker.BrokerPluginSupport) ConnectionContext(org.apache.activemq.broker.ConnectionContext) ConnectionInfo(org.apache.activemq.command.ConnectionInfo) Wait(org.apache.activemq.util.Wait)

Aggregations

BrokerPluginSupport (org.apache.activemq.broker.BrokerPluginSupport)3 CountDownLatch (java.util.concurrent.CountDownLatch)2 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)2 BrokerService (org.apache.activemq.broker.BrokerService)2 ProducerBrokerExchange (org.apache.activemq.broker.ProducerBrokerExchange)2 ActiveMQDestination (org.apache.activemq.command.ActiveMQDestination)2 Wait (org.apache.activemq.util.Wait)2 Destination (javax.jms.Destination)1 MessageConsumer (javax.jms.MessageConsumer)1 ConnectionContext (org.apache.activemq.broker.ConnectionContext)1 ConnectionInfo (org.apache.activemq.command.ConnectionInfo)1 NetworkConnector (org.apache.activemq.network.NetworkConnector)1 KahaDBPersistenceAdapter (org.apache.activemq.store.kahadb.KahaDBPersistenceAdapter)1