/**
   * Create a one time MessageProducer for this JMS OutTransport information. For simplicity and
   * best compatibility, this method uses only JMS 1.0.2b API. Please be cautious when making any
   * changes
   *
   * @return a JMSSender based on one-time use resources
   * @throws JMSException on errors, to be handled and logged by the caller
   */
  public JMSMessageSender createJMSSender(MessageContext msgCtx) throws JMSException {

    // digest the targetAddress and locate CF from the EPR
    loadConnectionFactoryFromProperties();

    // create a one time connection and session to be used
    String user = properties != null ? properties.get(JMSConstants.PARAM_JMS_USERNAME) : null;
    String pass = properties != null ? properties.get(JMSConstants.PARAM_JMS_PASSWORD) : null;

    QueueConnectionFactory qConFac = null;
    TopicConnectionFactory tConFac = null;

    int destType = -1;
    // TODO: there is something missing here for destination type generic
    if (JMSConstants.DESTINATION_TYPE_QUEUE.equals(destinationType)) {
      destType = JMSConstants.QUEUE;
      qConFac = (QueueConnectionFactory) connectionFactory;

    } else if (JMSConstants.DESTINATION_TYPE_TOPIC.equals(destinationType)) {
      destType = JMSConstants.TOPIC;
      tConFac = (TopicConnectionFactory) connectionFactory;
    } else {
      // treat jmsdestination type=queue(default is queue)
      destType = JMSConstants.QUEUE;
      qConFac = (QueueConnectionFactory) connectionFactory;
    }

    if (msgCtx.getProperty(JMSConstants.JMS_XA_TRANSACTION_MANAGER) != null) {
      XAConnection connection = null;
      if (user != null && pass != null) {
        if (qConFac != null) {
          connection = ((XAConnectionFactory) qConFac).createXAConnection(user, pass);
        } else if (tConFac != null) {
          connection = ((XAConnectionFactory) tConFac).createXAConnection(user, pass);
        }
      } else {
        if (qConFac != null) {
          connection = ((XAConnectionFactory) qConFac).createXAConnection();
        } else if (tConFac != null) {
          connection = ((XAConnectionFactory) tConFac).createXAConnection();
        }
      }

      if (connection == null) {
        connection = ((XAConnectionFactory) qConFac).createXAConnection();
      }

      XASession session = null;
      MessageProducer producer = null;

      if (connection != null) {
        if (destType == JMSConstants.QUEUE) {
          session = connection.createXASession();
          producer = session.createProducer(destination);
        } else {
          session = connection.createXASession();
          producer = session.createProducer(destination);
        }
      }

      XAResource xaResource = session.getXAResource();
      TransactionManager tx = null;
      Xid xid1 = null;
      Transaction transaction = null;
      java.util.UUID uuid = java.util.UUID.randomUUID();

      try {
        tx = (TransactionManager) msgCtx.getProperty(JMSConstants.JMS_XA_TRANSACTION_MANAGER);
        transaction = tx.getTransaction();
        msgCtx.setProperty(JMSConstants.JMS_XA_TRANSACTION_MANAGER, tx);
        msgCtx.setProperty(JMSConstants.JMS_XA_TRANSACTION, transaction);
        xid1 =
            new JMSXid(
                JMSConstants.JMS_XA_TRANSACTION_PREFIX.getBytes(StandardCharsets.UTF_8),
                1,
                uuid.toString().getBytes());
        msgCtx.setProperty("XID", xid1);
        xaResource.start(xid1, XAResource.TMNOFLAGS);
      } catch (SystemException e) {
        handleException("Error Occurred during starting getting Transaction.", e);
      } catch (XAException e) {
        handleException("Error Occurred during starting XA resource.", e);
      }
      return new JMSMessageSender(
          connection,
          session,
          producer,
          destination,
          jmsConnectionFactory == null ? this.cacheLevel : jmsConnectionFactory.getCacheLevel(),
          jmsSpecVersion,
          destType == -1 ? null : destType == JMSConstants.QUEUE ? Boolean.TRUE : Boolean.FALSE,
          transaction,
          xid1,
          xaResource);
    } else {
      Connection connection = null;
      if (user != null && pass != null) {
        if (qConFac != null) {
          connection = qConFac.createQueueConnection(user, pass);
        } else if (tConFac != null) {
          connection = tConFac.createTopicConnection(user, pass);
        }
      } else {
        if (qConFac != null) {
          connection = qConFac.createQueueConnection();
        } else if (tConFac != null) {
          connection = tConFac.createTopicConnection();
        }
      }

      if (connection == null) {
        connection = jmsConnectionFactory != null ? jmsConnectionFactory.getConnection() : null;
      }

      Session session = null;
      MessageProducer producer = null;

      if (connection != null) {
        if (destType == JMSConstants.QUEUE) {
          session =
              ((QueueConnection) connection).createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
          producer = ((QueueSession) session).createSender((Queue) destination);
        } else {
          session =
              ((TopicConnection) connection).createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
          producer = ((TopicSession) session).createPublisher((Topic) destination);
        }
      }
      return new JMSMessageSender(
          connection,
          session,
          producer,
          destination,
          jmsConnectionFactory == null ? this.cacheLevel : jmsConnectionFactory.getCacheLevel(),
          jmsSpecVersion,
          destType == -1 ? null : destType == JMSConstants.QUEUE ? Boolean.TRUE : Boolean.FALSE);
    }
  }
