2014-06-23 30 views
0

我有一个服务器包含文件夹明智的日期和每个文件夹进一步包含许多文件(每个大小200kb)包含特定日子的所有日志。我是新来的RabbitMQ,经历的RabbitMQ的文档,同时我发现下面的代码为生产者我可以使用RabbitMQ将数据移至Amazon Kinesis流吗?

参考链接:“Hello World”的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(); 
    } 
} 

在上面的代码我已经添加样本串发布。如上面在问题描述中所述,我必须从具有不同日期戳记目录的服务器读取日志信息因此,我是否需要编写简单的无限循环(因为日志不断更新)并递归读取所有目录和文件,然后对于文件的每一行,我可以编写一条消息,然后将其发布到接收方?

在这种情况下,我们的频道将永远不会关闭,连接将始终保持在RabbitMQ的闲置状态?

RabbitMQ有可能标记读取的文件并且不再读取它,或者我需要以编程方式管理它,如使用一些不同名称重命名文件和文件夹。我在想这可能是因为我们的程序在某些电源故障或某些文件被中断时会终止,然后如何保证记录不会被复制?

任何其他最好的方式来实现这一点对我来说是很大的帮助。提前致谢。

回答

0

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

这将工作在大多数情况。我说的最多的是,因为如果RabbitMQ向消费者发送消息,那么消费者会采取行动(如复制信息或在数据库中放入一个条目),然后在发送给RabbitMQ的之前与RabbitMQ的连接死亡,那么经纪人无法告诉您已经处理了该消息,因此稍后它会再次发送。

+0

谢谢...要“处理文件列表”进行处理,我正在寻找一些现成的解决方案,因为我有父文件夹,并且将包含许多包含文件的文件夹。因为这些文件将继续生成,所以我正在寻找某种解决方案,在那里我可以配置根文件夹名称,并且如果在嵌套文件夹项目中发生任何变化,它会感知并不断将这些信息发送给RabbitMQ? – Sam

+0

我想你将不得不实现这个逻辑来自己监听文件系统的变化。 –

+0

似乎我用java 7功能得到了更好的东西。现在他们在file \目录下提供WatchService,并且我们可以接收文件create \ modify \ delete的事件。这使得我的工作变得简单而且对于监听文件系统更加强大。谢谢 – Sam

相关问题