我以前从未使用过activeMQ。我正在为我的项目做一些研究,我需要根据监听器逻辑重新发送消息。根据{{3}},我是:
使用我当前的代码,我可以在testQueue上读取一次消息。 但我的重新交付政策仍然有效。我尝试了settign初始延迟,但消息是自动传递的。我想把这个信息重新传递5次。那不会发生。
我正在使用以下代码创建连接工厂,连接,会话和队列:
RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
redeliveryPolicy.setInitialRedeliveryDelay(0);
redeliveryPolicy.setMaximumRedeliveries(5);
redeliveryPolicy.setRedeliveryDelay(1000);
redeliveryPolicy.setQueue("*");
redeliveryPolicy.setBackOffMultiplier(2);
factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
factory.setRedeliveryPolicy(redeliveryPolicy);
connection = (ActiveMQConnection) factory.createConnection();
// connection.setRedeliveryPolicy(redeliveryPolicy);
connection.start();
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
String queueName = "testQueue"+(UUID.randomUUID());
System.out.println("Creating Queue: "+queueName);
testQueue = session.createQueue(queueName);
我尝试将RedeliveryPolicy设置为ActiveMQConnectionFactory和ActiveMQConnection(对我来说没用。)
然后我在消费者中做了以下设置Message Listener:
MessageConsumer consumer = session.createConsumer(testQueue);
consumer.setMessageListener(new MyMessageListener(id, session));
MyMessageListener:
public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
String text = textMessage.getText();
System.out.println("Consuming["+threadId+"] message: " + text);
if(text.contains("RD")){
System.out.println("acknowledgeThisMessage");
((com.sun.messaging.jms.Message)message).acknowledgeThisMessage();
} else{
session.recover();
}
}
else{
System.out.println("Consuming["+threadId+"] Weird Message: " + message);
}
} catch (JMSException e) {
e.printStackTrace();
}
}
如果您需要更多信息,请告诉我我可以更新帖子。提前谢谢。
答案 0 :(得分:0)
如果我在使用者中创建侦听器,我能够使RedeliveryPolicies正常工作。我不确定为什么这个有效并且单独上课并不是。我的消费者现在看起来像:
try {
MessageConsumer consumer = session.createConsumer(testQueue);
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
String text = textMessage.getText();
System.out.println("Consuming["+threadId+"] message: " + text);
if(text.contains("RD")){
System.out.println("acknowledgeThisMessage");
((com.sun.messaging.jms.Message)message).acknowledgeThisMessage();
} else{
System.out.println("recovering the message");
session.recover();
}
}
else{
System.out.println("Consuming["+threadId+"] Weird Message: " + message);
}
} catch (JMSException e) {
e.printStackTrace();
}
}
});
} catch (JMSException e) {
e.printStackTrace();
}
希望这有助于某人。