Beispiel #1
0
  private void sendBatchXA() {
    try {
      sendMessages();

      // Commit the JTA transaction and start another

      delistResources(tx);

      if (JMSBridgeImpl.trace) {
        HornetQJMSServerLogger.LOGGER.trace("Committing JTA transaction");
      }

      tx.commit();

      if (JMSBridgeImpl.trace) {
        HornetQJMSServerLogger.LOGGER.trace("Committed JTA transaction");
      }

      tx = startTx();

      enlistResources(tx);

      // Clear the messages
      messages.clear();
    } catch (Exception e) {
      HornetQJMSServerLogger.LOGGER.bridgeAckError(e);

      handleFailureOnSend();
    }
  }
Beispiel #2
0
  private void startSource() throws JMSException {
    // start the source connection

    sourceConn.start();

    started = true;

    if (maxBatchTime != -1) {
      if (JMSBridgeImpl.trace) {
        HornetQJMSServerLogger.LOGGER.trace("Starting time checker thread");
      }

      timeChecker = new BatchTimeChecker();

      executor.execute(timeChecker);
      batchExpiryTime = System.currentTimeMillis() + maxBatchTime;

      if (JMSBridgeImpl.trace) {
        HornetQJMSServerLogger.LOGGER.trace("Started time checker thread");
      }
    }

    executor.execute(new SourceReceiver());

    if (JMSBridgeImpl.trace) {
      HornetQJMSServerLogger.LOGGER.trace("Started " + this);
    }
  }
Beispiel #3
0
  private void delistResources(final Transaction tx) {
    if (JMSBridgeImpl.trace) {
      HornetQJMSServerLogger.LOGGER.trace("Delisting resources from tx");
    }

    XAResource resSource = ((XASession) sourceSession).getXAResource();

    try {
      tx.delistResource(resSource, XAResource.TMSUCCESS);
    } catch (Exception e) {
      if (JMSBridgeImpl.trace) {
        HornetQJMSServerLogger.LOGGER.trace("Failed to delist source resource", e);
      }
    }

    XAResource resDest = ((XASession) targetSession).getXAResource();

    try {
      tx.delistResource(resDest, XAResource.TMSUCCESS);
    } catch (Exception e) {
      if (JMSBridgeImpl.trace) {
        HornetQJMSServerLogger.LOGGER.trace("Failed to delist target resource", e);
      }
    }

    if (JMSBridgeImpl.trace) {
      HornetQJMSServerLogger.LOGGER.trace("Delisted resources from tx");
    }
  }
Beispiel #4
0
  private Transaction startTx() throws Exception {
    if (JMSBridgeImpl.trace) {
      HornetQJMSServerLogger.LOGGER.trace("Starting JTA transaction");
    }

    TransactionManager tm = getTm();

    // Set timeout to a large value since we do not want to time out while waiting for messages
    // to arrive - 10 years should be enough
    tm.setTransactionTimeout(JMSBridgeImpl.TEN_YEARS);

    tm.begin();

    Transaction tx = tm.getTransaction();

    // Remove the association between current thread - we don't want it
    // we will be committing /rolling back directly on the transaction object

    tm.suspend();

    if (JMSBridgeImpl.trace) {
      HornetQJMSServerLogger.LOGGER.trace("Started JTA transaction");
    }

    return tx;
  }
Beispiel #5
0
  private Connection createConnection(
      final String username,
      final String password,
      final ConnectionFactoryFactory cff,
      final String clientID,
      final boolean isXA)
      throws Exception {
    Connection conn;

    Object cf = cff.createConnectionFactory();

    if (qualityOfServiceMode == QualityOfServiceMode.ONCE_AND_ONLY_ONCE
        && !(cf instanceof XAConnectionFactory)) {
      throw new IllegalArgumentException("Connection factory must be XAConnectionFactory");
    }

    if (username == null) {
      if (isXA) {
        if (JMSBridgeImpl.trace) {
          HornetQJMSServerLogger.LOGGER.trace("Creating an XA connection");
        }
        conn = ((XAConnectionFactory) cf).createXAConnection();
      } else {
        if (JMSBridgeImpl.trace) {
          HornetQJMSServerLogger.LOGGER.trace("Creating a non XA connection");
        }
        conn = ((ConnectionFactory) cf).createConnection();
      }
    } else {
      if (isXA) {
        if (JMSBridgeImpl.trace) {
          HornetQJMSServerLogger.LOGGER.trace("Creating an XA connection");
        }
        conn = ((XAConnectionFactory) cf).createXAConnection(username, password);
      } else {
        if (JMSBridgeImpl.trace) {
          HornetQJMSServerLogger.LOGGER.trace("Creating a non XA connection");
        }
        conn = ((ConnectionFactory) cf).createConnection(username, password);
      }
    }

    if (clientID != null) {
      conn.setClientID(clientID);
    }

    conn.setExceptionListener(new BridgeExceptionListener());

    return conn;
  }
