2

我不确定在这里问什么问题,因为我不知道词汇......

Tomcat servlet(以及与此相关的任何服务器)如​​果它们是无状态的并且可以快速响应请求并将状态存储在数据库中,那么它们可以很好地工作。似乎如果我有长时间运行的操作,那么也许我想在后台运行一些其他服务,并让 Tomcat 处理程序与之通信。有没有办法在与 Tomcat 相同的 JVM 中运行长时间运行的 Java 应用程序并通过“常规”Tomcat servlet 与之交互?


示例:假设我想在 HTTP 中提供 RESTful 数字分解服务。

这是一个可能的情况(我希望我的 HTTP 语法正确,我省略了大部分标头):

# comments start with #, > = request, < = response
# 
# first we create a queue
> POST /factorizer/create-queue
> {information here}
< queue=12345B
# then we post some numbers to it
> POST /factorizer/queue/12345B
> 123
> 456
> 678
> 12345678901234567890123456789
< OK
# let's look at the status
> GET /factorizer/queue/12345B/status
< requested=4
< processed=3
# query
> GET /factorizer/queue/12345B/7
< Error: invalid index
> GET /factorizer/queue/12345B/3
< Error: not complete
> GET /factorizer/queue/12345B/0
< 123=3*41
# wait a while
> GET /factorizer/queue/12345B/status
< requested=4
< processed=4
> GET /factorizer/queue/12345B/3
< 12345678901234567890123456789=3*3*3*7*13*31*37*211*241*2161*3607*3803*2906161

我可以考虑如何编写 servlet 来处理查询,但是我怎么能在同一个 JVM 中实现一个守护进程/独立运行的服务呢?

编辑:在上面的例子中,我想做的是让后台应用程序自动运行,使用工作队列,分解素数,并有一个 Java 接口,支持 Tomcat servlet 可以用来公开为网络服务。然后我不必担心后台应用程序中的 Web 界面或 HTTP,也不必担心 servlet 中的多线程问题或素数分解。

4

1 回答 1

1

如果您不是绝对需要在同一个 JVM 中(也就是说,如果您不需要直接访问对象的性能),您可以编写另一个 Tomcat 应用程序并让您的其他应用程序通过 HTTP 到 localhost 与其通信。实际上,您将编写一个恰好在同一台机器上运行的 Web 服务。(我不知道多个 Tomcat 应用程序如何才能看到彼此。这是 Enterprise Java Beans 解决的问题,但对于您来说,这可能是一个过于重量级的解决方案。)

如果您只有一个 Tomcat 应用程序需要执行此操作,请创建一个工作线程并将其放在所有请求都可以与之通信的应用程序上下文中。

关于您的具体问题,您似乎在 O'Reilly “Restful Web Services”一书中描述了类似异步作业模式的内容。这使用“202 Accepted”状态代码来指示处理未完成。请参阅本书第 8 章中的“异步操作”。

http://www.amazon.com/RESTful-Web-Services-Leonard-Richardson/dp/0596529260/ref=sr_1_1?ie=UTF8&s=books&qid=1255555328&sr=8-1

于 2009-10-14T21:23:14.343 回答