Кнопка onClick Вызов метода Java до определенного результата - PullRequest
0 голосов
/ 21 июля 2011

Я совершенно новичок в среде Spring (и в большинстве случаев в веб-разработке), но я пытаюсь подключить тяжелый бэкэнд-код Java к новому проекту Spring и JSP.handleRequest() моего контроллера запускает долго работающий рабочий поток, прежде чем он возвращает мой объект request.jsp ModelAndView.После этого я хотел бы иметь возможность по-прежнему взаимодействовать с этим контроллером из моей формы JSP, чтобы иметь возможность вызывать isThreadDone() в контроллере при каждом нажатии кнопки в форме.Основываясь на трех разных результатах, я перенаправляю соответственно.Возможно ли это с моим текущим подходом?Кажется, это нарушает некоторые подходы Spring MVC, но я не могу придумать хороший способ сделать это, чтобы обернуть голову.Если что-то здесь далеко, прошу прощения за мое невежество.Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 22 июля 2011

Посмотрите на аннотацию Spring @Async. Если вы аннотируете компонент Service-layer этой аннотацией, он затем запускается в своем собственном потоке, позволяя потоку 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 с каким-то идентификатором. Затем потоки будут обновлять отдельные переключатели, по одному для каждого запроса.

1 голос
/ 21 июля 2011

Ну, все возможно, верно?Исходя из того, что вы предоставили, вы можете просто сохранить ссылку на поток - может быть, в HttpSession - чтобы при поступлении нового запроса от нажатия кнопки вы могли запросить его и вернуть соответствующий ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...