2016-02-02 73 views
2

我正在構建一個功能,允許客戶抓取他們的網站,獲取鏈接並下載html文件。在下載的文件上完成字數統計,並顯示翻譯網頁的成本估算。Coldfusion的任務隊列

我想確保一次只有一個估算正在運行。因此,如果有兩個客戶端試圖同時爲他們的網站估算,則只有一個客戶端估算過程會運行,而其他客戶端需要等待。

爲此,我嘗試使用向我建議的RabbitMQ。我正在使用ColdFusion框架/ 1。我使用了rabbitmq網站中給出的Java示例。我可以發送消息,但我無法使用消息。以下函數創建一個對象,並同時覆蓋一個函數。這在Coldfusion中是不可能的。我試圖在懶散和谷歌團體獲得幫助,但我沒有得到明確的答案。

final Consumer consumer = new DefaultConsumer(channel) { 
    @Override 
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { 
    String message = new String(body, "UTF-8"); 

    System.out.println(" [x] Received '" + message + "'"); 
    try { 
     doWork(message); 
    } finally { 
     System.out.println(" [x] Done"); 
    } 
    } 
}; 
channel.basicConsume(TASK_QUEUE_NAME, true, consumer); 

我不太熟悉Java。我盡我所能在Coldfusion中轉換上述步驟。我沒有成功。我嘗試了以下方法,我甚至不知道它是否是正確的方法。

consumer = javaloader.create("com.rabbitmq.client.DefaultConsumer").init(channel); 
envelope = createObject("java","com.rabbitmq.client.Envelope"); 
properties = createObject("java","com.rabbitmq.client.BasicProperties"); 
consumerTag = toString(consumer.getConsumerTag()); 
body = javaCast("byte[]",[]); 
      consumer.handleDelivery(consumerTag,envelope,properties,body); 

The error I got when I run the above code

我已經浪費的方式更多的時間比我需要在此。我需要雙向溝通。我希望估算過程能夠不斷通知用戶每一個步驟,例如抓取開始,抓取完成等等。

我只想知道是否值得嘗試使rabbitmq工作,或者它甚至是正確的工具?我可以簡單地在數據庫中創建一個表格,並在其中放置一個標誌來排列過程。哪個是實現功能的最佳方式?有沒有其他有用的工具排隊在Coldfusion任務?

P.S.我也嘗試了以下解決方案: https://github.com/lmajano/messaging-polyglot

+0

*這在coldfusion中是不可能的*從技術上講,它是可能的,但只有[interfaces](http://docs.oracle.com/javase/tutorial/java/concepts/interface.html),CF10 +。不幸的是,DefaultConsumer是一個具體的類,所以在這種情況下,你是正確的。 CF中的特定代碼無法輕鬆模擬。 *我沒有成功*如何?你說沒有人工作,但不真正解釋*如何*。你是否收到錯誤,什麼都沒發生(API說handleDelivery是沒有操作的)。關於另一個項目的同樣問題。 – Leigh

+0

@Leigh我對沒有通過足夠道歉。我已經添加了上面的錯誤消息屏幕截圖。我對java的知識非常有限,所以很難理解大多數代碼。在rabbitmq的google組中,我被建議「簡單地對DefaultConsumer進行子類化或從零開始實施Consumer。」我更加困惑於答案。 – Soobax

+0

是的。這在java中很有意義。這就像在CFC中重寫父組件函數一樣。不幸的是,當你從* CF覆蓋*的東西是一個java類的方法時,它會涉及更多 - 並且根本不可能使用具體的類。關於錯誤,乍一看它看起來是正確的,即參數,類型,順序的數量。所以沒有運行它,我不知道它爲什麼抱怨。另一個項目呢?看起來它有一個cfml示例。也就是說,確認方法可能是一個很好的開始,也就是說,如果它不是正確的工具,就沒有必要去追求lib。 – Leigh

回答

2

我不知道有一個最好的方法來實現你想要的結果。有一點是肯定的:單靠RabbitMQ不是解決問題的辦法。

兔子被設計成高速信息經紀人。它不擔心郵件的內容 - 它更關心路由和傳遞。你所描述的問題是消息處理。事實上,有兩個問題:

  1. 如何確保只有一個爬行任務對於一個給定網站
  2. 如何給狀態反饋給用戶操作

爲了解決第一個問題,您需要某種類型的任務預處理器,它會在設置重複的爬網任務之前檢查正在運行的任務。您可以利用數據庫或其他類型的分佈式緩存(例如memcached)。

第二個問題有點複雜,有很多方法可以實現它。最有可能的是,當正在更新正在運行的任務的狀態時,您將發佈事件,然後將會到達用戶。

這兩種解決方案都與RabbitMQ的工作原理或其在系統中的作用無關。

+0

對於第一個問題,我決定使用數據庫併爲isRunning設置一個標誌。對於第二個問題,我將使用coldfusion通知用戶每一步開始和完成。我試圖設置rabbitmq來創建工作隊列,這樣我就不必查詢數據庫來檢查每一步。 – Soobax