2013-08-17 11 views
5

Chciałbym zapytać, jakie jest najlepsze podejście do prowadzenia długiego procesu przy użyciu Spring. Mam aplikację internetową i kiedy klient wykonuje żądanie, uruchamia kontroler Spring. Ten kontroler otrzyma niektóre parametry z żądania, a następnie uruchomi zapytanie i pobierze rekordy z bazy danych.Jakie jest najlepsze podejście do prowadzenia długiego procesu przy użyciu Spring

Rekordy z DB są wysokie, muszę zrobić logikę porównywania, która może zająć dużo czasu, więc muszę uruchomić ją oddzielnie. Po wykonaniu tego procesu należy zapisać ostateczne wyniki w pliku excel i wysłać go pocztą.

+1

Dokumentacja wiosenna zawiera cały rozdział poświęcony asynchronicznej realizacji zadania: http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/htmlsingle/#scheduling –

Odpowiedz

4

Możesz użyć adnotacji @Async, aby natychmiast wrócić.

Fisrt, napisz klasę @Service, aby przetworzyć pracę DB i Excel.

@Service 
public class AccountService { 
    @Async 
    public void executeTask(){ 
    // DB and Excel job 
    } 
} 

Następnie w metodzie kontrolera wywołać zadanie

@Controller 
public class taskController{ 
    @RequestMapping(value = "as") 
    @ResponseBody 
    public ResultInfo async() throws Exception{ 
     accountService.executeTask(); 
     return new ResultInfo(0, "success", null); 
    } 
} 

Na końcu dodać do aplikacji context.xml (wiosna config file)

<task:annotation-driven executor="taskExecutor"/> 
<task:executor id="taskExecutor" pool-size="10"/> 

Nadzieja to pomoże .

+1

Zalecamy również przejrzenie Schemat "wiosennej partii" do przetwarzania wsadowego. Może skrócić czas wykonania o połowę. – yname

+0

Dzięki @Larrry za odpowiedź. Używam jednak wiosny 2.5.Czy istnieje jakiś równoważny mechanizm w 2.5, aby wywoływać asynchroniczne połączenia? Jeśli nie, to czy istnieje alternatywny sposób wykonywania asynchronicznych wywołań serwisowych? Proszę, zasugeruj mi! –

+0

@ Użytkownik 518469 - W jaki sposób Spring Batch może skrócić czas wykonania, jeśli jest używany w porównaniu do wywołania asynchronicznego. –

Powiązane problemy