Search in sources :

Example 11 with ServerConsumer

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

the class ServerSessionImpl method findConsumer.

private ServerConsumer findConsumer(long consumerID) throws Exception {
    ServerConsumer consumer = locateConsumer(consumerID);
    if (consumer == null) {
        Transaction currentTX = tx;
        ActiveMQIllegalStateException exception = ActiveMQMessageBundle.BUNDLE.consumerDoesntExist(consumerID);
        if (currentTX != null) {
            currentTX.markAsRollbackOnly(exception);
        }
        throw exception;
    }
    return consumer;
}
Also used : Transaction(org.apache.activemq.artemis.core.transaction.Transaction) ActiveMQIllegalStateException(org.apache.activemq.artemis.api.core.ActiveMQIllegalStateException) ServerConsumer(org.apache.activemq.artemis.core.server.ServerConsumer)

Example 12 with ServerConsumer

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

the class MDBMultipleHandlersServerDisconnectTest method testReconnectMDBNoMessageLoss.

@Test
public void testReconnectMDBNoMessageLoss() throws Exception {
    AddressSettings settings = new AddressSettings();
    settings.setRedeliveryDelay(100);
    settings.setMaxDeliveryAttempts(-1);
    server.getAddressSettingsRepository().clear();
    server.getAddressSettingsRepository().addMatch("#", settings);
    ActiveMQResourceAdapter qResourceAdapter = newResourceAdapter();
    resourceAdapter = qResourceAdapter;
    resourceAdapter.setConfirmationWindowSize(-1);
    resourceAdapter.setCallTimeout(1000L);
    resourceAdapter.setConsumerWindowSize(1024 * 1024);
    resourceAdapter.setReconnectAttempts(-1);
    resourceAdapter.setRetryInterval(100L);
    // qResourceAdapter.setTransactionManagerLocatorClass(DummyTMLocator.class.getName());
    // qResourceAdapter.setTransactionManagerLocatorMethod("getTM");
    MyBootstrapContext ctx = new MyBootstrapContext();
    qResourceAdapter.setConnectorClassName(NETTY_CONNECTOR_FACTORY);
    qResourceAdapter.start(ctx);
    final int NUMBER_OF_SESSIONS = 10;
    ActiveMQActivationSpec spec = new ActiveMQActivationSpec();
    spec.setTransactionTimeout(1);
    spec.setMaxSession(NUMBER_OF_SESSIONS);
    spec.setSetupAttempts(-1);
    spec.setSetupInterval(100L);
    spec.setResourceAdapter(qResourceAdapter);
    spec.setUseJNDI(false);
    spec.setDestinationType("javax.jms.Queue");
    spec.setDestination(MDBQUEUE);
    // Some the routines would be screwed up if using the default one
    Assert.assertFalse(spec.isHasBeenUpdated());
    TestEndpointFactory endpointFactory = new TestEndpointFactory(true);
    qResourceAdapter.endpointActivation(endpointFactory, spec);
    Assert.assertEquals(1, resourceAdapter.getActivations().values().size());
    ActiveMQActivation activation = resourceAdapter.getActivations().values().toArray(new ActiveMQActivation[1])[0];
    final int NUMBER_OF_MESSAGES = 1000;
    Thread producer = new Thread() {

        @Override
        public void run() {
            try {
                ServerLocator locator = createInVMLocator(0);
                ClientSessionFactory factory = locator.createSessionFactory();
                ClientSession session = factory.createSession(false, false);
                ClientProducer clientProducer = session.createProducer(MDBQUEUEPREFIXED);
                StringBuffer buffer = new StringBuffer();
                for (int b = 0; b < 500; b++) {
                    buffer.append("ab");
                }
                for (int i = 0; i < NUMBER_OF_MESSAGES; i++) {
                    ClientMessage message = session.createMessage(true);
                    message.getBodyBuffer().writeString(buffer.toString() + i);
                    message.putIntProperty("i", i);
                    clientProducer.send(message);
                    if (i % 100 == 0) {
                        session.commit();
                    }
                }
                session.commit();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
    producer.start();
    final AtomicBoolean metaDataFailed = new AtomicBoolean(false);
    Thread buggerThread = new Thread() {

        @Override
        public void run() {
            while (running.get()) {
                try {
                    Thread.sleep(RandomUtil.randomInterval(100, 200));
                } catch (InterruptedException intex) {
                    intex.printStackTrace();
                    return;
                }
                List<ServerSession> serverSessions = lookupServerSessions("resource-adapter", NUMBER_OF_SESSIONS);
                System.err.println("Contains " + serverSessions.size() + " RA sessions");
                if (serverSessions.size() != NUMBER_OF_SESSIONS) {
                    System.err.println("the server was supposed to have " + NUMBER_OF_MESSAGES + " RA Sessions but it only contained accordingly to the meta-data");
                    metaDataFailed.set(true);
                } else if (serverSessions.size() == NUMBER_OF_SESSIONS) {
                    // it became the same after some reconnect? which would be acceptable
                    metaDataFailed.set(false);
                }
                if (playServerClosingSession && serverSessions.size() > 0) {
                    int randomBother = RandomUtil.randomInterval(0, serverSessions.size() - 1);
                    System.out.println("bugging session " + randomBother);
                    ServerSession serverSession = serverSessions.get(randomBother);
                    if (playServerClosingConsumer && RandomUtil.randomBoolean()) {
                        // will play this randomly, only half of the times
                        for (ServerConsumer consumer : serverSession.getServerConsumers()) {
                            try {
                                // Simulating a rare race that could happen in production
                                // where the consumer is closed while things are still happening
                                consumer.close(true);
                                Thread.sleep(100);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }
                    RemotingConnection connection = serverSession.getRemotingConnection();
                    connection.fail(new ActiveMQException("failed at random " + randomBother));
                }
            }
        }
    };
    buggerThread.start();
    ServerLocator locator = createInVMLocator(0);
    ClientSessionFactory factory = locator.createSessionFactory();
    ClientSession session = factory.createSession(false, false);
    session.start();
    ClientConsumer consumer = session.createConsumer("outQueue");
    for (int i = 0; i < NUMBER_OF_MESSAGES; i++) {
        ClientMessage message = consumer.receive(60000);
        if (message == null) {
            break;
        }
        if (i == NUMBER_OF_MESSAGES * 0.50) {
            // This is to make sure the MDBs will survive a reboot
            // and no duplications or message loss will happen because of this
            System.err.println("Rebooting the MDBs at least once!");
            activation.startReconnectThread("I");
        }
        if (i == NUMBER_OF_MESSAGES * 0.90) {
            System.out.println("Disabled failures at " + i);
            playTXTimeouts = false;
            playServerClosingSession = false;
            playServerClosingConsumer = false;
        }
        System.out.println("Received " + i + " messages");
        doReceiveMessage(message);
        if (i % 200 == 0) {
            System.out.println("received " + i);
            session.commit();
        }
    }
    session.commit();
    while (true) {
        ClientMessage message = consumer.receiveImmediate();
        if (message == null) {
            break;
        }
        System.out.println("Received extra message " + message);
        doReceiveMessage(message);
    }
    session.commit();
    Assert.assertNull(consumer.receiveImmediate());
    StringWriter writer = new StringWriter();
    PrintWriter out = new PrintWriter(writer);
    boolean failed = false;
    for (int i = 0; i < NUMBER_OF_MESSAGES; i++) {
        AtomicInteger atomicInteger = mapCounter.get(Integer.valueOf(i));
        if (atomicInteger == null) {
            out.println("didn't receive message with i=" + i);
            failed = true;
        } else if (atomicInteger.get() > 1) {
            out.println("message with i=" + i + " received " + atomicInteger.get() + " times");
            failed = true;
        }
    }
    running.set(false);
    buggerThread.join();
    producer.join();
    qResourceAdapter.stop();
    session.close();
    if (failed) {
        for (int i = 0; i < 10; i++) {
            System.out.println("----------------------------------------------------");
        }
        System.out.println(writer.toString());
    }
    Assert.assertFalse(writer.toString(), failed);
    System.out.println("Received " + NUMBER_OF_MESSAGES + " messages");
    Assert.assertFalse("There was meta-data failures, some sessions didn't reconnect properly", metaDataFailed.get());
}
Also used : ActiveMQActivation(org.apache.activemq.artemis.ra.inflow.ActiveMQActivation) RemotingConnection(org.apache.activemq.artemis.spi.core.protocol.RemotingConnection) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) ActiveMQException(org.apache.activemq.artemis.api.core.ActiveMQException) StringWriter(java.io.StringWriter) ClientSession(org.apache.activemq.artemis.api.core.client.ClientSession) ActiveMQResourceAdapter(org.apache.activemq.artemis.ra.ActiveMQResourceAdapter) ClientSessionFactory(org.apache.activemq.artemis.api.core.client.ClientSessionFactory) ActiveMQActivationSpec(org.apache.activemq.artemis.ra.inflow.ActiveMQActivationSpec) ClientProducer(org.apache.activemq.artemis.api.core.client.ClientProducer) ServerLocator(org.apache.activemq.artemis.api.core.client.ServerLocator) PrintWriter(java.io.PrintWriter) AddressSettings(org.apache.activemq.artemis.core.settings.impl.AddressSettings) ServerSession(org.apache.activemq.artemis.core.server.ServerSession) ServerConsumer(org.apache.activemq.artemis.core.server.ServerConsumer) MessageEndpoint(javax.resource.spi.endpoint.MessageEndpoint) ResourceException(javax.resource.ResourceException) ActiveMQException(org.apache.activemq.artemis.api.core.ActiveMQException) LocalTransactionException(javax.resource.spi.LocalTransactionException) RollbackException(javax.transaction.RollbackException) UnavailableException(javax.resource.spi.UnavailableException) HeuristicRollbackException(javax.transaction.HeuristicRollbackException) SystemException(javax.transaction.SystemException) HeuristicMixedException(javax.transaction.HeuristicMixedException) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ClientConsumer(org.apache.activemq.artemis.api.core.client.ClientConsumer) Test(org.junit.Test)

Example 13 with ServerConsumer

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

the class ActiveMQServerControlImpl method listAllConsumersAsJSON.

@Override
public String listAllConsumersAsJSON() throws Exception {
    checkStarted();
    clearIO();
    try {
        JsonArrayBuilder array = JsonLoader.createArrayBuilder();
        Set<ServerSession> sessions = server.getSessions();
        for (ServerSession session : sessions) {
            Set<ServerConsumer> consumers = session.getServerConsumers();
            for (ServerConsumer consumer : consumers) {
                JsonObject obj = toJSONObject(consumer);
                if (obj != null) {
                    array.add(obj);
                }
            }
        }
        return array.build().toString();
    } finally {
        blockOnIO();
    }
}
Also used : ServerSession(org.apache.activemq.artemis.core.server.ServerSession) JsonObject(javax.json.JsonObject) JsonArrayBuilder(javax.json.JsonArrayBuilder) ServerConsumer(org.apache.activemq.artemis.core.server.ServerConsumer)

Example 14 with ServerConsumer

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

the class ActiveMQServerControlImpl method closeConsumerConnectionsForAddress.

@Override
public boolean closeConsumerConnectionsForAddress(final String address) {
    boolean closed = false;
    checkStarted();
    clearIO();
    try {
        for (Binding binding : postOffice.getMatchingBindings(SimpleString.toSimpleString(address)).getBindings()) {
            if (binding instanceof LocalQueueBinding) {
                Queue queue = ((LocalQueueBinding) binding).getQueue();
                for (Consumer consumer : queue.getConsumers()) {
                    if (consumer instanceof ServerConsumer) {
                        ServerConsumer serverConsumer = (ServerConsumer) consumer;
                        RemotingConnection connection = null;
                        for (RemotingConnection potentialConnection : remotingService.getConnections()) {
                            if (potentialConnection.getID().toString().equals(serverConsumer.getConnectionID())) {
                                connection = potentialConnection;
                            }
                        }
                        if (connection != null) {
                            remotingService.removeConnection(connection.getID());
                            connection.fail(ActiveMQMessageBundle.BUNDLE.consumerConnectionsClosedByManagement(address));
                            closed = true;
                        }
                    }
                }
            }
        }
    } catch (Exception e) {
        ActiveMQServerLogger.LOGGER.failedToCloseConsumerConnectionsForAddress(address, e);
    } finally {
        blockOnIO();
    }
    return closed;
}
Also used : Binding(org.apache.activemq.artemis.core.postoffice.Binding) LocalQueueBinding(org.apache.activemq.artemis.core.postoffice.impl.LocalQueueBinding) LocalQueueBinding(org.apache.activemq.artemis.core.postoffice.impl.LocalQueueBinding) Consumer(org.apache.activemq.artemis.core.server.Consumer) ServerConsumer(org.apache.activemq.artemis.core.server.ServerConsumer) RemotingConnection(org.apache.activemq.artemis.spi.core.protocol.RemotingConnection) ServerConsumer(org.apache.activemq.artemis.core.server.ServerConsumer) Queue(org.apache.activemq.artemis.core.server.Queue) ActiveMQException(org.apache.activemq.artemis.api.core.ActiveMQException) ListenerNotFoundException(javax.management.ListenerNotFoundException) ActiveMQAddressDoesNotExistException(org.apache.activemq.artemis.api.core.ActiveMQAddressDoesNotExistException)

Example 15 with ServerConsumer

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

the class ActiveMQServerControlImpl method listConsumersAsJSON.

@Override
public String listConsumersAsJSON(String connectionID) throws Exception {
    checkStarted();
    clearIO();
    try {
        JsonArrayBuilder array = JsonLoader.createArrayBuilder();
        Set<RemotingConnection> connections = server.getRemotingService().getConnections();
        for (RemotingConnection connection : connections) {
            if (connectionID.equals(connection.getID().toString())) {
                List<ServerSession> sessions = server.getSessions(connectionID);
                for (ServerSession session : sessions) {
                    Set<ServerConsumer> consumers = session.getServerConsumers();
                    for (ServerConsumer consumer : consumers) {
                        JsonObject obj = toJSONObject(consumer);
                        if (obj != null) {
                            array.add(obj);
                        }
                    }
                }
            }
        }
        return array.build().toString();
    } finally {
        blockOnIO();
    }
}
Also used : ServerSession(org.apache.activemq.artemis.core.server.ServerSession) RemotingConnection(org.apache.activemq.artemis.spi.core.protocol.RemotingConnection) JsonObject(javax.json.JsonObject) JsonArrayBuilder(javax.json.JsonArrayBuilder) ServerConsumer(org.apache.activemq.artemis.core.server.ServerConsumer)

Aggregations

ServerConsumer (org.apache.activemq.artemis.core.server.ServerConsumer)26 ServerSession (org.apache.activemq.artemis.core.server.ServerSession)7 ActiveMQException (org.apache.activemq.artemis.api.core.ActiveMQException)6 SimpleString (org.apache.activemq.artemis.api.core.SimpleString)5 ActiveMQIllegalStateException (org.apache.activemq.artemis.api.core.ActiveMQIllegalStateException)4 Transaction (org.apache.activemq.artemis.core.transaction.Transaction)4 HashSet (java.util.HashSet)3 JsonArrayBuilder (javax.json.JsonArrayBuilder)3 XAException (javax.transaction.xa.XAException)3 ActiveMQIOErrorException (org.apache.activemq.artemis.api.core.ActiveMQIOErrorException)3 ActiveMQNonExistentQueueException (org.apache.activemq.artemis.api.core.ActiveMQNonExistentQueueException)3 ClientSession (org.apache.activemq.artemis.api.core.client.ClientSession)3 ActiveMQXAException (org.apache.activemq.artemis.core.exception.ActiveMQXAException)3 RemotingConnection (org.apache.activemq.artemis.spi.core.protocol.RemotingConnection)3 Test (org.junit.Test)3 JsonObject (javax.json.JsonObject)2 ClientConsumer (org.apache.activemq.artemis.api.core.client.ClientConsumer)2 ClientSessionFactory (org.apache.activemq.artemis.api.core.client.ClientSessionFactory)2 ServerLocator (org.apache.activemq.artemis.api.core.client.ServerLocator)2 Binding (org.apache.activemq.artemis.core.postoffice.Binding)2