Web services Tomcat中的有状态进程(守护进程?)?

Web services Tomcat中的有状态进程(守护进程?)?,web-services,tomcat,daemon,Web Services,Tomcat,Daemon,我不太确定该问什么问题,因为我不知道词汇 如果TomcatServlet(以及任何相关的服务器)是无状态的,并且能够快速响应请求,并且状态存储在数据库中,那么它们就可以很好地工作。如果我有长时间运行的操作,那么我可能希望在后台运行其他服务,并让Tomcat处理程序与之通信。有没有办法在与Tomcat相同的JVM中运行一个长期运行的Java应用程序,并通过“常规”Tomcat servlet与之交互 示例:假设我想在HTTP中提供一个RESTful数字分解服务 下面是一个可能的场景(我希望我的H

我不太确定该问什么问题,因为我不知道词汇

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


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

下面是一个可能的场景(我希望我的HTTP语法正确,我省略了大部分头):

#注释以#、>=请求、<=响应开头
# 
#首先,我们创建一个队列
>POST/factorizer/create队列
>{这里的信息}
POST/factorizer/queue/12345B
> 123
> 456
> 678
> 12345678901234567890123456789
<好的
#让我们看看现状
>GET/factorizer/queue/12345B/status
GET/factorizer/queue/12345B/7
<错误:索引无效
>GET/factorizer/queue/12345B/3
<错误:不完整
>GET/factorizer/queue/12345B/0
< 123=3*41
#等一会儿
>GET/factorizer/queue/12345B/status
GET/factorizer/queue/12345B/3
< 12345678901234567890123456789=3*3*3*7*13*31*37*211*241*2161*3607*3803*2906161
我可以考虑如何编写servlet来处理查询,但如何在同一JVM中实现守护进程/独立运行的服务呢


edit:在上面的示例中,我希望有一个后台应用程序,该应用程序可以与工作队列一起自动运行,以计算素数,并且有一个Java接口,支持Tomcat servlet可以用来向web公开服务的操作。这样,我就不必担心我的后台应用程序中的web界面或HTTP,也不必担心我的servlet中的多线程问题或主因子分解。

如果你不一定需要在同一个JVM中(也就是说,如果你不需要直接访问对象的性能)您可以编写另一个Tomcat应用程序,并让您的其他应用程序通过HTTP与它进行本地主机通信。实际上,您将编写一个碰巧在同一台机器上运行的web服务。(我不知道多个Tomcat应用程序如何才能看到彼此。这是Enterprise Java Beans解决的问题,但这对您来说可能太重了。)

如果只有一个Tomcat应用程序需要这样做,那么创建一个工作线程,并将其放在应用程序上下文中,所有请求都可以与之通信

关于您的具体问题,看起来您在O'Reilly的“RESTfulWeb服务”一书中描述了异步作业模式。这使用“202已接受”状态代码表示处理未完成。请参阅本书第8章中的“异步操作”


“应用程序上下文”?有这方面的教程吗?我对工作线程非常熟悉,知道如何处理大多数多线程/并发方面。getServletContext()返回所有请求看到的ServletContext(或“应用程序范围”)。ServletContext.setAttribute(字符串名称、对象值)和ServletContext.getAttribute(字符串名称)允许您在其中放置任何需要的内容。关于这一点,Java服务器页面教程可能是最有说服力的。这听起来正是我想要的。谢谢所有servlet都在同一个web应用程序中吗?是的。(只是好奇:如果我说不,会有什么变化,但它们都是同一JVM中的Tomcat servlet?)如果我没记错的话,同一JVM中的Tomcat应用程序是相互隔离的。而不是Tomcat,您需要像JBoss这样的做企业Java bean的东西。或者,您可以将许多servlet放入单个Tomcat应用程序中,它们可以相互看到。
# 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