Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 主线程是否可以在RESTfulWebService中结束,而工作线程是否可以继续?_Java_Multithreading_Rest - Fatal编程技术网

Java 主线程是否可以在RESTfulWebService中结束,而工作线程是否可以继续?

Java 主线程是否可以在RESTfulWebService中结束,而工作线程是否可以继续?,java,multithreading,rest,Java,Multithreading,Rest,我有一个JavaRESTfulWebService,它大约每10秒被另一个进程调用一次。如果条件合适,Web服务需要执行一个可能广泛的ETL过程(比如10-20秒)。但是,我们希望立即返回调用应用程序,指示有效负载已成功交付到web服务 所需经费摘要: 验证身份验证和输入参数 如果验证失败,则以XML格式返回错误 启动执行ETL过程的线程。该过程仅在特定条件下进行 返回XML,指示传递的有效负载和传递的输入验证 我已经对其进行了编码,它似乎运行正常。但这似乎不对。我创建的线程可能比主web服

我有一个JavaRESTfulWebService,它大约每10秒被另一个进程调用一次。如果条件合适,Web服务需要执行一个可能广泛的ETL过程(比如10-20秒)。但是,我们希望立即返回调用应用程序,指示有效负载已成功交付到web服务

所需经费摘要:

  • 验证身份验证和输入参数
  • 如果验证失败,则以XML格式返回错误
  • 启动执行ETL过程的线程。该过程仅在特定条件下进行
  • 返回XML,指示传递的有效负载和传递的输入验证
我已经对其进行了编码,它似乎运行正常。但这似乎不对。我创建的线程可能比主web服务线程运行的时间更长


有人想告诉我一个更好的方法吗?

这正是正确的方法。这个解决方案有什么“似乎不正确”

我唯一的建议是,你不应该随意地启动线程。您应该有某种共享ExecutorService来管理这些ETL进程线程。这将使您能够了解已启动和仍在运行的程序,并能够限制/控制后台进程的数量(并可能处理任何恶意执行)

您还可能希望为启动的进程生成某种类型的“jobId”,并将其返回给调用者。然后,您可以向api添加一个调用,客户端可以使用该调用检查作业的状态

…但是,我们希望立即返回调用应用程序 指示有效负载已成功传递到web服务

听起来您希望在验证后直接返回成功/失败消息,如果包含成功请求的响应,则再次返回

虽然没有技术原因说明这不起作用,但在典型的RESTfulWeb服务交换中存在一对一的HTTP调用请求比,这种体系结构可能会通过为一个请求返回两个响应来打破这一比例。这可能会让不是你或你的公司的客户感到困惑

我可能建议实现一个附加的回调服务,该服务可以使用第一个服务请求中返回的票证异步查询。这样做的另一个好处是,当您等待返回事务结果时,不会阻塞服务1


只要负载较低,为事务启动另一个线程就可以了。如果它变得太高,当您无法启动更多线程时,您的请求将开始超时。您可以将提交任务和执行任务的责任分开。您已经关闭了提交部分—您的web服务接收请求并对其进行验证,但是您可以将其保存到外部存储,而不是生成一个线程来立即执行它

然后在cron上运行一个简单的调度任务(Quartz),以拾取新任务并执行它们

这种方法的优点是更强的解耦性和更大的系统灵活性(web服务关闭不会影响任务执行,反之亦然)。con是系统中更多的运动部件(组件)


在任何情况下,您当前的设置都能正常工作,并且您走上了正确的轨道。

谢谢您的建议。我已经在单例中实现了ExecutorService。我还在我的thread类上使用Callable接口,以便跟踪线程的结果,然后引入一些代码来检查失控的线程。