Beispiel #6
0
  public synchronized void resume() throws Exception {
    if (JMSBridgeImpl.trace) {
      HornetQJMSServerLogger.LOGGER.trace("Resuming " + this);
    }

    synchronized (lock) {
      paused = false;

      sourceConn.start();
    }

    if (JMSBridgeImpl.trace) {
      HornetQJMSServerLogger.LOGGER.trace("Resumed " + this);
    }
  }
Beispiel #7
0
  public synchronized void pause() throws Exception {
    if (JMSBridgeImpl.trace) {
      HornetQJMSServerLogger.LOGGER.trace("Pausing " + this);
    }

    synchronized (lock) {
      paused = true;

      sourceConn.stop();
    }

    if (JMSBridgeImpl.trace) {
      HornetQJMSServerLogger.LOGGER.trace("Paused " + this);
    }
  }
Beispiel #8
0
  private boolean setupJMSObjectsWithRetry() {
    if (JMSBridgeImpl.trace) {
      HornetQJMSServerLogger.LOGGER.trace("Setting up connections");
    }

    int count = 0;

    while (true && !stopping) {
      boolean ok = setupJMSObjects();

      if (ok) {
        return true;
      }

      count++;

      if (maxRetries != -1 && count == maxRetries) {
        break;
      }

      HornetQJMSServerLogger.LOGGER.failedToSetUpBridge(failureRetryInterval);

      pause(failureRetryInterval);
    }

    // If we get here then we exceeded maxRetries
    return false;
  }
Beispiel #9
0
    public void run() {
      if (JMSBridgeImpl.trace) {
        HornetQJMSServerLogger.LOGGER.trace("Failure handler running");
      }

      // Clear the messages
      messages.clear();

      cleanup();

      boolean ok = false;

      if (maxRetries > 0 || maxRetries == -1) {
        HornetQJMSServerLogger.LOGGER.bridgeRetry(failureRetryInterval);

        pause(failureRetryInterval);

        // Now we try
        ok = setupJMSObjectsWithRetry();
      }

      if (!ok) {
        failed();
      } else {
        succeeded();
      }
    }
Beispiel #10
0
  private void addMessageIDInHeader(final Message msg) throws Exception {
    // We concatenate the old message id as a header in the message
    // This allows the target to then use this as the JMSCorrelationID of any response message
    // thus enabling a distributed request-response pattern.
    // Each bridge (if there are more than one) in the chain can concatenate the message id
    // So in the case of multiple bridges having routed the message this can be used in a multi-hop
    // distributed request/response
    if (JMSBridgeImpl.trace) {
      HornetQJMSServerLogger.LOGGER.trace("Adding old message id in Message header");
    }

    JMSBridgeImpl.copyProperties(msg);

    String val = null;

    val = msg.getStringProperty(HornetQJMSConstants.JBOSS_MESSAGING_BRIDGE_MESSAGE_ID_LIST);

    if (val == null) {
      val = msg.getJMSMessageID();
    } else {
      StringBuffer sb = new StringBuffer(val);

      sb.append(",").append(msg.getJMSMessageID());

      val = sb.toString();
    }

    msg.setStringProperty(HornetQJMSConstants.JBOSS_MESSAGING_BRIDGE_MESSAGE_ID_LIST, val);
  }
