問題タブ [spring-async]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Spring MVC で JUnit を使用して ASync メソッドをテストする
非同期メソッドをテストする必要があるシナリオがあります。XMLベースの構成があり、以下のようになります
以下のようにコントローラーの元の Async メソッド
そして、私のテストケースは以下のようになります。
このテストを実行すると、async が true と予想されるが false として開始されたため、例外が発生します。
この問題を解決するにはどうすればよいですか。私は何かが足りない..?
java - @Async with JavaMelody @MonitoredWithSpring が機能しない
コードの非同期実行に問題があります。メソッドstartConversion()は非同期で呼び出す必要があります。呼び出しは AOP プロキシを経由します。
分離されたものはすべて正常に動作します。@Async アノテーションと @MonitoredWithSpring アノテーションを組み合わせると問題が発生します
javamelody は最初の xml の webxml で定義されています - OK
Spring非同期サポートはxmlで定義されています-OK
@MonitoredWithSpring がなくても、コードは適切に機能します。 しかし、この Bean を監視する必要があります。
サンプルコード:
実装クラス
- L1 が存在する場合、コードはメソッド startConversion() を同期的に呼び出します。
- L1 がなければすべて正常に動作し、メソッド startConversion() は新しいスレッドで非同期的に呼び出されます
スタックトレースでは、非同期ポイントカットも作成しないでください。@Async アノテーションは、postProcessor によって処理されることはありません。@Transactional が機能し、トランザクションが作成されます。初期化でエラーなし
春の構成
手伝って頂けますか?いくつかの提案?
私はアイデアがありません。
java - @Async メソッドを使用した JUnit ロールバック トランザクション
を使用して統合テストを作成していSpringJUnit4ClassRunner
ます。私は基本クラスを持っています:
次に、それを拡張し、mockMvc を使用してテストを作成します。
フローの最後に、エンティティが DB に保存されます。ただし、ここでの要件は、非同期で実行する必要があるということです。したがって、このメソッドが呼び出されると考えてください。
次にHistoryWriter
呼び出されます:
このすべての問題は、テストが完了した後、History
オブジェクトが DB に残されることです。最終的にすべての変更をロールバックするには、テスト トランザクションを作成する必要があります。
今、私がこれまでに試したこと:
@Async
注釈を削除します。明らかに、これは解決策にはなりませんが、それなしでロールバックが実行されることを確認するために行われました。確かにそうです。@Async
アノテーションをHistoryWriter.saveHistory()
メソッドに移動して、 で 1 か所にまとめ@Transactional
ます。この記事https://dzone.com/articles/spring-async-and-transactionは、この方法で動作することを示唆していますが、私にとっては、テスト後にロールバックは行われません。- これら 2 つの注釈の場所を入れ替えます。それは望ましい結果も与えません。
非同期メソッドで行われた DB 変更のロールバックを強制する方法を知っている人はいますか?
補足:
トランザクション構成:
<tx:annotation-driven proxy-target-class="true" transaction- manager="jpaTransactionManager"/>
非同期構成:
<task:executor id="executorWithPoolSizeRange" pool-size="50-75" queue-capacity="1000" />
<task:annotation-driven executor="executorWithPoolSizeRange" scheduler="taskScheduler"/>
java - @Asyncでトランザクション例外をキャッチする方法は?
でトランザクション メソッドを記述する場合、例外@Async
をキャッチすることはできません。@Transactional
のようObjectOptimisticLockingFailureException
に、たとえばトランザクションのコミット中にメソッド自体の外でスローされるためです。
例:
次のように、一般@Async
的に例外をキャッチできることを知っています。
ただし、指定された例外が .xml 内で発生した場合にのみ、別の方法で処理することをお勧めしますUpdateService
。
質問: どうすれば の中でキャッチできますかUpdateService
?
唯一のチャンスは、@Service
をラップしUpdateService
てtry-catch
ブロックを持つ追加を作成することですか? それとももっとうまくやれるでしょうか?
spring - エンティティを非同期に保存するときに永続化されない
次のコードがあります。
コントローラ:
EventNotifier:
イベントコンシューマー:
メソッドsaveMessage
が呼び出されていないことがわかります。サーバーの起動プロセス中に、一度呼び出されるのを見ました。
これがリアクター関連かスプリング関連かはわかりません。
編集:保存プロセスをサービスに移動しましたが、何も変わりませんでした
edit2: サービス アクションを記録して、何が起こっているかを確認しました。
コンソールの出力は次のとおりです。
JPA からのログはありません。
java - @Async with Spring 3.0.6
@Asyncアノテーションを使用して非同期呼び出しを実装しようとしています。明らかにレガシー プロジェクトであるため、Spring バージョンは 3.0.6 であるため、以降の Spring バージョンで導入された新しいインターフェイス ( AsyncConfigurer ) とリスナーはサポートされていません。
現時点では、@Async呼び出しは、電子メールの送信に必要なメソッドで問題なく機能します。呼び出しコードはメソッドを呼び出し、通常の制御を再開するために戻ります。@Async呼び出しは、別のスレッドとして呼び出されます。これはすべて非常に優れており、目的を果たしています。
@Async呼び出しは、アプリケーションで電子メールを送信するために存在するメソッドにあります。ただし、場合によっては、1000 通の電子メールがトリガーされることがあります。これにより、1000程度のスレッドが発生すると思います。これは、非常に多くのライブ スレッドがあるアプリケーションで問題を引き起こさないでしょうか? これらのスレッドは自然に終了しますか? メモリー使用量とヒープ・スペースに関して、JVM で何が起こっていますか?
さらに、そのメソッドを@Asyncとしてマークすることにより、別のメソッドからこのメソッドを呼び出そうとしましたが、スレッドが作成されていないように見え、コントロールは実際にそこで待機してそのメソッドのすべての操作を終了します。なぜそれは異なる振る舞いをするのですか?なぜそれが起こったのか分かりません。
前もって感謝します!