Search in sources :

Example 51 with Message

use of org.apache.activemq.artemis.api.core.Message in project activemq-artemis by apache.

the class CoreClientOverOneWaySSLTest method testOneWaySSLWithGoodClientCipherSuite.

@Test
public void testOneWaySSLWithGoodClientCipherSuite() throws Exception {
    createCustomSslServer();
    String text = RandomUtil.randomString();
    tc.getParams().put(TransportConstants.SSL_ENABLED_PROP_NAME, true);
    tc.getParams().put(TransportConstants.TRUSTSTORE_PROVIDER_PROP_NAME, storeType);
    tc.getParams().put(TransportConstants.TRUSTSTORE_PATH_PROP_NAME, CLIENT_SIDE_TRUSTSTORE);
    tc.getParams().put(TransportConstants.TRUSTSTORE_PASSWORD_PROP_NAME, PASSWORD);
    tc.getParams().put(TransportConstants.ENABLED_CIPHER_SUITES_PROP_NAME, getSuitableCipherSuite());
    tc.getParams().put(TransportConstants.ENABLED_PROTOCOLS_PROP_NAME, "TLSv1.2");
    ServerLocator locator = addServerLocator(ActiveMQClient.createServerLocatorWithoutHA(tc));
    ClientSessionFactory sf = null;
    try {
        sf = createSessionFactory(locator);
    } catch (ActiveMQNotConnectedException e) {
        Assert.fail();
    }
    ClientSession session = sf.createSession(false, true, true);
    session.createQueue(CoreClientOverOneWaySSLTest.QUEUE, CoreClientOverOneWaySSLTest.QUEUE, false);
    ClientProducer producer = session.createProducer(CoreClientOverOneWaySSLTest.QUEUE);
    ClientMessage message = createTextMessage(session, text);
    producer.send(message);
    ClientConsumer consumer = session.createConsumer(CoreClientOverOneWaySSLTest.QUEUE);
    session.start();
    Message m = consumer.receive(1000);
    Assert.assertNotNull(m);
    Assert.assertEquals(text, m.getBodyBuffer().readString());
}
Also used : ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) Message(org.apache.activemq.artemis.api.core.Message) ClientSession(org.apache.activemq.artemis.api.core.client.ClientSession) ActiveMQNotConnectedException(org.apache.activemq.artemis.api.core.ActiveMQNotConnectedException) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) ClientSessionFactory(org.apache.activemq.artemis.api.core.client.ClientSessionFactory) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) 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) Test(org.junit.Test)

Example 52 with Message

use of org.apache.activemq.artemis.api.core.Message in project activemq-artemis by apache.

the class CoreClientOverOneWaySSLTest method testOneWaySSLWithGoodServerCipherSuite.

@Test
public void testOneWaySSLWithGoodServerCipherSuite() throws Exception {
    createCustomSslServer(getSuitableCipherSuite(), null);
    String text = RandomUtil.randomString();
    tc.getParams().put(TransportConstants.SSL_ENABLED_PROP_NAME, true);
    tc.getParams().put(TransportConstants.TRUSTSTORE_PROVIDER_PROP_NAME, storeType);
    tc.getParams().put(TransportConstants.TRUSTSTORE_PATH_PROP_NAME, CLIENT_SIDE_TRUSTSTORE);
    tc.getParams().put(TransportConstants.TRUSTSTORE_PASSWORD_PROP_NAME, PASSWORD);
    tc.getParams().put(TransportConstants.ENABLED_PROTOCOLS_PROP_NAME, "TLSv1.2");
    ServerLocator locator = addServerLocator(ActiveMQClient.createServerLocatorWithoutHA(tc));
    ClientSessionFactory sf = null;
    try {
        sf = createSessionFactory(locator);
    } catch (ActiveMQNotConnectedException e) {
        Assert.fail();
    }
    ClientSession session = sf.createSession(false, true, true);
    session.createQueue(CoreClientOverOneWaySSLTest.QUEUE, CoreClientOverOneWaySSLTest.QUEUE, false);
    ClientProducer producer = session.createProducer(CoreClientOverOneWaySSLTest.QUEUE);
    ClientMessage message = createTextMessage(session, text);
    producer.send(message);
    ClientConsumer consumer = session.createConsumer(CoreClientOverOneWaySSLTest.QUEUE);
    session.start();
    Message m = consumer.receive(1000);
    Assert.assertNotNull(m);
    Assert.assertEquals(text, m.getBodyBuffer().readString());
}
Also used : ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) Message(org.apache.activemq.artemis.api.core.Message) ClientSession(org.apache.activemq.artemis.api.core.client.ClientSession) ActiveMQNotConnectedException(org.apache.activemq.artemis.api.core.ActiveMQNotConnectedException) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) ClientSessionFactory(org.apache.activemq.artemis.api.core.client.ClientSessionFactory) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) 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) Test(org.junit.Test)