Beispiel #11
0
  private void enlistResources(final Transaction tx) throws Exception {
    if (JMSBridgeImpl.trace) {
      HornetQJMSServerLogger.LOGGER.trace("Enlisting resources in tx");
    }

    XAResource resSource = ((XASession) sourceSession).getXAResource();

    tx.enlistResource(resSource);

    XAResource resDest = ((XASession) targetSession).getXAResource();

    tx.enlistResource(resDest);

    if (JMSBridgeImpl.trace) {
      HornetQJMSServerLogger.LOGGER.trace("Enlisted resources in tx");
    }
  }
Beispiel #12
0
  private void cleanup() {
    // Stop the source connection
    try {
      sourceConn.stop();
    } catch (Throwable ignore) {
      if (JMSBridgeImpl.trace) {
        HornetQJMSServerLogger.LOGGER.trace("Failed to stop source connection", ignore);
      }
    }

    if (tx != null) {
      try {
        delistResources(tx);
      } catch (Throwable ignore) {
        if (JMSBridgeImpl.trace) {
          HornetQJMSServerLogger.LOGGER.trace("Failed to delist resources", ignore);
        }
      }
      try {
        // Terminate the tx
        tx.rollback();
      } catch (Throwable ignore) {
        if (JMSBridgeImpl.trace) {
          HornetQJMSServerLogger.LOGGER.trace("Failed to rollback", ignore);
        }
      }
    }

    // Close the old objects
    try {
      sourceConn.close();
    } catch (Throwable ignore) {
      if (JMSBridgeImpl.trace) {
        HornetQJMSServerLogger.LOGGER.trace("Failed to close source connection", ignore);
      }
    }
    try {
      if (targetConn != null) {
        targetConn.close();
      }
    } catch (Throwable ignore) {
      if (JMSBridgeImpl.trace) {
        HornetQJMSServerLogger.LOGGER.trace("Failed to close target connection", ignore);
      }
    }
  }
Beispiel #13
0
  private void sendBatchLocalTx() {
    try {
      sendMessages();

      if (JMSBridgeImpl.trace) {
        HornetQJMSServerLogger.LOGGER.trace("Committing source session");
      }

      sourceSession.commit();

      if (JMSBridgeImpl.trace) {
        HornetQJMSServerLogger.LOGGER.trace("Committed source session");
      }

      // Clear the messages
      messages.clear();
    } catch (Exception e) {
      HornetQJMSServerLogger.LOGGER.bridgeAckError(e);

      handleFailureOnSend();
    }
  }
Beispiel #14
0
  private void sendBatch() {
    if (JMSBridgeImpl.trace) {
      HornetQJMSServerLogger.LOGGER.trace("Sending batch of " + messages.size() + " messages");
    }

    if (paused) {
      // Don't send now
      if (JMSBridgeImpl.trace) {
        HornetQJMSServerLogger.LOGGER.trace("Paused, so not sending now");
      }

      return;
    }

    if (forwardMode == JMSBridgeImpl.FORWARD_MODE_LOCALTX) {
      sendBatchLocalTx();
    } else if (forwardMode == JMSBridgeImpl.FORWARD_MODE_XA) {
      sendBatchXA();
    } else {
      sendBatchNonTransacted();
    }
  }
Beispiel #15
0
  private void sendMessages() throws Exception {
    Iterator<Message> iter = messages.iterator();

    Message msg = null;

    while (iter.hasNext()) {
      msg = iter.next();

      if (addMessageIDInHeader) {
        addMessageIDInHeader(msg);
      }

      if (JMSBridgeImpl.trace) {
        HornetQJMSServerLogger.LOGGER.trace("Sending message " + msg);
      }

      // Make sure the correct time to live gets propagated

      long timeToLive = msg.getJMSExpiration();

      if (timeToLive != 0) {
        timeToLive -= System.currentTimeMillis();

        if (timeToLive <= 0) {
          timeToLive =
              1; // Should have already expired - set to 1 so it expires when it is consumed or
          // delivered
        }
      }

      targetProducer.send(
          targetDestination, msg, msg.getJMSDeliveryMode(), msg.getJMSPriority(), timeToLive);

      if (JMSBridgeImpl.trace) {
        HornetQJMSServerLogger.LOGGER.trace("Sent message " + msg);
      }
    }
  }
