簡體   English   中英

ActiveMQ消費者級別超時

[英]ActiveMQ consumer level timeout

我試圖在Active MQ(版本5.15.0)中創建使用者級別的超時。 考慮到一條消息是由消費者選擇的,但無法確認,因此在這種情況下,我希望消費者超時,以便其他收聽經紀人的消費者可以選擇相同的消息。

我的生產者代碼中設置了兩個消費者監聽器:

public class JmsMessageListenerAckExample {
  public static void main(String[] args) throws URISyntaxException, Exception {
    Connection connection = null;
    try {
      // Producer
      ConnectionFactory factory = createActiveMQConnectionFactory();
      connection = factory.createConnection();
      Session session = connection.createSession(false,
          Session.CLIENT_ACKNOWLEDGE);
      Queue queue = session.createQueue("customerQueue");
      String payload = "Important Task";
      Message msg = session.createTextMessage(payload);
      MessageProducer producer = session.createProducer(queue);

      System.out.println("Sending text '" + payload + "'");
      producer.send(msg);

      // Consumer
      MessageConsumer consumer1 = session.createConsumer(queue);
      consumer1.setMessageListener(
          new AckMessageListener(false, "consumer1"));
      Thread.sleep(1000);
      System.out.println("Creating new message listener to acknowledge");
      producer.send(msg);
      MessageConsumer consumer2 = session.createConsumer(queue);
      consumer2.setMessageListener(
          new AckMessageListener(true, "consumer2"));
      connection.start();

      Thread.sleep(3000);
      session.close();
    } finally {
      if (connection != null) {
        connection.close();
      }
    }
  }

  private static ActiveMQConnectionFactory createActiveMQConnectionFactory() {
    // Create a connection factory.
    final ActiveMQConnectionFactory connectionFactory =
        new ActiveMQConnectionFactory("tcp://localhost:61616");

    // Pass the username and password.
    connectionFactory.setUserName("user");
    connectionFactory.setPassword("user");
    return connectionFactory;
  }
}

這是我的消費者聽眾:

public class AckMessageListener implements MessageListener {
  private boolean acknowledge;
  private String consumerName;

  public AckMessageListener(boolean acknowledge, String consumerName) {
    this.acknowledge = acknowledge;
    this.consumerName = consumerName;
  }

  public void onMessage(Message message) {
    boolean terminate = !acknowledge;
    try {

      System.out.println("ConsumerName="+consumerName+", Acknowledge="+acknowledge);
      if (acknowledge) {
        try {
          message.acknowledge();
        } catch (JMSException e1) {
          e1.printStackTrace();
        }
      }

      System.out.println(message);
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
      if (terminate) {
        Thread.currentThread().interrupt();
      }
    }
  }
}

我想以某種方式進行模擬,使consumer1監聽消息但不確認,以至於超時,我試圖釋放線程,我希望我的consumer2將其拾取並給予確認,以使消息從“代理中的“消息已入隊”狀態變為“消息已出隊”狀態,但是我的consumer2無法接收任何消息事件。

我做錯了什么嗎? 如何使用Active MQ實現使用者級別的超時?

處理此問題的一種方法是使用事務( http://activemq.apache.org/how-do-transactions-work.html )。 如果調用成功,則調用commit();如果調用失敗,則調用rollback();如果在調用commit()之前關閉了會話,則將發生重新傳送( http://activemq.apache.org/message-redelivery-and-dlq-handling。 html )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM