【问题标题】:Button onClick Call Java Method Until Certain Result按钮 onClick 调用 Java 方法,直到确定结果
【发布时间】:2023-03-22 20:35:01
【问题描述】:

我对 Spring 框架(以及大多数 Web 开发)完全陌生,但我正在尝试将一些繁重的 Java 后端代码连接到一个新的 Spring 和 JSP 项目。我的控制器的 handleRequest() 在返回我的 request.jsp ModelAndView 对象之前启动了一个长时间运行的工作线程。之后,我希望仍然能够从我的 JSP 表单中与此控制器交互,以便能够在每次单击表单中的按钮时调用控制器中的isThreadDone()。根据三个不同的结果,我然后相应地重定向。我目前的方法可以做到这一点吗?这似乎违反了一些 Spring MVC 方法,但我想不出一个好的方法来解决这个问题。如果这里有什么问题,请原谅我的无知。提前致谢。

【问题讨论】:

    标签: java model-view-controller spring jsp controller


    【解决方案1】:

    看看 Spring @Async 注解。如果您使用该注解对服务层 bean 进行注解,那么它会在自己的线程中运行,从而允许您的 Controller 线程在调用 Service 方法后不间断地运行。让该线程通过synchronous 方法在服务的类级别设置一个值,您的控制器代码可以随意检查这些切换以查看该过程是否完成。比如:

    @Service
    public myServiceClass {
       private boolean isDone = false;
       public synchronized void setIsDone(boolean isDone) {
          isDone = isDone;
       }
       public synchronized boolean getIsDone() {
          return isDone;
       }
       @Async
       public void myServiceMethod() {
          ...long-running stuff...
          setIsDone(true);
       }
    

    在控制器中:

    @Controller
    class MyController {
       @RequestMapping
       public kickOffHandlerMethod() {
          myServiceClass.myServiceMethod();
          }
       }
       @RequestMapping
       public dependentHandlerMethod() {
          if(myServiceClass.getIsDone()) {
             ...do something...
          }
       }
    }
    

    如果多个请求可能会启动该过程,那么我会将每个 isDone 切换保存在带有某种标识符的 HashMap 中。然后线程会更新单独的切换,每个请求一个。

    【讨论】:

      【解决方案2】:

      嗯,一切皆有可能,对吧?根据您提供的内容,您可以只保留对线程的引用(可能在 HttpSession 中),这样当单击按钮发出新请求时,您可以对其进行查询并返回适当的响应。

      【讨论】:

      • 我想过,但这似乎是一种解决方法,而不是解决方案。如果那是最好的方式,那么这就是最好的方式。感谢您的帮助!
      • @Matt:你担心什么?如果你更清楚地定义你的场景,也许会出现更合适的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多