Beispiel #16
0
    public void onException(final JMSException e) {
      HornetQJMSServerLogger.LOGGER.bridgeFailure();

      synchronized (lock) {
        if (failed) {
          // The failure has already been detected and is being handled
          if (JMSBridgeImpl.trace) {
            HornetQJMSServerLogger.LOGGER.trace("Failure recovery already in progress");
          }
        } else {
          handleFailure(new FailureHandler());
        }
      }
    }
Beispiel #17
0
  private void sendBatchNonTransacted() {
    try {
      if (qualityOfServiceMode == QualityOfServiceMode.ONCE_AND_ONLY_ONCE) {
        // We client ack before sending

        if (JMSBridgeImpl.trace) {
          HornetQJMSServerLogger.LOGGER.trace("Client acking source session");
        }

        messages.getLast().acknowledge();

        if (JMSBridgeImpl.trace) {
          HornetQJMSServerLogger.LOGGER.trace("Client acked source session");
        }
      }

      sendMessages();

      if (maxBatchSize > 1) {
        // The sending session is transacted - we need to commit it

        if (JMSBridgeImpl.trace) {
          HornetQJMSServerLogger.LOGGER.trace("Committing target session");
        }

        targetSession.commit();

        if (JMSBridgeImpl.trace) {
          HornetQJMSServerLogger.LOGGER.trace("Committed source session");
        }
      }

      if (qualityOfServiceMode == QualityOfServiceMode.DUPLICATES_OK) {
        // We client ack after sending

        // Note we could actually use Session.DUPS_OK_ACKNOWLEDGE here
        // For a slightly less strong delivery guarantee

        if (JMSBridgeImpl.trace) {
          HornetQJMSServerLogger.LOGGER.trace("Client acking source session");
        }

        messages.getLast().acknowledge();

        if (JMSBridgeImpl.trace) {
          HornetQJMSServerLogger.LOGGER.trace("Client acked source session");
        }
      }

      // Clear the messages
      messages.clear();
    } catch (Exception e) {
      HornetQJMSServerLogger.LOGGER.bridgeAckError(e);

      handleFailureOnSend();
    }
  }
Beispiel #18
0
    public void run() {
      if (JMSBridgeImpl.trace) {
        HornetQJMSServerLogger.LOGGER.trace(this + " running");
      }

      synchronized (lock) {
        while (started) {
          long toWait = batchExpiryTime - System.currentTimeMillis();

          if (toWait <= 0) {
            if (JMSBridgeImpl.trace) {
              HornetQJMSServerLogger.LOGGER.trace(this + " waited enough");
            }

            synchronized (lock) {
              if (!failed && !messages.isEmpty()) {
                if (JMSBridgeImpl.trace) {
                  HornetQJMSServerLogger.LOGGER.trace(this + " got some messages so sending batch");
                }

                sendBatch();

                if (JMSBridgeImpl.trace) {
                  HornetQJMSServerLogger.LOGGER.trace(this + " sent batch");
                }
              }
            }

            batchExpiryTime = System.currentTimeMillis() + maxBatchTime;
          } else {
            try {
              if (JMSBridgeImpl.trace) {
                HornetQJMSServerLogger.LOGGER.trace(this + " waiting for " + toWait);
              }

              lock.wait(toWait);

              if (JMSBridgeImpl.trace) {
                HornetQJMSServerLogger.LOGGER.trace(this + " woke up");
              }
            } catch (InterruptedException e) {
              if (JMSBridgeImpl.trace) {
                HornetQJMSServerLogger.LOGGER.trace(this + " thread was interrupted");
              }
              throw new HornetQInterruptedException(e);
            }
          }
        }
      }
    }
Beispiel #19
0
  public synchronized void start() throws Exception {
    synchronized (stoppingGuard) {
      stopping = false;
    }

    if (started) {
      HornetQJMSServerLogger.LOGGER.errorBridgeAlreadyStarted();
      return;
    }

    if (JMSBridgeImpl.trace) {
      HornetQJMSServerLogger.LOGGER.trace("Starting " + this);
    }

    // bridge has been stopped and is restarted
    if (executor.isShutdown()) {
      executor = createExecutor();
    }

    initPasswords();

    checkParams();

    TransactionManager tm = getTm();

    // There may already be a JTA transaction associated to the thread

    boolean ok;

    Transaction toResume = null;
    try {
      toResume = tm.suspend();

      ok = setupJMSObjects();
    } finally {
      if (toResume != null) {
        tm.resume(toResume);
      }
    }

    if (ok) {
      startSource();
    } else {
      HornetQJMSServerLogger.LOGGER.errorStartingBridge();
      handleFailureOnStartup();
    }
  }
