我希望能够使用 Spring Boot 应用程序取消发送到队列(ActiveMQ Classic)的消息。我已经实现了一个小函数来帮助我从队列中删除消息,但它不起作用。通过深入研究,我意识到经纪人在安排时不会给你一个ID(你可以用它来取消消息)。但我尝试通过安排消息、从 ActiveMQ Classic Web 控制台选取 id 并将其硬编码到我的函数中来进行测试。
如果您能帮助我弄清楚我在函数中做错了什么,我将不胜感激
scheduleMessageRemoval
。
@SpringBootApplication
@ComponentScan(basePackages = "com.example.paygokyu")
public class PaygokyuApplication {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(PaygokyuApplication.class, args);
JmsTemplate jms = ctx.getBean(JmsTemplate.class);
// Schedule the message with a delay of 60 seconds
jms.convertAndSend("javainuse", "To be consumed with delay!!!!!!", message -> {
message.setLongProperty("AMQ_SCHEDULED_DELAY", 60000);
scheduleMessageRemoval(jms, message);
return message;
});
}
private static void scheduleMessageRemoval(JmsTemplate jms, Message scheduledMessage) {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
// Schedule the message removal after 30 seconds
scheduler.schedule(() -> {
try {
jms.send("javainuse", session -> {
Message remove = session.createMessage();
remove.setStringProperty(ScheduledMessage.AMQ_SCHEDULER_ACTION,
ScheduledMessage.AMQ_SCHEDULER_ACTION_REMOVE);
remove.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_ID,
scheduledMessage.getStringProperty(ScheduledMessage.AMQ_SCHEDULED_ID));
return remove;
});
scheduler.shutdown();
} catch (Exception e) {
// Log other exceptions
e.printStackTrace();
}
}, 30, TimeUnit.SECONDS);
}
}
从您的代码中不清楚您如何获取预定消息的 ID,因此您需要确保您拥有正确的 ID。另一件不清楚的事情是您要将删除命令消息发送到哪个目的地,下面的示例代码显示了删除操作的基本结构。删除请求必须发送到管理目的地。
Destination management = session.createTopic(ScheduledMessage.AMQ_SCHEDULER_MANAGEMENT_DESTINATION);
MessageProducer producer = session.createProducer(management);
Message remove = session.createMessage();
remove.setStringProperty(ScheduledMessage.AMQ_SCHEDULER_ACTION,
ScheduledMessage.AMQ_SCHEDULER_ACTION_REMOVE);
remove.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_ID, <ID>);
producer.send(remove);