2010-08-11 101 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

相关问题