1

我有一个包含文件夹日期明智的服务器,每个文件夹还包含许多文件(每个大小 200kb),其中包含特定日期的所有日志。我是 RabbitMQ 的新手,在浏览 RabbitMQ 的文档时,我在下面找到了 Producer 的代码

参考链接:https ://github.com/rabbitmq/rabbitmq-tutorials/blob/master/java/Send.java

public class Send {

  private final static String QUEUE_NAME = "hello";

  public static void main(String[] argv) throws Exception {

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

    channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    String message = "Hello World!";
    channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
    System.out.println(" [x] Sent '" + message + "'");

    channel.close();
    connection.close();
  }
}

在上面的代码中,我添加了示例字符串“Hello World!” 发布。如上面问题描述中所述,我必须从具有不同日期戳目录的服务器读取日志信息所以我需要编写一个简单的无限循环(因为日志不断更新)并递归读取所有目录和文件然后对于文件的每一行,我可以撰写一条消息,然后将其发布给接收者?

在这种情况下,我们的通道将永远不会关闭并且 Connection 将始终处于运行状态,这是 RabbitMQ 的空闲状态吗?

RabbitMQ 是否可以标记已读取的文件并且不再读取它,或者我需要以编程方式管理它,例如用一些不同的名称重命名文件和文件夹。我在想这可能是我们的程序在我处于任何文件中间时因电源故障或其他原因而终止,然后我如何保证记录不会重复?

任何其他实现这一目标的最佳方法对我来说都会有很大帮助。提前致谢。

4

1 回答 1

0

我会将要处理的文件列表排入 RabbitMQ 队列,然后让一组单独的进程从该队列中提取消息以对数据执行您想要的操作。然后尝试确保以 ack 模式订阅队列,这样 RabbitMQ 只会在您 ack 后从队列中删除消息。使用此设置,您应该防止两次发送相同的信息。

这适用于大多数情况。我说的最多,因为如果 RabbitMQ 向您的消费者发送消息,那么您的消费者会采取行动(例如复制信息,或在数据库中放置条目),然后在您向 RabbitMQ 发送 ack之前与 RabbitMQ 的连接断开,然后代理无法告诉您已经处理了该消息,因此它稍后会再次发送它。

于 2014-06-23T12:03:01.643 回答