Couchdb 非常擅长存储和提供数据,但我在掌握如何使用它进行后端处理方面遇到了一些困难。例如,GWT 对同步和异步回调提供开箱即用的支持,允许您在服务器上运行任意 Java 代码。有没有办法用 couchdb 做这样的事情?
例如,当用户单击网络应用程序的按钮时,我想生成并提供 PDF 文件。理想情况下,工作流程应如下所示:
- 用户输入一些数据
- 用户点击生成按钮
- 调用服务器,并在服务器端生成 PDF。服务器代码可以用任何语言编写,但最好是 Java。
- PDF 生成完成后,系统会提示用户下载并保存文档。
有没有办法使用开箱即用的 couchdb 来实现此目的,或者是否需要一些额外的第三方软件来在 Web 客户端和后端数据处理代码之间进行通信?
编辑:看起来我在解释我的问题时做得很差。我感兴趣的本质上是从 Couchdb 提供 servlet,类似于从 war 文件提供 Java servlet 和网页。我使用 GWT 作为示例,因为它支持一起开发 servlet 和客户端代码并将所有内容编译到单个 war 文件中。我对这样的事情非常感兴趣,因为它可以通过 Couchdb 复制轻松部署功能齐全的网站。
但是,从表面上看,我的问题的答案是否定的,您无法从 couchdb 提供 servlet。数据库是为 CRUD 样式交互设置的,任何 servlet 样式组件都需要单独提供服务,或者通过轮询数据库以了解更改并采取相应操作来完成。
最佳答案
以下是我建议的一般工作流程:
- 当用户单击“生成”时:序列化他们输入的数据和任何其他相关元数据(例如优先级、用户名)并将其作为新文档发布到 couchdb。跟踪文档的 _id。
- 编写一个后台进程来监视 couchdb 是否有需要处理的文档。
- 当它看到这样的文档时,让它生成 PDF 并将其附加到同一个沙发文档中。
- 现在回到客户端。您可以使用 ajax 轮询来重复获取沙发文档并测试它是否有附件。如果是,那么您可以向用户显示下载链接。
当然,细节决定成败......
后台进程可以通过两种方式识别待处理文档:
- 使用_changes API监视 _rev 以“1-”开头的新文档
- 在 couchdb View 上发出请求,该 View 仅返回没有“_attachments”属性的文档。当没有要处理的文档时,它不会返回任何内容。
- 可选:如果您有多个并行处理队列的 PDF 制作进程,您将需要使用
{"being-processed":true}
等属性更新 couch 文档并过滤这些进程也从视野中出来。
- 可选:如果您有多个并行处理队列的 PDF 制作进程,您将需要使用
其他一些想法:
- 我不建议在此用例中使用 couchdb 外部 API,因为它(基本上)意味着 couchdb 和您的 PDF 生成代码必须位于同一台计算机上。但这是需要注意的事情。
- 我对 GWT 一无所知,但它似乎没有必要实现您的目标。当然,CouchDB 可以提供您想要的任何静态文件(js 或其他),作为数据库中文档的附件或来自文件系统。您甚至可以将 eval() JSON 属性放入 couch 文档中。因此,您可以使用 GWT 进行 ajax 调用或其他任何操作,但 GWT 可以与 couchdb 完全解耦。这样可能会更简单。
关于couchdb - 如何从 couchdb 运行服务器端代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3462893/