我不确定在这里要问什么问题,因为我不知道词汇......
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中实现守护进程/独立运行的服务呢?
编辑在上面的例子中,我想要做的是拥有一个自主运行的后台应用程序,带有工作队列,对素数进行分析,并且有一个支持Tomcat servlet可用于将服务公开给Web的操作。然后我不必担心我的后台应用程序中的Web界面或HTTP,我不必担心多线程问题或我的servlet中的素数因子化。
答案 0 :(得分:1)
如果您不是绝对需要在同一个JVM中(也就是说,如果您不需要直接访问对象的性能),您可以编写另一个Tomcat应用程序并让其他应用程序通过HTTP与之通信到localhost。实际上,您将编写恰好在同一台计算机上运行的Web服务。 (我不知道多个Tomcat应用程序如何能够看到对方。这是Enterprise Java Bean解决的问题,但这可能对您来说太重要了。)
如果您只有一个需要执行此操作的Tomcat应用程序,请创建一个工作线程并将其放在应用程序上下文中,其中所有请求都可以与之通信。
关于您的具体问题,看起来您正在描述O'Reilly“Restful Web Services”一书中的异步作业模式。这使用“202 Accepted”状态代码来指示处理未完成。请参阅本书第8章中的“异步操作”。