2011-07-21 13 views
0

私はSpringフレームワーク(そしてほとんどのWeb開発一般)には全く慣れていませんが、いくつかの重いJavaバックエンドコードを新しいSpringおよびJSPプロジェクトに取り込もうとしています。私のコントローラのhandleRequest()は、私のrequest.jsp ModelAndViewオブジェクトを返す前に、長時間実行されているワーカースレッドを開始しています。その後、フォーム内のボタンをクリックするたびにコントローラー内のisThreadDone()を呼び出すことができるように、私のJSPフォームからこのコントローラーと引き続きインターフェースすることができます。 3つの異なる結果に基づいて、私はそれに応じてリダイレクトします。私の現在のアプローチで可能ですか?これはSpring MVCのアプローチのいくつかに違反しているようですが、これを行う良い方法を考えることはできません。ここに何かがあるなら、私の無知を許してください。前もって感謝します。ボタンonClickコールのJavaメソッドを特定の結果まで

答えて

1

Spring @Asyncアノテーションをご覧ください。その注釈を持つサービスレイヤーBeanに注釈を付けると、独自のスレッドで実行され、Serviceメソッドを呼び出した後でControllerスレッドが中断することなく実行されます。そのスレッドは、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... 
     } 
    } 
} 

に複数の要求がプロセスをキックオフする可能性がある場合は、その後、私は、識別子のいくつかの種類にはHashMapの各isDoneトグルを保存します。次に、スレッドは個々のトグルを更新します(要求ごとに1つ)。

1

まあ、何でもできますよね?あなたが提供した内容に基づいて、おそらくHttpSessionのスレッドへの参照を保持することができます。新しいリクエストがボタンをクリックしたときに、それを照会して適切な応答を返すことができます。

+0

私はそれについて考えましたが、解決策ではなく回避策のように思えます。それが最良の方法だとすれば、それが最善の方法です。ご協力いただきありがとうございます! – Matt

+0

@Matt:あなたはそれについて心配していますか?あなたのシナリオを少し明確に定義すれば、より適切な解決策が出るかもしれません。 –

関連する問題