Example #2
0
  @Override
  public boolean runExample() throws Exception {
    XAConnection connection = null;
    InitialContext initialContext = null;
    try {
      // Step 1. Create an initial context to perform the JNDI lookup.
      initialContext = getContext(0);

      // Step 2. Lookup on the queue
      Queue queue = (Queue) initialContext.lookup("/queue/exampleQueue");

      // Step 3. Perform a lookup on the XA Connection Factory
      XAConnectionFactory cf = (XAConnectionFactory) initialContext.lookup("/XAConnectionFactory");

      // Step 4.Create a JMS XAConnection
      connection = cf.createXAConnection();

      // Step 5. Start the connection
      connection.start();

      // Step 6. Create a JMS XASession
      XASession xaSession = connection.createXASession();

      // Step 7. Create a normal session
      Session normalSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

      // Step 8. Create a normal Message Consumer
      MessageConsumer normalConsumer = normalSession.createConsumer(queue);
      normalConsumer.setMessageListener(new SimpleMessageListener());

      // Step 9. Get the JMS Session
      Session session = xaSession.getSession();

      // Step 10. Create a message producer
      MessageProducer producer = session.createProducer(queue);

      // Step 11. Create two Text Messages
      TextMessage helloMessage = session.createTextMessage("hello");
      TextMessage worldMessage = session.createTextMessage("world");

      // Step 12. create a transaction
      Xid xid1 =
          new DummyXid(
              "xa-example1".getBytes(CharsetUtil.UTF_8),
              1,
              UUIDGenerator.getInstance().generateStringUUID().getBytes());

      // Step 13. Get the JMS XAResource
      XAResource xaRes = xaSession.getXAResource();

      // Step 14. Begin the Transaction work
      xaRes.start(xid1, XAResource.TMNOFLAGS);

      // Step 15. do work, sending two messages.
      producer.send(helloMessage);
      producer.send(worldMessage);

      Thread.sleep(2000);

      // Step 16. Check the result, it should receive none!
      checkNoMessageReceived();

      // Step 17. Stop the work
      xaRes.end(xid1, XAResource.TMSUCCESS);

      // Step 18. Prepare
      xaRes.prepare(xid1);

      // Step 19. Roll back the transaction
      xaRes.rollback(xid1);

      // Step 20. No messages should be received!
      checkNoMessageReceived();

      // Step 21. Create another transaction
      Xid xid2 =
          new DummyXid(
              "xa-example2".getBytes(),
              1,
              UUIDGenerator.getInstance().generateStringUUID().getBytes());

      // Step 22. Start the transaction
      xaRes.start(xid2, XAResource.TMNOFLAGS);

      // Step 23. Re-send those messages
      producer.send(helloMessage);
      producer.send(worldMessage);

      // Step 24. Stop the work
      xaRes.end(xid2, XAResource.TMSUCCESS);

      // Step 25. Prepare
      xaRes.prepare(xid2);

      // Step 26. No messages should be received at this moment
      checkNoMessageReceived();

      // Step 27. Commit!
      xaRes.commit(xid2, false);

      Thread.sleep(2000);

      // Step 28. Check the result, all message received
      checkAllMessageReceived();

      return result;
    } finally {
      // Step 29. Be sure to close our JMS resources!
      if (initialContext != null) {
        initialContext.close();
      }
      if (connection != null) {
        connection.close();
      }
    }
  }