如何从couchdb运行服务器端代码?

时间:2010-08-11 21:12:55

标签: couchdb soa

Couchdb非常擅长存储和提供数据,但是我很难掌握如何使用它进行后端处理。例如,GWT具有对同步和异步回调的开箱即用支持,允许您在服务器上运行任意Java代码。有没有办法用couchdb做这样的事情?

例如,当用户点击Web应用程序按钮时,我想生成并提供PDF文件。理想情况下,工作流程看起来像这样:

  • 用户输入一些数据
  • 用户点击生成按钮
  • 呼叫服务器,PDF生成服务器端。服务器代码可以用任何语言编写,但最好是Java。
  • PDF生成完成后,系统会提示用户下载并保存文档。

有没有办法在开箱即用的couchdb中执行此操作,或者是在Web客户端和后端数据处理代码之间进行通信所需的其他第三方软件?

编辑:看起来我在解释我的问题方面做得很差。我感兴趣的主要是从Couchdb提供servlet,就像你可以从war文件中的side web页面提供Java servlet一样。我使用GWT作为示例,因为它支持将servlet和客户端代码一起开发并将所有内容编译成单个war文件。我对这样的事情非常感兴趣,因为它可以通过Couchdb复制轻松部署功能齐全的网站。

但从它的外观来看,我的问题的答案是否定的,你不能从couchdb提供servlet。数据库是为CRUD样式交互设置的,任何servlet样式组件都需要单独提供,或者通过轮询数据库中的更改并相应地执行来完成。

2 个答案:

答案 0 :(得分:3)

以下是我建议的一般工作流程:

  1. 当用户点击生成时:序列化他们输入的数据和任何其他相关元数据(例如优先级,用户名),并将其作为新文档发布到couchdb。跟踪文档的_id。
  2. 编写一个后台进程,监视couchdb以查找需要处理的文档。
  3. 当它看到这样的文档时,让它生成PDF并将其附加到同一个沙发文档。
  4. 现在回到客户端。您可以使用ajax轮询重复获取沙发文档并测试是否有附件。如果是,则可以向用户显示下载链接。
  5. 当然魔鬼在细节......

    您的后台进程可以通过两种方式识别待处理文档:

    • 使用_changes API来监控_rev以“1 - ”
    • 开头的新文档
    • 在couchdb视图上发出请求,该视图仅返回没有“_attachments”属性的文档。当没有要处理的文件时,它将不返回任何内容。
      • 可选:如果您有多个PDF制作流程并行处理队列,您将需要使用{"being-processed":true}等属性更新沙发文档,并将其过滤掉视图。

    其他一些想法:

    • 我不建议将couchdb externals API用于此用例,因为它(基本上)表示couchdb,并且您的PDF生成代码必须位于同一台计算机上。但这是值得注意的事情。
    • 我对GWT一无所知,但似乎没有必要实现你的目标。当然,CouchDB可以将您想要的任何静态文件(js或其他)作为数据库中的文档附件或文件系统的附件提供。您甚至可以将eval()放入沙发文档中的JSON属性。所以你可以使用GWT进行ajax调用或者其他什么,但GWT可以完全与couchdb分离。这样可能会更简单。

答案 1 :(得分:1)

GWT有两个部分。一个是GWT编译器转换为Java的客户端,另一个是执行任何RPC的Servlet。通常,您将在浏览器上运行客户端代码,然后在进行任何RPC调用时,您将联系Java Servlet引擎(例如Tomcat或Jetty或......),后者又会调用您的持久层。

GWT确实能够通过HTTP执行JSON请求,巧合的是,这就是CouchDB使用的。所以在理论上它应该是可能的。 (我不知道是否有人尝试过)。会有几个问题 CouchDB需要提供具有已编译的GWT客户端代码的.js文件 我在你的案例中看到的主要问题是couchDB需要生成你的PDF文件,而couchDB只是一个存储引擎,通常不会进行任何处理。如果你对Erlang编程语言有任何好处,我想你可以扩展它。