从 ActiveMQ Classic 中删除计划消息

问题描述 投票:0回答:1

我希望能够使用 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);
    }
}
spring-boot jms activemq
1个回答
0
投票

从您的代码中不清楚您如何获取预定消息的 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);
© www.soinside.com 2019 - 2024. All rights reserved.