2014-06-23 47 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

相關問題