Search in sources :

Example 21 with ActiveMQActivationSpec

use of org.apache.activemq.artemis.ra.inflow.ActiveMQActivationSpec 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 22 with ActiveMQActivationSpec

use of org.apache.activemq.artemis.ra.inflow.ActiveMQActivationSpec in project activemq-artemis by apache.

the class ResourceAdapterTest method testForConnectionLeakDuringActivationWhenSessionCreationFails.

@Test
public void testForConnectionLeakDuringActivationWhenSessionCreationFails() throws Exception {
    ActiveMQServer server = createServer(false);
    ActiveMQResourceAdapter ra = null;
    ActiveMQActivation activation = null;
    try {
        server.getConfiguration().setSecurityEnabled(true);
        server.start();
        ra = new ActiveMQResourceAdapter();
        ra.setConnectorClassName(INVM_CONNECTOR_FACTORY);
        ra.setUserName("badUser");
        ra.setPassword("badPassword");
        ra.start(new BootstrapContext());
        ActiveMQActivationSpec spec = new ActiveMQActivationSpec();
        spec.setResourceAdapter(ra);
        spec.setUseJNDI(false);
        spec.setUser("user");
        spec.setPassword("password");
        spec.setDestinationType("javax.jms.Topic");
        spec.setDestination("test");
        spec.setMinSession(1);
        spec.setMaxSession(1);
        spec.setSetupAttempts(1);
        activation = new ActiveMQActivation(ra, new MessageEndpointFactory(), spec);
        try {
            activation.start();
        } catch (Exception e) {
        // ignore
        }
        assertEquals(0, server.getRemotingService().getConnections().size());
    } finally {
        if (activation != null)
            activation.stop();
        if (ra != null)
            ra.stop();
        server.stop();
    }
}
Also used : ActiveMQServer(org.apache.activemq.artemis.core.server.ActiveMQServer) ActiveMQActivation(org.apache.activemq.artemis.ra.inflow.ActiveMQActivation) ActiveMQResourceAdapter(org.apache.activemq.artemis.ra.ActiveMQResourceAdapter) ActiveMQActivationSpec(org.apache.activemq.artemis.ra.inflow.ActiveMQActivationSpec) Test(org.junit.Test)

Example 23 with ActiveMQActivationSpec

use of org.apache.activemq.artemis.ra.inflow.ActiveMQActivationSpec in project activemq-artemis by apache.

the class ResourceAdapterTest method testStartActivation.

@Test
public void testStartActivation() throws Exception {
    ActiveMQServer server = createServer(false);
    try {
        server.start();
        ServerLocator locator = createInVMNonHALocator();
        ClientSessionFactory factory = createSessionFactory(locator);
        ClientSession session = factory.createSession(false, false, false);
        ActiveMQDestination queue = (ActiveMQDestination) ActiveMQJMSClient.createQueue("test");
        session.createQueue(queue.getSimpleAddress(), queue.getSimpleAddress(), true);
        session.close();
        ActiveMQResourceAdapter ra = new ActiveMQResourceAdapter();
        ra.setConnectorClassName(INVM_CONNECTOR_FACTORY);
        ra.setUserName("userGlobal");
        ra.setPassword("passwordGlobal");
        ra.start(new BootstrapContext());
        Connection conn = ra.getDefaultActiveMQConnectionFactory().createConnection();
        conn.close();
        ActiveMQActivationSpec spec = new ActiveMQActivationSpec();
        spec.setResourceAdapter(ra);
        spec.setUseJNDI(false);
        spec.setUser("user");
        spec.setPassword("password");
        spec.setDestinationType("javax.jms.Topic");
        spec.setDestination("test");
        spec.setMinSession(1);
        spec.setMaxSession(1);
        ActiveMQActivation activation = new ActiveMQActivation(ra, new MessageEndpointFactory(), spec);
        activation.start();
        activation.stop();
        ra.stop();
        locator.close();
    } finally {
        server.stop();
    }
}
Also used : ActiveMQServer(org.apache.activemq.artemis.core.server.ActiveMQServer) ActiveMQActivation(org.apache.activemq.artemis.ra.inflow.ActiveMQActivation) ClientSession(org.apache.activemq.artemis.api.core.client.ClientSession) Connection(javax.jms.Connection) ActiveMQResourceAdapter(org.apache.activemq.artemis.ra.ActiveMQResourceAdapter) ClientSessionFactory(org.apache.activemq.artemis.api.core.client.ClientSessionFactory) ActiveMQActivationSpec(org.apache.activemq.artemis.ra.inflow.ActiveMQActivationSpec) ServerLocator(org.apache.activemq.artemis.api.core.client.ServerLocator) ActiveMQDestination(org.apache.activemq.artemis.jms.client.ActiveMQDestination) Test(org.junit.Test)

Example 24 with ActiveMQActivationSpec

use of org.apache.activemq.artemis.ra.inflow.ActiveMQActivationSpec in project activemq-artemis by apache.

the class ResourceAdapterTest method testValidateProperties.

