我可以使用RabbitMQ将数据移动到Amazon Kinesis流吗?

时间:2014-06-23 06:51:13

标签: java rabbitmq amazon-kinesis

我有一个包含文件夹日期的服务器,每个文件夹还包含许多文件(每个大小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!”发表。如上面在问题描述中所述,我必须从具有不同日期戳目录的服务器读取日志信息所以我需要编写一个简单的无限循环(因为日志不断更新)并递归读取所有目录和文件然后对于文件的每一行,我可以撰写一条消息,然后将其发布到接收方?

在这种情况下,我们的频道永远不会关闭,而且连接总是在向上,因为它是RabbitMQ的空闲状态吗?

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

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

1 个答案:

答案 0 :(得分:0)

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

这适用于大多数情况。我说得最多,因为如果RabbitMQ向您的消费者发送消息,那么您的消费者会采取行动(比如复制信息,或在数据库上放置一个条目),然后与之前与RabbitMQ的连接终止将ack发送到RabbitMQ,然后经纪人无法告知您已经处理了该消息,因此它将在以后再次发送。