Example 53 with Message

use of org.apache.activemq.artemis.api.core.Message in project activemq-artemis by apache.

the class DualAuthenticationTest method testDualAuthentication.

@Test
public void testDualAuthentication() throws Exception {
    String text = RandomUtil.randomString();
    tc.getParams().put(TransportConstants.SSL_ENABLED_PROP_NAME, true);
    tc.getParams().put(TransportConstants.TRUSTSTORE_PATH_PROP_NAME, CLIENT_SIDE_TRUSTSTORE);
    tc.getParams().put(TransportConstants.TRUSTSTORE_PASSWORD_PROP_NAME, PASSWORD);
    tc.getParams().put(TransportConstants.KEYSTORE_PATH_PROP_NAME, CLIENT_SIDE_KEYSTORE);
    tc.getParams().put(TransportConstants.KEYSTORE_PASSWORD_PROP_NAME, PASSWORD);
    tc.getParams().put(TransportConstants.PORT_PROP_NAME, "61617");
    ServerLocator producerLocator = addServerLocator(ActiveMQClient.createServerLocatorWithoutHA(tc));
    ClientSessionFactory producerSessionFactory = createSessionFactory(producerLocator);
    ClientSession producerSession = producerSessionFactory.createSession(false, true, true);
    producerSession.createQueue(DualAuthenticationTest.QUEUE, DualAuthenticationTest.QUEUE, false);
    ClientProducer producer = producerSession.createProducer(DualAuthenticationTest.QUEUE);
    ClientMessage message = createTextMessage(producerSession, text);
    producer.send(message);
    ServerLocator consumerLocator = addServerLocator(ActiveMQClient.createServerLocator("tcp://localhost:61616"));
    ClientSessionFactory consumerSessionFactory = createSessionFactory(consumerLocator);
    ClientSession consumerSession = consumerSessionFactory.createSession("consumer", "consumerPassword", false, true, true, consumerLocator.isPreAcknowledge(), consumerLocator.getAckBatchSize());
    ClientConsumer consumer = consumerSession.createConsumer(DualAuthenticationTest.QUEUE);
    consumerSession.start();
    Message m = consumer.receive(1000);
    Assert.assertNotNull(m);
    Assert.assertEquals(text, m.getBodyBuffer().readString());
}
Also used : ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) Message(org.apache.activemq.artemis.api.core.Message) ClientSession(org.apache.activemq.artemis.api.core.client.ClientSession) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) ClientSessionFactory(org.apache.activemq.artemis.api.core.client.ClientSessionFactory) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) 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) Test(org.junit.Test) SecurityTest(org.apache.activemq.artemis.tests.integration.security.SecurityTest)

Example 54 with Message

use of org.apache.activemq.artemis.api.core.Message in project activemq-artemis by apache.

the class ScaleDown3NodeTest method testScaleDownWithMultipleQueues.