Beispiel #20
0
  /*
   * Source and target on same server
   * --------------------------------
   * If the source and target destinations are on the same server (same resource manager) then,
   * in order to get ONCE_AND_ONLY_ONCE, we simply need to consuming and send in a single
   * local JMS transaction.
   *
   * We actually use a single local transacted session for the other QoS modes too since this
   * is more performant than using DUPS_OK_ACKNOWLEDGE or AUTO_ACKNOWLEDGE session ack modes, so effectively
   * the QoS is upgraded.
   *
   * Source and target on different server
   * -------------------------------------
   * If the source and target destinations are on a different servers (different resource managers) then:
   *
   * If desired QoS is ONCE_AND_ONLY_ONCE, then we start a JTA transaction and enlist the consuming and sending
   * XAResources in that.
   *
   * If desired QoS is DUPLICATES_OK then, we use CLIENT_ACKNOWLEDGE for the consuming session and
   * AUTO_ACKNOWLEDGE (this is ignored) for the sending session if the maxBatchSize == 1, otherwise we
   * use a local transacted session for the sending session where maxBatchSize > 1, since this is more performant
   * When bridging a batch, we make sure to manually acknowledge the consuming session, if it is CLIENT_ACKNOWLEDGE
   * *after* the batch has been sent
   *
   * If desired QoS is AT_MOST_ONCE then, if maxBatchSize == 1, we use AUTO_ACKNOWLEDGE for the consuming session,
   * and AUTO_ACKNOWLEDGE for the sending session.
   * If maxBatchSize > 1, we use CLIENT_ACKNOWLEDGE for the consuming session and a local transacted session for the
   * sending session.
   *
   * When bridging a batch, we make sure to manually acknowledge the consuming session, if it is CLIENT_ACKNOWLEDGE
   * *before* the batch has been sent
   *
   */
  private boolean setupJMSObjects() {
    try {
      if (sourceCff == targetCff) {
        // Source and target destinations are on the server - we can get once and only once
        // just using a local transacted session
        // everything becomes once and only once

        forwardMode = JMSBridgeImpl.FORWARD_MODE_LOCALTX;
      } else {
        // Different servers
        if (qualityOfServiceMode == QualityOfServiceMode.ONCE_AND_ONLY_ONCE) {
          // Use XA

          forwardMode = JMSBridgeImpl.FORWARD_MODE_XA;
        } else {
          forwardMode = JMSBridgeImpl.FORWARD_MODE_NONTX;
        }
      }

      // Lookup the destinations
      sourceDestination = sourceDestinationFactory.createDestination();

      targetDestination = targetDestinationFactory.createDestination();

      if (forwardMode == JMSBridgeImpl.FORWARD_MODE_LOCALTX) {
        // We simply use a single local transacted session for consuming and sending

        sourceConn = createConnection(sourceUsername, sourcePassword, sourceCff, clientID, false);
        sourceSession = sourceConn.createSession(true, Session.SESSION_TRANSACTED);
      } else {
        if (forwardMode == JMSBridgeImpl.FORWARD_MODE_XA) {
          // Create an XASession for consuming from the source
          if (JMSBridgeImpl.trace) {
            HornetQJMSServerLogger.LOGGER.trace("Creating XA source session");
          }

          sourceConn = createConnection(sourceUsername, sourcePassword, sourceCff, clientID, true);
          sourceSession = ((XAConnection) sourceConn).createXASession();
        } else {
          if (JMSBridgeImpl.trace) {
            HornetQJMSServerLogger.LOGGER.trace("Creating non XA source session");
          }

          // Create a standard session for consuming from the source

          // We use ack mode client ack

          sourceConn = createConnection(sourceUsername, sourcePassword, sourceCff, clientID, false);
          sourceSession = sourceConn.createSession(false, Session.CLIENT_ACKNOWLEDGE);
        }
      }

      if (subName == null) {
        if (selector == null) {
          sourceConsumer = sourceSession.createConsumer(sourceDestination);
        } else {
          sourceConsumer = sourceSession.createConsumer(sourceDestination, selector, false);
        }
      } else {
        // Durable subscription
        if (selector == null) {
          sourceConsumer =
              sourceSession.createDurableSubscriber((Topic) sourceDestination, subName);
        } else {
          sourceConsumer =
              sourceSession.createDurableSubscriber(
                  (Topic) sourceDestination, subName, selector, false);
        }
      }

      // Now the sending session

      if (forwardMode == JMSBridgeImpl.FORWARD_MODE_LOCALTX) {
        targetConn = sourceConn;
        targetSession = sourceSession;
      } else {
        if (forwardMode == JMSBridgeImpl.FORWARD_MODE_XA) {
          if (JMSBridgeImpl.trace) {
            HornetQJMSServerLogger.LOGGER.trace("Creating XA dest session");
          }

          // Create an XA sesion for sending to the destination

          targetConn = createConnection(targetUsername, targetPassword, targetCff, null, true);

          targetSession = ((XAConnection) targetConn).createXASession();
        } else {
          if (JMSBridgeImpl.trace) {
            HornetQJMSServerLogger.LOGGER.trace("Creating non XA dest session");
          }

          // Create a standard session for sending to the target

          // If batch size > 1 we use a transacted session since is more efficient

          boolean transacted = maxBatchSize > 1;

          targetConn = createConnection(targetUsername, targetPassword, targetCff, null, false);

          targetSession =
              targetConn.createSession(
                  transacted, transacted ? Session.SESSION_TRANSACTED : Session.AUTO_ACKNOWLEDGE);
        }
      }

      if (forwardMode == JMSBridgeImpl.FORWARD_MODE_XA) {
        if (JMSBridgeImpl.trace) {
          HornetQJMSServerLogger.LOGGER.trace("Starting JTA transaction");
        }

        tx = startTx();

        enlistResources(tx);
      }

      targetProducer = targetSession.createProducer(null);

      return true;
    } catch (Exception e) {
      // We shouldn't log this, as it's expected when trying to connect when target/source is not
      // available

      // If this fails we should attempt to cleanup or we might end up in some weird state

      // Adding a log.warn, so the use may see the cause of the failure and take actions
      HornetQJMSServerLogger.LOGGER.bridgeConnectError(e);

      cleanup();

      return false;
    }
  }
Beispiel #21
0
    @Override
    public void run() {
      while (started) {
        synchronized (lock) {
          if (paused || failed) {
            try {
              lock.wait(500);
            } catch (InterruptedException e) {
              throw new HornetQInterruptedException(e);
            }
            continue;
          }

          Message msg = null;
          try {
            msg = sourceConsumer.receive(1000);

            if (msg instanceof HornetQMessage) {
              // We need to check the buffer mainly in the case of LargeMessages
              // As we need to reconstruct the buffer before resending the message
              ((HornetQMessage) msg).checkBuffer();
            }
          } catch (JMSException jmse) {
            if (JMSBridgeImpl.trace) {
              HornetQJMSServerLogger.LOGGER.trace(
                  this + " exception while receiving a message", jmse);
            }
          }

          if (msg == null) {
            try {
              lock.wait(500);
            } catch (InterruptedException e) {
              if (JMSBridgeImpl.trace) {
                HornetQJMSServerLogger.LOGGER.trace(this + " thread was interrupted");
              }
              throw new HornetQInterruptedException(e);
            }
            continue;
          }

          if (JMSBridgeImpl.trace) {
            HornetQJMSServerLogger.LOGGER.trace(this + " received message " + msg);
          }

          messages.add(msg);

          batchExpiryTime = System.currentTimeMillis() + maxBatchTime;

          if (JMSBridgeImpl.trace) {
            HornetQJMSServerLogger.LOGGER.trace(
                this + " rescheduled batchExpiryTime to " + batchExpiryTime);
          }

          if (maxBatchSize != -1 && messages.size() >= maxBatchSize) {
            if (JMSBridgeImpl.trace) {
              HornetQJMSServerLogger.LOGGER.trace(
                  this + " maxBatchSize has been reached so sending batch");
            }

            sendBatch();

            if (JMSBridgeImpl.trace) {
              HornetQJMSServerLogger.LOGGER.trace(this + " sent batch");
            }
          }
        }
      }
    }
