2010-08-11 54 views
2

Couchdb擅長存儲和提供數據,但我在處理後端處理時遇到了一些麻煩。例如,GWT支持同步和異步回調,它允許您在服務器上運行任意Java代碼。有沒有辦法用couchdb做這樣的事情?如何從couchdb運行服務器端代碼?

例如,我想在用戶點擊一個web應用程序按鈕時生成並提供PDF文件。理想情況下,工作流程會是這個樣子:

  • 用戶輸入一些數據
  • 用戶點擊一個按鈕生成
  • 的調用到服務器的,並且PDF生成服務器端。服務器代碼可以用任何語言編寫,但最好是Java。
  • 當PDF生成完成時,會提示用戶下載並保存文檔。

有沒有辦法做到這一點開箱即用,或者是一些額外的第三方軟件需要在Web客戶端和後端數據處理代碼之間進行通信?

編輯:看起來我解釋我的問題做得很差。我感興趣的是從Couchdb提供的servlet實質上提供類似於您可以從戰爭文件的邊網頁提供Java servlet的方式。我以GWT爲例,因爲它支持開發servlet和客戶端代碼,並將所有內容編譯成單個war文件。我會對這樣的事情非常感興趣,因爲它可以通過Couchdb複製輕鬆部署功能完備的網站。

然而,通過它的外觀,我的問題的答案是否定的,你不能從couchdb提供servlet。數據庫設置爲CRUD風格的交互,任何servlet風格的組件都需要單獨提供,或者通過輪詢數據庫來進行更改並相應地執行。

回答

3

這裏是我建議的一般工作流程:

  1. 當用戶點擊生成:連載他們已經輸入的數據和其他相關元數據(例如優先級,用戶名)並郵寄到CouchDB的作爲新文件。跟蹤文檔的_id。
  2. 編碼後臺進程,用於監視需要處理的文檔的couchdb。
  3. 當它看到這樣的文檔時,讓它生成PDF並將其附加到同一張沙發文檔。
  4. 現在回到客戶端。您可以使用ajax輪詢來重複獲取沙發文檔並測試是否有附件。如果是這樣,那麼你可以向用戶顯示下載鏈接。

當然,魔鬼在細節...

兩種方式的後臺進程(ES)可以識別未決文件:

  • 使用_changes API監視與_rev新文檔以「1-」開頭
  • 在僅返回沒有「_attachments」屬性的文檔的couchdb視圖上發出請求。當沒有要處理的文件時,它將不會返回任何內容。
    • 可選:如果您有多個PDF製作進程並行處理隊列,您需要使用像{"being-processed":true}這樣的屬性更新沙發文檔,並將其過濾掉。

一些其他的想法:

  • 我不推薦使用的CouchDB的外部API用於該用途的情況下,因爲它(基本上)意味着CouchDB的和您的PDF生成代碼必須在同一機。但這是要注意的事情。
  • 我不知道關於GWT的一些事情,但似乎沒有必要完成您的目標。當然,CouchDB可以提供你想要的任何靜態文件(js或其他)作爲附件或文件系統中的文檔。您甚至可以將eval()放入沙發文檔中的JSON屬性。所以你可以使用GWT來進行ajax調用或者其他什麼,但是GWT可以從couchdb完全解耦。可能會更簡單。
1

GWT有兩個部分。一個是GWT編譯器轉換爲Java的客戶端,另一個是如果您執行任何RPC的Servlet。通常,您可以在瀏覽器上運行您的客戶端代碼,然後當您進行任何RPC調用時,您可以聯繫Java Servlet Engine(例如Tomcat或Jetty或...),後者又會調用您的持久層。

GWT確實有能力通過HTTP執行JSON請求,巧合的是,這是CouchDB使用的。所以理論上它應該是可能的。 (我不知道有沒有人嘗試過)。會有幾個問題。
CouchDB需要提供具有已編譯的GWT客戶端代碼的.js文件。
我在你的案例中看到的主要問題是,couchDB需要生成你的PDF文件,而couchDB只是一個存儲引擎,通常不做任何處理。我想你可以擴展它,如果你對Erlang編程語言有好處的話。

+0

我真的沒有興趣在couchdb上運行GWT,我真的有興趣複製RPC調用的功能。有沒有對於couchdb的Java Servlet Engine的等價物? – TwentyMiles 2010-08-11 22:26:03

+0

@TwentyMiles我試圖解釋的是,你可以調用CouchDB,但那隻會是數據訪問(CRUD)。爲了能夠進行任何處理,您需要有一個Servlet Engine,它可以從CounchDB獲取數據,然後對其進行按摩以生成PDF。我提出的另一點是,你可以在CouchDB前添加一個Erlang模塊,並調用它來完成你的處理(當然這不是小事) – 2010-08-11 23:14:55

相關問題