@Test
public void testScaleDownWithMultipleQueues() throws Exception {
    AddressSettings addressSettings = new AddressSettings().setRedistributionDelay(0);
    servers[0].getAddressSettingsRepository().addMatch("#", addressSettings);
    servers[1].getAddressSettingsRepository().addMatch("#", addressSettings);
    servers[2].getAddressSettingsRepository().addMatch("#", addressSettings);
    final int TEST_SIZE = 10;
    final String addressName = "testAddress";
    final String queueName1 = "testQueue1";
    final String queueName2 = "testQueue2";
    final String queueName3 = "testQueue3";
    // create a queue on each node mapped to the same address
    createQueue(0, addressName, queueName1, null, false, servers[0].getConfiguration().getClusterUser(), servers[0].getConfiguration().getClusterPassword());
    createQueue(1, addressName, queueName1, null, false, servers[1].getConfiguration().getClusterUser(), servers[1].getConfiguration().getClusterPassword());
    createQueue(2, addressName, queueName1, null, false, servers[2].getConfiguration().getClusterUser(), servers[2].getConfiguration().getClusterPassword());
    // create a queue on each node mapped to the same address
    createQueue(0, addressName, queueName2, null, false, servers[0].getConfiguration().getClusterUser(), servers[0].getConfiguration().getClusterPassword());
    createQueue(1, addressName, queueName2, null, false, servers[1].getConfiguration().getClusterUser(), servers[1].getConfiguration().getClusterPassword());
    createQueue(2, addressName, queueName2, null, false, servers[2].getConfiguration().getClusterUser(), servers[2].getConfiguration().getClusterPassword());
    // create a queue on each node mapped to the same address
    createQueue(0, addressName, queueName3, null, false, servers[0].getConfiguration().getClusterUser(), servers[0].getConfiguration().getClusterPassword());
    createQueue(1, addressName, queueName3, null, false, servers[1].getConfiguration().getClusterUser(), servers[1].getConfiguration().getClusterPassword());
    createQueue(2, addressName, queueName3, null, false, servers[2].getConfiguration().getClusterUser(), servers[2].getConfiguration().getClusterPassword());
    // pause the SnF queue so that when the server tries to redistribute a message it won't actually go across the cluster bridge
    String snfAddress = servers[0].getInternalNamingPrefix() + "sf.cluster0." + servers[0].getNodeID().toString();
    Queue snfQueue = ((LocalQueueBinding) servers[2].getPostOffice().getBinding(SimpleString.toSimpleString(snfAddress))).getQueue();
    snfQueue.pause();
    ClientSession session = sfs[2].createSession(servers[2].getConfiguration().getClusterUser(), servers[2].getConfiguration().getClusterPassword(), false, true, false, false, 0);
    Message message;
    message = session.createMessage(false);
    for (int i = 0; i < TEST_SIZE; i++) {
        ClientProducer producer = session.createProducer(addressName);
        producer.send(message);
    }
    // add a consumer to node 0 to trigger redistribution here
    addConsumer(0, 0, queueName1, null, true, servers[0].getConfiguration().getClusterUser(), servers[0].getConfiguration().getClusterPassword());
    addConsumer(1, 0, queueName3, null, true, servers[0].getConfiguration().getClusterUser(), servers[0].getConfiguration().getClusterPassword());
    // allow some time for redistribution to move the message to the SnF queue
    long timeout = 10000;
    long start = System.currentTimeMillis();
    long messageCount = 0;
    while (System.currentTimeMillis() - start < timeout) {
        // ensure the message is not in the queue on node 2
        messageCount = getMessageCount(snfQueue);
        if (messageCount < TEST_SIZE * 2) {
            Thread.sleep(200);
        } else {
            break;
        }
    }
    // ensure the message is in the SnF queue
    Assert.assertEquals(TEST_SIZE * 2, getMessageCount(snfQueue));
    // trigger scaleDown from node 0 to node 1
    IntegrationTestLogger.LOGGER.info("============ Stopping " + servers[0].getNodeID());
    removeConsumer(0);
    removeConsumer(1);
    servers[0].stop();
    start = System.currentTimeMillis();
    while (System.currentTimeMillis() - start < timeout) {
        // ensure the messages are not in the queues on node 2
        messageCount = getMessageCount(((LocalQueueBinding) servers[2].getPostOffice().getBinding(new SimpleString(queueName1))).getQueue());
        messageCount += getMessageCount(((LocalQueueBinding) servers[2].getPostOffice().getBinding(new SimpleString(queueName3))).getQueue());
        if (messageCount > 0) {
            Thread.sleep(200);
        } else {
            break;
        }
    }
    Assert.assertEquals(0, messageCount);
    Assert.assertEquals(TEST_SIZE, getMessageCount(((LocalQueueBinding) servers[2].getPostOffice().getBinding(new SimpleString(queueName2))).getQueue()));
    // get the messages from queue 1 on node 1
    addConsumer(0, 1, queueName1, null, true, servers[1].getConfiguration().getClusterUser(), servers[1].getConfiguration().getClusterPassword());
    addConsumer(1, 1, queueName3, null, true, servers[1].getConfiguration().getClusterUser(), servers[1].getConfiguration().getClusterPassword());
    // allow some time for redistribution to move the message to node 1
    start = System.currentTimeMillis();
    while (System.currentTimeMillis() - start < timeout) {
        // ensure the message is not in the queue on node 2
        messageCount = getMessageCount(((LocalQueueBinding) servers[1].getPostOffice().getBinding(new SimpleString(queueName1))).getQueue());
        messageCount += getMessageCount(((LocalQueueBinding) servers[1].getPostOffice().getBinding(new SimpleString(queueName3))).getQueue());
        if (messageCount < TEST_SIZE * 2) {
            Thread.sleep(200);
        } else {
            break;
        }
    }
    // ensure the message is in queue 1 on node 1 as expected
    Assert.assertEquals(TEST_SIZE * 2, messageCount);
    for (int i = 0; i < TEST_SIZE; i++) {
        ClientMessage clientMessage = consumers[0].getConsumer().receive(1000);
        Assert.assertNotNull(clientMessage);
        IntegrationTestLogger.LOGGER.info("Received: " + clientMessage);
        clientMessage.acknowledge();
        clientMessage = consumers[1].getConsumer().receive(1000);
        Assert.assertNotNull(clientMessage);
        IntegrationTestLogger.LOGGER.info("Received: " + clientMessage);
        clientMessage.acknowledge();
    }
    // ensure there are no more messages on queue 1
    ClientMessage clientMessage = consumers[0].getConsumer().receive(250);
    Assert.assertNull(clientMessage);
    removeConsumer(0);
    // ensure there are no more messages on queue 3
    clientMessage = consumers[1].getConsumer().receive(250);
    Assert.assertNull(clientMessage);
    removeConsumer(1);
}
Also used : AddressSettings(org.apache.activemq.artemis.core.settings.impl.AddressSettings) LocalQueueBinding(org.apache.activemq.artemis.core.postoffice.impl.LocalQueueBinding) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) Message(org.apache.activemq.artemis.api.core.Message) ClientSession(org.apache.activemq.artemis.api.core.client.ClientSession) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) Queue(org.apache.activemq.artemis.core.server.Queue) ClientProducer(org.apache.activemq.artemis.api.core.client.ClientProducer) Test(org.junit.Test)

