有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

服务在方法返回后运行Java代码?

我有一个基于Java类的web服务。是否可以在被调用操作的Java方法中返回确认消息后运行代码

为了更好地理解,以下是工作流程:

  1. 调用我的web服务的特定操作(方法)
  2. 开始处理
  3. 已发送处理已启动的确认(这是一个返回值)
  4. 继续处理

线程不工作,因为在返回方法之前需要终止线程

有人知道如何实现这个场景或它的替代方案吗

提前谢谢


共 (6) 个答案

  1. # 1 楼答案

    对客户端调用回调方法怎么样。 查看工作流

    1. 调用我的web服务的特定操作(方法)
    2. 开始处理
    3. 在客户端上调用一个方法,发送确认
    4. 继续处理
  2. # 2 楼答案

    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()方法中的任务即使在返回后仍将继续运行

  3. # 4 楼答案

    问题的答案是创建一个线程:

    public boolean beginWorkAndSendAck(){
        Thread t = new Thread(){ 
            public void run(){
                //Do something here
            }
        }
        t.start();
        return true;
    }
    

    “主”线程消失后,线程将继续运行。您可能指的问题是,如果发送ack后web服务关闭了进程。线程应该继续运行,因为除非所有线程都完成,否则java不会关闭其进程

    如果它不起作用,可能是web服务正在做一些巫术——关闭java进程或类似的事情。我建议考虑使用java创建一个新流程,这里:http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html,它需要一个单独的应用程序来执行您需要的工作

  4. # 5 楼答案

    您需要使用线程来实现这一点,因为您正在将程序流分成两部分;返回路径和处理路径彼此分离并并行运行

    如果您需要通过返回方法来发送对方法的确认,那么为什么您的服务提供方法不能看起来像这样简单呢

    public Acknowledgement someService() {
      new Thread(new SomeServiceRunnable()).start();
      return new Acknowledgement();
    }
    

    服务将启动,然后方法将返回(从而通知进程已启动),同时处理将继续,直到线程结束

    我是否遗漏了你需要实现的目标

    希望这有帮助

    编辑:

    似乎有些答案是为了解决问题而设计的,而我并不认为这些问题是问题的一部分。以下是我在回答问题时所做的一些假设,这些假设是为了让阅读此答案的人更好地了解它何时可能不适用于他们的特定情况:

    这种情况下,您只需要确认从概念上讲服务已经开始执行。确认不能提供有关此执行的任何部分或其初始化是否成功的信息,只能提供它已在概念上启动的信息,也就是说,将在某个点调用关联的Runnables run()

    当然,如果您希望执行开始并且调用方返回,那么确认的意义必然会受到返回前等待执行的任务的确切数量的限制,这里没有等待,并且确认会立即返回,因此无法提供额外的信息

  5. # 6 楼答案

    Threads do not works, since the threads need to be terminated before the return of the method.

    错。线程共享变量,因此可以在线程之间共享数据,而无需从线程返回。以你为例:

    Call a specific operation (method) of my web service

    为此生成新线程

    Sent an ack that the processing has been started (this is done be a return value)

    不,不要按返回值执行。新线程向您想要的任何类发送消息(调用方法、更改变量…)。有了它,你可以将任何你想要的信号发送到任何你想要的线程。只需注意赛车情况,并在需要时使用“synchronized”关键字

    Continue processing

    新线程将继续处理,主线程也是如此