@Test
public void testValidateProperties() throws Exception {
    validateGettersAndSetters(new ActiveMQResourceAdapter(), "backupTransportConfiguration", "connectionParameters", "jndiParams");
    validateGettersAndSetters(new ActiveMQRAManagedConnectionFactory(), "connectionParameters", "sessionDefaultType", "backupConnectionParameters", "jndiParams");
    validateGettersAndSetters(new ActiveMQActivationSpec(), "connectionParameters", "acknowledgeMode", "subscriptionDurability", "jndiParams");
    ActiveMQActivationSpec spec = new ActiveMQActivationSpec();
    spec.setAcknowledgeMode("DUPS_OK_ACKNOWLEDGE");
    Assert.assertEquals("Dups-ok-acknowledge", spec.getAcknowledgeMode());
    spec.setSubscriptionDurability("Durable");
    Assert.assertEquals("Durable", spec.getSubscriptionDurability());
    spec.setSubscriptionDurability("NonDurable");
    Assert.assertEquals("NonDurable", spec.getSubscriptionDurability());
    spec = new ActiveMQActivationSpec();
    ActiveMQResourceAdapter adapter = new ActiveMQResourceAdapter();
    adapter.setUserName("us1");
    adapter.setPassword("ps1");
    adapter.setClientID("cl1");
    spec.setResourceAdapter(adapter);
    Assert.assertEquals("us1", spec.getUser());
    Assert.assertEquals("ps1", spec.getPassword());
    spec.setUser("us2");
    spec.setPassword("ps2");
    spec.setClientID("cl2");
    Assert.assertEquals("us2", spec.getUser());
    Assert.assertEquals("ps2", spec.getPassword());
    Assert.assertEquals("cl2", spec.getClientID());
}
Also used : ActiveMQRAManagedConnectionFactory(org.apache.activemq.artemis.ra.ActiveMQRAManagedConnectionFactory) ActiveMQResourceAdapter(org.apache.activemq.artemis.ra.ActiveMQResourceAdapter) ActiveMQActivationSpec(org.apache.activemq.artemis.ra.inflow.ActiveMQActivationSpec) Test(org.junit.Test)

Example 25 with ActiveMQActivationSpec

use of org.apache.activemq.artemis.ra.inflow.ActiveMQActivationSpec in project activemq-artemis by apache.

the class ResourceAdapterTest method testResourceAdapterSetupOverrideNoCFParams.

@Test
public void testResourceAdapterSetupOverrideNoCFParams() throws Exception {
    ActiveMQResourceAdapter qResourceAdapter = new ActiveMQResourceAdapter();
    qResourceAdapter.setConnectorClassName(INVM_CONNECTOR_FACTORY);
    qResourceAdapter.setConnectionParameters("server-id=0");
    ActiveMQRATestBase.MyBootstrapContext ctx = new ActiveMQRATestBase.MyBootstrapContext();
    qResourceAdapter.start(ctx);
    ActiveMQActivationSpec spec = new ActiveMQActivationSpec();
    spec.setResourceAdapter(qResourceAdapter);
    spec.setUseJNDI(false);
    spec.setDestinationType("javax.jms.Queue");
    spec.setDestination(MDBQUEUE);
    CountDownLatch latch = new CountDownLatch(1);
    DummyMessageEndpoint endpoint = new DummyMessageEndpoint(latch);
    DummyMessageEndpointFactory endpointFactory = new DummyMessageEndpointFactory(endpoint, false);
    qResourceAdapter.endpointActivation(endpointFactory, spec);
    qResourceAdapter.stop();
    assertFalse(spec.isHasBeenUpdated());
    assertTrue(endpoint.released);
}
Also used : ActiveMQResourceAdapter(org.apache.activemq.artemis.ra.ActiveMQResourceAdapter) ActiveMQActivationSpec(org.apache.activemq.artemis.ra.inflow.ActiveMQActivationSpec) CountDownLatch(java.util.concurrent.CountDownLatch) Test(org.junit.Test)

Aggregations

ActiveMQResourceAdapter (org.apache.activemq.artemis.ra.ActiveMQResourceAdapter)54 ActiveMQActivationSpec (org.apache.activemq.artemis.ra.inflow.ActiveMQActivationSpec)54 Test (org.junit.Test)52 CountDownLatch (java.util.concurrent.CountDownLatch)39 ClientSession (org.apache.activemq.artemis.api.core.client.ClientSession)27 ClientMessage (org.apache.activemq.artemis.api.core.client.ClientMessage)24 ClientProducer (org.apache.activemq.artemis.api.core.client.ClientProducer)24 ActiveMQConnectionFactory (org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory)9 Binding (org.apache.activemq.artemis.core.postoffice.Binding)7 ActiveMQActivation (org.apache.activemq.artemis.ra.inflow.ActiveMQActivation)6 ClientSessionFactory (org.apache.activemq.artemis.api.core.client.ClientSessionFactory)5 ActiveMQException (org.apache.activemq.artemis.api.core.ActiveMQException)4 Connection (javax.jms.Connection)3 JMSException (javax.jms.JMSException)3 ResourceException (javax.resource.ResourceException)3 SimpleString (org.apache.activemq.artemis.api.core.SimpleString)3 ClientConsumer (org.apache.activemq.artemis.api.core.client.ClientConsumer)3 ServerLocator (org.apache.activemq.artemis.api.core.client.ServerLocator)3 LocalQueueBinding (org.apache.activemq.artemis.core.postoffice.impl.LocalQueueBinding)3 DefaultSensitiveStringCodec (org.apache.activemq.artemis.utils.DefaultSensitiveStringCodec)3