使用jmsTemplate(Spring JMS)重复调度消息以传递ActiveMQ

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

我以下列方式向队列发送消息:

我想安排重复我的消息。我的意思是,无论我在控制器(如下所示)中发送此行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个回答
0
投票

在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功能。

© www.soinside.com 2019 - 2024. All rights reserved.