Example 55 with Message

use of org.apache.activemq.artemis.api.core.Message in project activemq-artemis by apache.

the class ScaleDown3NodeTest method testBasicScaleDownInternal.

private void testBasicScaleDownInternal(int reconnectAttempts, boolean large) throws Exception {
    AddressSettings addressSettings = new AddressSettings().setRedistributionDelay(0);
    servers[0].getAddressSettingsRepository().addMatch("#", addressSettings);
    servers[1].getAddressSettingsRepository().addMatch("#", addressSettings);
    servers[2].getAddressSettingsRepository().addMatch("#", addressSettings);
    servers[0].getConfiguration().getClusterConfigurations().get(0).setReconnectAttempts(reconnectAttempts);
    servers[1].getConfiguration().getClusterConfigurations().get(0).setReconnectAttempts(reconnectAttempts);
    servers[2].getConfiguration().getClusterConfigurations().get(0).setReconnectAttempts(reconnectAttempts);
    final int TEST_SIZE = 10;
    final String addressName = "testAddress";
    final String queueName1 = "testQueue1";
    // create a queue on each node mapped to the same address
    createQueue(0, addressName, queueName1, null, false, servers[0].getConfiguration().getClusterUser(), servers[0].getConfiguration().getClusterPassword());
    createQueue(1, addressName, queueName1, null, false, servers[1].getConfiguration().getClusterUser(), servers[1].getConfiguration().getClusterPassword());
    createQueue(2, addressName, queueName1, null, false, servers[2].getConfiguration().getClusterUser(), servers[2].getConfiguration().getClusterPassword());
    // pause the SnF queue so that when the server tries to redistribute a message it won't actually go across the cluster bridge
    String snfAddress = servers[0].getInternalNamingPrefix() + "sf.cluster0." + servers[0].getNodeID().toString();
    Queue snfQueue = ((LocalQueueBinding) servers[2].getPostOffice().getBinding(SimpleString.toSimpleString(snfAddress))).getQueue();
    snfQueue.pause();
    ClientSession session = sfs[2].createSession(servers[2].getConfiguration().getClusterUser(), servers[2].getConfiguration().getClusterPassword(), false, true, false, false, 0);
    Message message;
    if (large) {
        LargeServerMessageImpl fileMessage = new LargeServerMessageImpl((JournalStorageManager) servers[2].getStorageManager());
        fileMessage.setMessageID(1005);
        fileMessage.setDurable(true);
        for (int i = 0; i < 2 * ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE; i++) {
            fileMessage.addBytes(new byte[] { ActiveMQTestBase.getSamplebyte(i) });
        }
        fileMessage.putLongProperty(Message.HDR_LARGE_BODY_SIZE, 2 * ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE);
        fileMessage.releaseResources();
        message = fileMessage;
    } else {
        message = session.createMessage(false);
    }
    for (int i = 0; i < TEST_SIZE; i++) {
        ClientProducer producer = session.createProducer(addressName);
        producer.send(message);
    }
    if (large) {
        ((LargeServerMessageImpl) message).deleteFile();
    }
    // add a consumer to node 0 to trigger redistribution here
    addConsumer(0, 0, queueName1, null, true, servers[0].getConfiguration().getClusterUser(), servers[0].getConfiguration().getClusterPassword());
    // allow some time for redistribution to move the message to the SnF queue
    long timeout = 10000;
    long start = System.currentTimeMillis();
    long messageCount = 0;
    while (System.currentTimeMillis() - start < timeout) {
        // ensure the message is not in the queue on node 2
        messageCount = getMessageCount(snfQueue);
        if (messageCount < TEST_SIZE) {
            Thread.sleep(200);
        } else {
            break;
        }
    }
    // ensure the message is in the SnF queue
    Assert.assertEquals(TEST_SIZE, getMessageCount(snfQueue));
    // trigger scaleDown from node 0 to node 1
    IntegrationTestLogger.LOGGER.info("============ Stopping " + servers[0].getNodeID());
    removeConsumer(0);
    servers[0].stop();
    start = System.currentTimeMillis();
    while (System.currentTimeMillis() - start < timeout) {
        // ensure the message is not in the queue on node 2
        messageCount = getMessageCount(((LocalQueueBinding) servers[2].getPostOffice().getBinding(new SimpleString(queueName1))).getQueue());
        if (messageCount > 0) {
            Thread.sleep(200);
        } else {
            break;
        }
    }
    Assert.assertEquals(0, messageCount);
    // get the messages from queue 1 on node 1
    addConsumer(0, 1, queueName1, null, true, servers[1].getConfiguration().getClusterUser(), servers[1].getConfiguration().getClusterPassword());
    // allow some time for redistribution to move the message to node 1
    start = System.currentTimeMillis();
    while (System.currentTimeMillis() - start < timeout) {
        // ensure the message is not in the queue on node 2
        messageCount = getMessageCount(((LocalQueueBinding) servers[1].getPostOffice().getBinding(new SimpleString(queueName1))).getQueue());
        if (messageCount < TEST_SIZE) {
            Thread.sleep(200);
        } else {
            break;
        }
    }
    // ensure the message is in queue 1 on node 1 as expected
    Assert.assertEquals(TEST_SIZE, messageCount);
    for (int i = 0; i < TEST_SIZE; i++) {
        ClientMessage clientMessage = consumers[0].getConsumer().receive(250);
        Assert.assertNotNull(clientMessage);
        if (large) {
            Assert.assertEquals(2 * ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE, clientMessage.getBodySize());
            for (int j = 0; j < 2 * ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE; j++) {
                Assert.assertEquals(ActiveMQTestBase.getSamplebyte(j), clientMessage.getBodyBuffer().readByte());
            }
        }
        IntegrationTestLogger.LOGGER.info("Received: " + clientMessage);
        clientMessage.acknowledge();
    }
    // ensure there are no more messages on queue 1
    ClientMessage clientMessage = consumers[0].getConsumer().receive(250);
    Assert.assertNull(clientMessage);
    removeConsumer(0);
}
Also used : AddressSettings(org.apache.activemq.artemis.core.settings.impl.AddressSettings) LocalQueueBinding(org.apache.activemq.artemis.core.postoffice.impl.LocalQueueBinding) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) Message(org.apache.activemq.artemis.api.core.Message) LargeServerMessageImpl(org.apache.activemq.artemis.core.persistence.impl.journal.LargeServerMessageImpl) ClientSession(org.apache.activemq.artemis.api.core.client.ClientSession) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) Queue(org.apache.activemq.artemis.core.server.Queue) ClientProducer(org.apache.activemq.artemis.api.core.client.ClientProducer)

