当前位置: 首页 > 知识库问答 >
问题:

使用jmsTemboard(Spring JMS)重复调度ActiveMQ的消息传递

耿联
2023-03-14

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

我想安排重复我的信息。我的意思是,无论控制器(如下所示)中的this linejsmClient.send(标识符);正在发送什么消息,我都想继续发送,比如说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?我想知道我需要在下面的代码中做些什么更改,以便我可以执行类似于消息的操作。setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT,REPEAT) 。在Spring文档中,我找不到很多关于计划重复的有用信息。

我的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);



        }

基于我的研究:

在这个stackoverflow线程中,activemq包不支持JMS 2.0,所以我应该切换到artemis吗?但是,我在jmsTemplate方面提出的问题仍然在我的脑海中。请告诉我在这种情况下最好的做法是什么。谢谢


共有1个答案

吕英才
2023-03-14

被耽搁的路

延迟了

正如您所注意到的,ActiveMQ 5。x不支持JMS 2.0,所以如果您想要JMS 2.0支持,您需要切换到ActiveMQ Artemis。然而,ActiveMQ Artemis不支持延迟

 类似资料:
  • 我使用的是ActiveMQ Artemis 2.10,在我的用例中,我希望避免队列中有重复的消息,所以在向队列发送消息之前,我设置了属性message.hdr_duplicate_detection_id: 但问题是,即使在此消息被消耗之后,如果我试图发送另一个具有相同hashVal值的消息,新消息也会被拒绝。即使队列中没有其他具有相同hashVal值的消息。 是否有一种方法可以将重复检测设置为仅

  • 问题内容: 有没有一种方法可以抑制ActiveMQ服务器上定义的队列上的重复消息? 我尝试手动定义JMSMessageID((message.setJMSMessageID(“ uniqueid”)),但是服务器忽略此修改并使用内置的JMSMessageID传递消息。 根据规范,我没有找到有关如何删除邮件重复数据的参考。 在HornetQ中,要解决此问题,我们需要在消息定义中声明HQ特定的属性or

  • 首先,对不起我的英语!我有一个使用JMS和ActiveMQ的项目 producer.produceMessage()可以同时在项目的许多地方调用。我需要检查重复的ID和不调用消费者的ID,如果这个ID包含在队列中。 我阅读https://activemq.apache.org/artemis/docs/1.0.0/duplicate-detection.html并执行以下操作 呼叫制片人: 和获取

  • 我通过SpringJMS在我的项目中使用MQ,作为代理我使用ActiveMQ。我需要基于消息设置过期,所以我尝试使用,但没有成功。所有到达ActiveMQ的消息都具有expiration=0。 有人成功地使用Spring为每个消息设置过期吗?

  • spring XML中的jmsTemplate定义: 有人对问题有什么建议吗/关于如何实现延迟消息传递的其他想法?谢了!

  • 线程名称:线程组1-1示例开始时间:2019-09-11 18:52:42英国夏令时加载时间:0连接时间:0延迟时间:0大小以字节为单位:0发送字节:0头大小以字节为单位:0主体大小以字节为单位:0示例计数:1错误计数:1数据类型(“text”“bin”“”):文本响应代码:000响应消息:javax.naming.nameNotFoundException:DynamicQueue/MyQueu