2017-11-03 7 views
2

Grails 2.5.6で作業しています。Grailsスレッドから要求/セッションにアクセスする際にスレッドバインドされたリクエストが見つかりません

私は、これまでにシリーズで実行されていたタスクのリストを持っており、セッション上にある「lang」属性を参照する必要がありました。

コントローラからは、実行を高速化するために、タスクごとに1つ、スレッドを作成するクラスを呼び出します。私はスレッドを追加した後、このエラーコードがセッションにアクセスしようとしたときに表示されるように開始しました:

No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the o 
riginally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outs 
ide of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request. 

私がリクエストにアクセスできるようにするために作成するスレッドで設定する必要があります何かがあると信じて/セッションが見つかりましたが、ドキュメントは見つかりませんでした。

セッションにアクセスする方法は、次のとおりです。これは、スレッドを追加する前に、[OK]を働いた

RequestContextHolder.currentRequestAttributes().session.lang 

新しいスレッドでこのコード行を処理するために必要なことは何ですか?

私は古典的なThread.start/treads * .join()とgrails.async.Promises(http://docs.grails.org/2.5.6/guide/async.html)を使用して、スレッドを作成する2つの方法を試しました。両方私は同じエラーメッセージが表示されます。

+0

https://stackoverflow.com/questions/43250539/grails-no-thread-bound-request-found以下のように、おそらくparamsやproperties.collect {it}を複製する必要がありますので、新しいリストとして取得し、新しいフラットマップに要素を格納してから、このプロセスを経て送信してください。レイジーな方法は時々噛むことができます - もしsession.langだけがそれをつかんでmap.something = params.langやsession.langにするのはなぜですか? – Vahid

答えて

0

我々は彼らを通過したときに、コントローラからスレッドrun()メソッドに渡すのparamsオブジェクト、パラメータ、リクエストとレスポンスのような オブジェクトが長いの参照を持っていない間、私も同じ問題を経験していますスレッド、私たちは次のように私がやったことを別の変数にそれを保存する必要があるために、

def paramsData = params // you can declare other objects like request and eesponse 

は、今すぐあなたのスレッドに変数paramsDataを渡すことができます。あなたのweb.xmlにRequestContextのリスナーを追加し、次のようにアプリをリセットしてみてください

<web-app> .... <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener> .... </web-app> 
+0

問題はリクエストを使用するクラスが直接スレッドではなく、しかし、クラスで使用されています。スレッドからフォームが呼び出されます。私が見る唯一の選択肢は、セッションを通過するすべてのメソッドを変更することです。これは私が本当に好きではないソリューションです。 IMOスレッドにリクエストを実際にバインドする方法はあるはずですが、Grailsのドキュメントには書かれておらず、Springのドキュメントでは見つけられません。 –

+0

web.xmlにrequestContext Listerを追加しようとしましたか? –

+0

私も多くの解決策を試しましたが、何も私のために働いていませんでしたが、やっと私は上記のアプローチを行いました。問題は、Threadクラスなどのリクエストオブジェクトの外部の範囲を公開する必要があることです。 –

関連する問題