Aggregations

Message (org.apache.activemq.artemis.api.core.Message)114 ClientMessage (org.apache.activemq.artemis.api.core.client.ClientMessage)56 Test (org.junit.Test)52 SimpleString (org.apache.activemq.artemis.api.core.SimpleString)51 ClientSession (org.apache.activemq.artemis.api.core.client.ClientSession)48 ClientProducer (org.apache.activemq.artemis.api.core.client.ClientProducer)46 ClientSessionFactory (org.apache.activemq.artemis.api.core.client.ClientSessionFactory)41 ClientConsumer (org.apache.activemq.artemis.api.core.client.ClientConsumer)35 ActiveMQServer (org.apache.activemq.artemis.core.server.ActiveMQServer)34 CoreMessage (org.apache.activemq.artemis.core.message.impl.CoreMessage)28 AddressSettings (org.apache.activemq.artemis.core.settings.impl.AddressSettings)18 LargeServerMessage (org.apache.activemq.artemis.core.server.LargeServerMessage)16 ArrayList (java.util.ArrayList)15 MessageReference (org.apache.activemq.artemis.core.server.MessageReference)12 ActiveMQBuffer (org.apache.activemq.artemis.api.core.ActiveMQBuffer)11 ICoreMessage (org.apache.activemq.artemis.api.core.ICoreMessage)11 ServerLocator (org.apache.activemq.artemis.api.core.client.ServerLocator)10 Transaction (org.apache.activemq.artemis.core.transaction.Transaction)10 HashMap (java.util.HashMap)9 TransactionImpl (org.apache.activemq.artemis.core.transaction.impl.TransactionImpl)8