【问题标题】:Repeat scheduling a message for delivery ActiveMQ using jmsTemplate (Spring JMS)使用 jmsTemplate (Spring JMS) 重复调度消息以传递 ActiveMQ
【发布时间】:2019-02-25 16:30:21
【问题描述】:

我正在通过以下方式向队列发送消息:

我想安排重复我的消息。我的意思是,无论我在控制器中的这条线jsmClient.send(identifier);(如下所示)发送什么消息, 我想继续发送,比如说 10 或 100 次(取决于我设置的计时器)。我的消费者(未在下面显示)将继续使用相同的消息,直到我要求它停止。例如,即使 我的生产者将发送消息 10 或 100 次,如果我想在第 5 次(如果生产者发送消息 10 次)或第 50 次(如果生产者发送消息 100 次)停止接收消息, 我应该能够做到这一点。

由于我使用的是 JMS 2 和 ActiveMQ(版本 5.15.8),我无法弄清楚以下内容:

Delay and Schedule Message Delivery 文档在以下部分中讨论了AMQ_SCHEDULED_REPEAT

MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage("test msg");
long delay = 30 * 1000;
long period = 10 * 1000;
int repeat = 9;
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay);
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, period);
message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, repeat);
producer.send(message);

如果我理解正确,上面的代码考虑的不是 JMS 2 而是 JMS 1.1?我想知道我需要在下面的代码中进行哪些更改,以便我可以执行类似message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, repeat); 的操作。我在the Spring documentation 中找不到很多关于计划重复的有用信息。

我的 JmsProducer 类:

@Component
public class JmsProducer {
    @Autowired
    JmsTemplate jmsTemplate;

    @Value("${jms.queue.destination}")
    String destinationQueue;

    public void send(String msg){
        jmsTemplate.convertAndSend(destinationQueue, msg);
    }
}

JmsClient 接口:

public interface JmsClient {
    public void send(String msg);

}

JmsClientImpl 类:

@Service
public class JmsClientImpl implements JmsClient{


    @Autowired
    JmsProducer jmsProducer;

    @Override
    public void send(String msg) {
        jmsProducer.send(msg);
    }


}

在我的 REST 控制器中,我正在发送这样的消息:

try {

            DataRetrieverDao dataRetrieverDao = (DataRetrieverDao) context.getBean("dataRetrieverDao");
            String identifier=dataRetrieverDao.sendDownloadInfo(user_id);
            logger.info("VALUE OF STRING: "+identifier);
            jsmClient.send(identifier);



        }

基于我的研究:

this stackoverflow thread,activemq 包不支持JMS 2.0,所以我应该改用artemis 吗?但是,我从上面的 jmsTemplate 方面提出的问题仍然在我的脑海中。请告诉我在这种情况下最好的行动方案是什么。谢谢

【问题讨论】:

    标签: java jms activemq spring-jms activemq-artemis


    【解决方案1】:

    在 ActiveMQ 5.x 中延迟和计划消息传递的工作方式是生产者使用特殊属性设置消息的延迟/计划并发送消息一次。一旦代理收到消息,它将根据消息上设置的延迟和时间表将消息传递到队列。因此,在延迟和预定消息的上下文中说“......我的生产者将发送消息 10 或 100 次......”是不准确的。

    延迟和计划的消息传递是 ActiveMQ 5.x 的一个特性,而不是 JMS 规范的一部分。 Spring JMS 库和/或文档不会提及此功能,因为它是 ActiveMQ 5.x 独有的。

    如您所述,ActiveMQ 5.x 不支持 JMS 2.0,因此如果您想要 JMS 2.0 支持,您需要切换到 ActiveMQ Artemis。但是,ActiveMQ Artemis 不支持延迟和预定消息as discussed on the user mailing list。因此,如果您想延迟和安排消息,您可能需要坚持使用 JMS 1.1,或者想办法通过 JMS 2.0 和 ActiveMQ Artemis 来实现您正在寻找的功能。

    【讨论】:

    • 谢谢。所以,如果我切换到 JMS 1.x 1) 你认为我在寻找 my producer is going to send the message 10 or 100 times 行中描述的内容是可以实现的吗? 2) 我是否完全需要摆脱 Spring JMS 才能使用 JMS 1.x ?谢谢
    • 正如我已经解释过的,如果您使用 ActiveMQ 5.x 的延迟和预定消息功能,那么您的生产者不会发送消息 10 或 100 次;假设您已在消息上配置了适当的属性,ActiveMQ 5.x 代理将执行此操作。我不知道你为什么一直坚持错误地陈述这一点。如果您正确使用它,它应该可以按预期工作,尽管您将自己锁定在 ActiveMQ 5.x 作为您的代理,因为没有其他代理实现此功能。我对它不够熟悉,不知道它是否对 JMS 2.0 有硬性要求。
    • 酷。明白了。谢谢你的解释。很高兴知道 ActiveMQ 5.x 是我可以用来实现我正在寻找的唯一代理。
    • 无论如何,供应商锁定(即使“供应商”是一个开源项目)通常是个坏主意,所以请考虑一下自己。
    猜你喜欢
    • 2014-09-27
    • 2015-02-19
    • 2014-01-29
    • 2011-01-12
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    相关资源
    最近更新 更多