[英]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.