Как определить, запущена или остановлена ​​очередь JMS? - PullRequest
0 голосов
/ 26 марта 2019

У меня есть служба Java, которая получает сообщения из Oracle Advanced Queue.Я могу создать соединение и слушать и получать сообщения ОК.Я вижу, что вы можете остановиться и начать прослушивать сообщения, поэтому я реализовал элементы управления для этого.Тем не менее, я хотел бы иметь возможность сообщить о текущем статусе слушателя.Я могу видеть, есть ли он там, но как я могу определить, остановлен он или запущен?

У меня есть контейнерный класс по строкам (Listener - это мой собственный класс (реализующий как MessageListener, так и * 1005).*) что на самом деле что-то делает с сообщением)

public class QueueContainer {
  private static final String QUEUE_NAME = "foo";

  private final Connection dbConnection;
  private final QueueConnection queueConnection;
  private final QueueSession queueSession;
  private final Queue queue;
  private final MessageConsumer consumer;
  private final Listener listener;

public QueueContainer(final Connection dbConnection ) {
    try {
      this.dbConnection = dbConnection;
      queueConnection = AQjmsQueueConnectionFactory.createQueueConnection(dbConnection);
      queueSession = queueConnection.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);
      queue = ((AQjmsSession) queueSession).getQueue(context.getEnvironment(), QUEUE_NAME);
      consumer = queueSession.createConsumer(queue);
      listener = new Listener(QUEUE_NAME);
      consumer.setMessageListener(listener);
      queueConnection.setExceptionListener(listener);
    } catch (JMSException | SQLException e) {
      throw new RunTimeException("Queue Exception", e);
    }
  }
  public void startListening() {
    try {
      queueConnection.start();

    } catch (JMSException e) {
      throw new RunTimeException("Failed to start listening to queue", e);
    }
  }

  public void stopListening() {
    try {
      queueConnection.stop();
    } catch (JMSException e) {
      throw new RunTimeException("Failed to stop listening to queue", e);
    }
  }

  public void close() {
    if (queueConnection != null) {
      try {
        queueConnection.close();
      } catch (JMSException e) {
        throw new RunTimeException("Failed to stop listening to queue", e);
      }
    }
  }

  public boolean isRunning() {
    try {
      // This doesn't work - I can't distinguish between started and stopped
      return queueConnection.getClientID() != null;
    } catch (JMSException e) {
      LOGGER.warn("Failed to get queue client ID", e);
      return false;
    }
  }

Я не вижу, что вставить в isRunning, чтобы можно было различить остановленный и запущенный слушатель

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

JMS API предполагает, что вы сами знаете, что сделали.Так почему бы не добавить логический флаг и следить за этим?

    private volatile boolean isListening = false;
    ...

    public void startListening() {
    try {
      queueConnection.start();
      isListening = true;
    } catch (JMSException e) {
      throw new RunTimeException("Failed to start listening to queue", e);
    }
  }

  public void stopListening() {
    try {
      queueConnection.stop();
      isListening = false;
    } catch (JMSException e) {
      throw new RunTimeException("Failed to stop listening to queue", e);
    }
  }

  public void close() {
    if (queueConnection != null) {
      try {
        queueConnection.close();
        isListening = false;
      } catch (JMSException e) {
        throw new RunTimeException("Failed to stop listening to queue", e);
      }
    }
  }

  public boolean isRunning() {
      return isListening;
  }
0 голосов
/ 26 марта 2019

Нет вызова API JMS, чтобы определить, запущен или нет javax.jms.Connection.

Для ясности, сама очередь не является объектом, который запускается или останавливается. соединение запущено или остановлено.

Вы можете иметь возможность получить эту информацию из объекта реализации Oracle Advanced Queue, но я не знаком с этой реализациейпоэтому я не могу сказать.Очевидно, что любое решение, использующее объект реализации, а не стандартный API, не будет переносимым.

...