2014-09-12 169 views
3

我尝试构建持续消息队列,每个消息都有一些延迟。在Java代码它看起来像这样:RabbitMQ中的消息丢失

ConnectionFactory factory = new ConnectionFactory(); 
    factory.setHost("localhost"); 
    Connection connection = factory.newConnection(); 
    Channel channel = connection.createChannel(); 

    channel.exchangeDeclare("WorkExchange", "direct"); 
    channel.queueDeclare("WorkQueue", true, false, false, null); 
    channel.queueBind("WorkQueue", "WorkExchange", ""); 

    Map<String, Object> args = new HashMap<>(); 
    args.put("x-dead-letter-exchange", "WorkExchange"); 

    channel.exchangeDeclare("RetryExchange", "direct"); 
    channel.queueDeclare("RetryQueue", true, false, false, args); 
    channel.queueBind("RetryQueue", "RetryExchange", ""); 

    channel.confirmSelect(); 
    BasicProperties properties = new BasicProperties(); 
    properties.setDeliveryMode(2); 
    properties.setExpiration("120000"); 
    channel.basicPublish("RetryExchange", "", properties, "Hello world!".getBytes()); 
    channel.waitForConfirmsOrDie(); 
    connection.close(); 

但是,我有一些持久性的问题。当我停止服务器时,等待一段时间并重新启动它,必须移动到WorkQueue的消息才会消失。我做错了什么?或者它是由设计?

回答

6

但是,我有一些持久性问题。当我停止服务器时,请等待一段时间并重新启动, 必须移至WorkQueue的消息才会消失。我做错了什么?或者它是由设计?

您应该使用MessageProperties来使您的消息持久。

channel.basicPublish("", "task_queue", 
     MessageProperties.PERSISTENT_TEXT_PLAIN, 
     message.getBytes()); 

您当前的代码`channel.queueDeclare( “RetryQueue” ,假的,假的,参数);将使队列持久化,但不是消息。

更多这里RabbitMQ Doc