Spring AMQP RabbitMq中的定时/延迟消息传递

Spring AMQP RabbitMq中的定时/延迟消息传递,rabbitmq,spring-amqp,Rabbitmq,Spring Amqp,在Spring AMQP/Rabbit MQ中,我正在努力寻找计划/延迟消息的方法。经过大量搜索后,我仍然无法在Spring AMQP中做到这一点。有人能告诉我如何在Spring AMQP中执行x延迟吗。如果消费者端出现异常,我想延迟一条消息。RabbitMQ说要添加x-delay并安装我已经完成的插件,但消息仍然会立即发送,没有任何延迟 我从消息中得到了这个 收到首先,您似乎没有遵守文章: 要使用延迟消息交换,只需声明一个提供“x-Delayed-Message”交换类型的交换,如下所示: M

在Spring AMQP/Rabbit MQ中,我正在努力寻找计划/延迟消息的方法。
经过大量搜索后,我仍然无法在Spring AMQP中做到这一点。有人能告诉我如何在Spring AMQP中执行x延迟吗。
如果消费者端出现异常,我想延迟一条消息。RabbitMQ说要添加x-delay并安装我已经完成的插件,但消息仍然会立即发送,没有任何延迟



我从消息中得到了这个

收到首先,您似乎没有遵守文章:

要使用延迟消息交换,只需声明一个提供“x-Delayed-Message”交换类型的交换,如下所示:

Map args=newhashmap();
参数put(“x延迟类型”、“直接”);
channel.ExchangeClare(“我的交换”、“x-delayed-message”、真、假、args);
我想说,同样可以通过Spring AMQP实现:

@Bean
CustomExchange delayExchange() {
    Map<String, Object> args = new HashMap<String, Object>();
    args.put("x-delayed-type", "direct");
    return new CustomExchange("my-exchange", "x-delayed-message", true, false, args);
}
@Bean
CustomExchange延迟交换(){
Map args=new HashMap();
参数put(“x延迟类型”、“直接”);
返回新的CustomExchange(“我的exchange”、“x-delayed-message”、真、假、args);
}
另一个问题是,您真的应该将消息发布到
延迟交换
,而不是任何其他站点。再说一遍:那是在那份文件里提到的

更新

自Spring AMQP 1.6以来,延迟消息作为开箱即用功能得到支持:
.

不确定是谁建议您使用
jms
标记来标记此问题,但这是不正确的。这只是关于拉比的。是的,
springamqp
。正在修复…是的,我没有在Exchange中获得此x延迟消息类型,因为它不在Spring AMQP中。我经历了很多次,但都没有弄清楚这是一种交换类型。不管怎样,我现在可以做到。@Artem我应该在哪里寻找spring-rabbit-1.6.xsd不知道你的问题是什么,但是
spring-rabbit-1.6.xsd
完全是
spring-rabbit-1.6.0.RELEASE.jar
org/springframework/amqp/rabbit/config/spring-rabbit-1.6.xsd
的一部分。如果您在配置中使用无版本XSD声明,您已经可以在Exchange定义上声明
delayed
属性。@ArtemBilan我的配置xml“”中有这个属性,但它不起作用@lalit:请像这样使用classpath:org/springframework/amqp/rabbit/config/spring-rabbit-1.6.xsd
public void onMessage(Message message, Channel channel) throws Exception {

    System.out.println("Received <" + message+ ">" +rabbitTemplate);

    if(i==1){
        AMQP.BasicProperties.Builder props = new AMQP.BasicProperties.Builder();
        Map<String,Object> headers = message.getMessageProperties().getHeaders();
        headers.put("x-delay", 15000);
        props.headers(headers);
        i++;
        channel.basicPublish(message.getMessageProperties().getReceivedExchange(), message.getMessageProperties().getReceivedRoutingKey(),
                props.build(), message.getBody());
    }
    }
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-delayed-type", "direct");
channel.exchangeDeclare("my-exchange", "x-delayed-message", true, false, args);
@Bean
CustomExchange delayExchange() {
    Map<String, Object> args = new HashMap<String, Object>();
    args.put("x-delayed-type", "direct");
    return new CustomExchange("my-exchange", "x-delayed-message", true, false, args);
}