Beispiel #22
0
  public JMSBridgeImpl(
      final ConnectionFactoryFactory sourceCff,
      final ConnectionFactoryFactory targetCff,
      final DestinationFactory sourceDestinationFactory,
      final DestinationFactory targetDestinationFactory,
      final String sourceUsername,
      final String sourcePassword,
      final String targetUsername,
      final String targetPassword,
      final String selector,
      final long failureRetryInterval,
      final int maxRetries,
      final QualityOfServiceMode qosMode,
      final int maxBatchSize,
      final long maxBatchTime,
      final String subName,
      final String clientID,
      final boolean addMessageIDInHeader,
      final MBeanServer mbeanServer,
      final String objectName) {
    this();

    this.sourceCff = sourceCff;

    this.targetCff = targetCff;

    this.sourceDestinationFactory = sourceDestinationFactory;

    this.targetDestinationFactory = targetDestinationFactory;

    this.sourceUsername = sourceUsername;

    this.sourcePassword = sourcePassword;

    this.targetUsername = targetUsername;

    this.targetPassword = targetPassword;

    this.selector = selector;

    this.failureRetryInterval = failureRetryInterval;

    this.maxRetries = maxRetries;

    qualityOfServiceMode = qosMode;

    this.maxBatchSize = maxBatchSize;

    this.maxBatchTime = maxBatchTime;

    this.subName = subName;

    this.clientID = clientID;

    this.addMessageIDInHeader = addMessageIDInHeader;

    checkParams();

    if (mbeanServer != null) {
      if (objectName != null) {
        this.mbeanServer = mbeanServer;

        try {
          JMSBridgeControlImpl controlBean = new JMSBridgeControlImpl(this);
          this.objectName = ObjectName.getInstance(objectName);
          StandardMBean mbean = new StandardMBean(controlBean, JMSBridgeControl.class);
          mbeanServer.registerMBean(mbean, this.objectName);
          HornetQJMSServerLogger.LOGGER.debug(
              "Registered JMSBridge instance as: " + this.objectName.getCanonicalName());
        } catch (Exception e) {
          throw new IllegalStateException("Failed to register JMSBridge MBean", e);
        }
      } else {
        throw new IllegalArgumentException("objectName is required when specifying an MBeanServer");
      }
    }

    if (JMSBridgeImpl.trace) {
      HornetQJMSServerLogger.LOGGER.trace("Created " + this);
    }
  }
Beispiel #23
0
  public void stop() throws Exception {
    synchronized (stoppingGuard) {
      if (stopping) return;
      stopping = true;
    }

    synchronized (this) {
      if (JMSBridgeImpl.trace) {
        HornetQJMSServerLogger.LOGGER.trace("Stopping " + this);
      }

      synchronized (lock) {
        started = false;

        executor.shutdownNow();
      }

      boolean ok = executor.awaitTermination(60, TimeUnit.SECONDS);

      if (!ok) {
        throw new Exception("fail to stop JMS Bridge");
      }

      if (tx != null) {
        // Terminate any transaction
        if (JMSBridgeImpl.trace) {
          HornetQJMSServerLogger.LOGGER.trace("Rolling back remaining tx");
        }

        try {
          tx.rollback();
        } catch (Exception ignore) {
          if (JMSBridgeImpl.trace) {
            HornetQJMSServerLogger.LOGGER.trace("Failed to rollback", ignore);
          }
        }

        if (JMSBridgeImpl.trace) {
          HornetQJMSServerLogger.LOGGER.trace("Rolled back remaining tx");
        }
      }

      try {
        sourceConn.close();
      } catch (Exception ignore) {
        if (JMSBridgeImpl.trace) {
          HornetQJMSServerLogger.LOGGER.trace("Failed to close source conn", ignore);
        }
      }

      if (targetConn != null) {
        try {
          targetConn.close();
        } catch (Exception ignore) {
          if (JMSBridgeImpl.trace) {
            HornetQJMSServerLogger.LOGGER.trace("Failed to close target conn", ignore);
          }
        }
      }

      if (JMSBridgeImpl.trace) {
        HornetQJMSServerLogger.LOGGER.trace("Stopped " + this);
      }
    }
  }