我有一个基于Java类的Web服务。在被调用操作的Java方法中返回确认消息后,是否可以运行代码。
为了更好地理解,这是工作流程:
线程不起作用,因为线程需要在返回方法之前终止。
是否有人知道如何实施此方案或替代方案?
提前致谢。
答案 0 :(得分:4)
您需要使用Threads,因为您将程序流分成两部分;返回路径和处理路径分开并相互并行。
如果您需要通过返回方法确认方法开始发送,那么为什么您的服务提供方法看起来不像这样简单?
public Acknowledgement someService() {
new Thread(new SomeServiceRunnable()).start();
return new Acknowledgement();
}
服务将启动,然后方法将返回(从而通知进程已启动),同时处理继续,直到线程结束...
我在这里错过了一些关于你需要达到的目标吗?
希望这有帮助。
编辑:
似乎已经设计了一些答案来解决我没有看到作为问题的一部分呈现的问题。以下是我在做出答案时所做的一些假设,这些假设让所有阅读这个答案的人都可能更好地了解它何时可能不适用于他们的特定情况:
这适用于您只想承认服务在概念上已经开始执行的情况。确认可以不提供有关此执行的任何部分或其初始化的成功的信息,只是它在概念上已经开始,也就是说在某个时刻将调用Associated Runnables run()。
当然如果您希望执行启动并且调用者返回,那么确认的重要性必然会受到在返回之前等待执行的任务的确切数量的限制,此处无需等待并且确认会立即返回,因此无法提供额外信息。
答案 1 :(得分:2)
如何向客户端调用回调方法。 查看工作流程
答案 2 :(得分:1)
线程不起作用,因为之前需要终止线程 方法的回归。
错误。线程共享变量,因此可以在线程之间共享数据而无需从线程返回。举个例子:
调用我的网络服务的特定操作(方法)
为此
生成新线程发送了一个已经开始处理的确认(这是一个返回值)
不,不要通过返回值来做。新线程向您想要的任何类发送消息(调用方法,更改变量......)。有了它,你可以向你想要的任何线程发出你想要的任何信号。只要注意比赛条件,并在需要时使用“synchronized”关键字!
继续处理
新线程继续处理,主要线程也是如此。
答案 3 :(得分:1)
Thread t = new Thread(){
public void run(){
//task to complete after sending acknowledge
}
};
t.start();
//prepare acknowledgement code and return;
return new ResponseEntity<>(HttpStatus.OK);
run()方法中的任务即使返回也将继续运行。
答案 4 :(得分:0)
也许您正在寻找异步Web服务调用:
http://today.java.net/pub/a/today/2006/09/19/asynchronous-jax-ws-web-services.html
答案 5 :(得分:0)
问题的答案是创建一个帖子:
public boolean beginWorkAndSendAck(){
Thread t = new Thread(){
public void run(){
//Do something here
}
}
t.start();
return true;
}
线程将在'main'线程消失后继续。您可能会提到的问题是,如果Web服务在发送确认后关闭了该进程。线程应继续运行,因为java不会关闭其进程,除非所有线程都已完成。
如果它不起作用,那么Web服务可能正在做一些伏都教 - 关闭java进程或者某些东西。我建议用java创建一个新进程,这里:http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html需要一个单独的应用程序来执行你需要的工作。