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

如何从couchdb运行服务器端代码?,couchdb,soa,Couchdb,Soa,Couchdb在存储和服务数据方面非常出色,但我在掌握如何使用它进行后端处理方面遇到了一些困难。例如,GWT对同步和异步回调具有现成的支持,这允许您在服务器上运行任意Java代码。有没有办法用couchdb做这样的事情 例如,我想在用户单击web应用程序的按钮时生成并提供PDF文件。理想情况下,工作流应如下所示: 用户输入一些数据 用户单击“生成”按钮 调用服务器,并在服务器端生成PDF。服务器代码可以用任何语言编写,但最好是Java PDF生成完成后,系统会提示用户下载并保存文档 有没有现

Couchdb在存储和服务数据方面非常出色,但我在掌握如何使用它进行后端处理方面遇到了一些困难。例如,GWT对同步和异步回调具有现成的支持,这允许您在服务器上运行任意Java代码。有没有办法用couchdb做这样的事情

例如,我想在用户单击web应用程序的按钮时生成并提供PDF文件。理想情况下,工作流应如下所示:

  • 用户输入一些数据
  • 用户单击“生成”按钮
  • 调用服务器,并在服务器端生成PDF。服务器代码可以用任何语言编写,但最好是Java
  • PDF生成完成后,系统会提示用户下载并保存文档
有没有现成的couchdb可以做到这一点,或者需要一些附加的第三方软件来在web客户端和后端数据处理代码之间进行通信

编辑:看来我在解释我的问题时做得很差。我感兴趣的是本质上从Couchdb提供servlet服务,类似于从war文件提供Java servlet的方式。我以GWT为例,因为它支持一起开发servlet和客户端代码,并将所有内容编译成单个war文件。我对这样的东西很感兴趣,因为通过Couchdb复制,部署功能齐全的网站将变得轻而易举


然而,从外观上看,我的问题的答案是否定的,您不能从couchdb提供servlet。数据库是为CRUD风格的交互而设置的,任何servlet风格的组件都需要单独提供服务,或者通过轮询db以获得更改并采取相应的行动来完成。一个是GWT编译器转换为Java的客户端,另一个是Servlet(如果您执行任何RPC)。通常,您会在浏览器上运行客户机代码,然后在进行任何RPC调用时,您会联系Javaservlet引擎(如Tomcat或Jetty或…),后者反过来会调用您的持久层

GWT确实能够通过HTTP执行JSON请求,巧合的是,CouchDB就是这样使用的。所以理论上应该是可能的。(我不知道是否有人试过)。会有几个问题。
CouchDB需要提供包含已编译GWT客户端代码的.js文件。

我在您的案例中看到的主要问题是couchDB需要生成您的PDF文件,而couchDB只是一个存储引擎,通常不进行任何处理。我想,如果您对Erlang编程语言有任何了解,您可以扩展它。

以下是我建议的通用工作流:

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

    您的后台流程可以通过两种方式识别待定文档:

    • 使用以“1-”开头的修订版监视新文档
    • 在couchdb视图上发出请求,该视图仅返回没有“\u attachments”属性的文档。当没有要处理的文档时,它将不返回任何内容。
      • 可选:如果您有多个并行处理队列的PDF制作过程,则需要使用
        {“正在处理”:true}
        之类的属性更新coach doc,并将其从视图中过滤掉
    其他一些想法:

    • 我不建议在这个用例中使用couchdb externals API,因为它(基本上)意味着couchdb和生成PDF的代码必须在同一台机器上。但这是需要注意的
    • 我对GWT一无所知,但似乎没有必要实现您的目标。当然,CouchDB可以提供任何您想要的静态文件(js或其他)作为db中文档的附件或文件系统的附件。您甚至可以评估放入coach文档中的JSON()属性。因此,您可以使用GWT进行ajax调用或其他任何操作,但GWT可以与couchdb完全解耦。那样可能更简单

    我对在couchdb上运行GWT并不感兴趣,实际上我对复制RPC调用的功能感兴趣。couchdb是否有Java Servlet引擎的等价物?@TwentyMiles我试图解释的是,您可以调用couchdb,但这只能是数据访问(CRUD)。为了能够进行任何处理,您需要有一个Servlet引擎,该引擎从CounchDB获取数据,然后对其进行处理以生成PDF。我提出的另一点是,您可以在CouchDB前面添加一个Erlang模块,并调用它来进行处理(当然,这是非常重要的)