前提・実現したいこと
Springフレームワークを使って、JavaのThreadクラスを使った並列処理を書いており、その中でセッションスコープに格納されている値を取得したいです。
発生している問題・エラーメッセージ
Exception in thread "Thread-6" java.lang.IllegalStateException: No thread-bound request found というエラーメッセージが出力され、調べたりしたのですが解決に至りませんでした。
該当のソースコード
サービスクラス
java
1@Service 2public class SendMailService extends Thread{ 3 public void run() { 4 Integer userId = (Integer)session.getAttribute("userId"); 5 List<Order> order = orderService.getLatestOrderList(userId); 6 SimpleMailMessage msg = new SimpleMailMessage(); 7 //以下処理が続きますが、ここでは割愛します 8 } 9}
コントローラクラス
Java
1@Controller 2public String order(@Validated OrderForm form, BindingResult result, Model model) { 3 4 //ここより上はその他の処理を記述しているので割愛します 5 sendMailService.start(); 6 return "redirect:/orderFinished"; 7}
補足情報(FW/ツールのバージョンなど)
mainのクラスでThreadクラスのstartメソッドを使って呼び出すと、sessionスコープの値を取得する処理の部分で止まり、前述のメッセージが出力されます。
並列処理についての学習を始めたばかりなので、まだ理解が浅いと思われますが、よろしくお願いします。
回答に書くほどの自信がなかったのでこちらに記載します。
最近はbootばかり触っているのでわからないですが、
https://www.codeflow.site/ja/article/spring__spring-request-scope-error-no-thread-bound-request-found
こちらは試して見られましたか?
あと、「mainのクラスでThreadクラスのstartメソッドを使って呼び出すと」と書かれていることについて、
今の実行の方法はどのように行なっているのでしょうか?
springということですが、サーバーにデプロイしてブラウザからリクエストしているわけではなさそうですよね?
実行方法も記載すると、回答が得られやすくなると思います。
記載いただき、ありがとうございます。
そちらのurlの内容に関しては、プロジェクトにweb.xmlファイルが存在していないため、試せておりません。
実行に関しては、デプロイなどはしておらず、ローカル環境でビルドして実行しております。
startメソッドでの呼び出しに関しては、コードを追記しておきました。
ビルド後に実行するのはJavaアプリケーションでしょうか?
サーバー等にデプロイせずに、コマンドラインからメインを実行しているのですか?
実際の実行手順を記入して頂けると幸いです。
すいません。少し勘違いしていました。実行手順は以下の通りです。
実行手順としては、プロジェクトがspring starterプロジェクトでして、spring boot アプリケーションで実行しております。
ビルドやデプロイはspringで自動でやってくれています。
やはりそうでしたか。
実際に実行手順としては以下となっていると思いますが、合っておりますでしょうか?
・実行の構成→Javaアプリケーションでspringbootのメインクラス(Application何とかだったような)を指定。
・実行→springbootがサーバーのデプロイから起動まで行ってくれる。
・ブラウザ等でlocalhost:8080にアクセス(おそらくtomcat使用していると思うので)
ブラウザからサーバーにアクセスしているのでしょうか?
そうですね
今記述してくださった手順で、ブラウザからlocalhost:8080にアクセスしています。
回答ありがとうございます。
回答ありがとうございます。
適宜質問は修正していただくと回答が得られやすいと思います。
SendMailServiceクラスでThreadを継承(おそらくjava.jang.Threadだと思います)していますが、SpringBootでマルチスレッド処理を行う際は@Asyncなどのアノテーションを使用するのが一般的だと思います。
こちらを使用しなかった理由としてはなんでしょうか?
SpringBootが用意しているもの以外で処理を行おうとすると、SpringBootの管理外になったりなどの不具合が発生する可能性があります。
もしかしたら、それが原因かもしれないですね。
@Asyncというアノテーションの存在を今初めて知りました。
こちらはマルチスレッド処理を行う際に使う、JavaのThreadと似た役割を持つものと考えてよろしいのでしょうか?
すみません。コメント気づきませんでした。
直接の解決策ではありませんが、回答に記載します。
回答1件
あなたの回答
tips
プレビュー