問題タブ [bean-managed-transactions]
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 - 別々の EJB メソッドでトランザクションを開始/終了する
私は、サードパーティ システムへの顧客のプロビジョニングを担当する典型的なエンタープライズ アプリケーションを開発しました。このシステムには、特定の顧客に対して 1 つのスレッドしか動作できないという制限があります。そのため、現在進行中の customerIds@Singleton
を含む単純なロック メカニズムを追加しました。Set
プロビジョニングの新しいリクエストが来るたびに、最初にこれをチェックしますSet
。cusotomerId が存在する場合は待機し、存在しない場合はそれを に追加してSet
処理に入ります。
最近、このアプリケーションをクラスタにデプロイすることが決定されました。これは、このロック アプローチが有効ではなくなったことを意味します。ロックに DB を使用するソリューションを考え出しました。customerIds を含む単一の列を持つテーブルを作成しました (一意の制約もあります)。新しいプロビジョニング要求が来ると、トランザクションを開始し、customerId で行をロックしようとしますSELECT FOR UPDATE
(customerId がまだ存在しない場合は挿入します)。その後、顧客のプロビジョニングを開始し、終了したらトランザクションをコミットします。コンセプトは機能しますが、トランザクションに問題があります。現在、 と からの customerId の追加と削除を処理するとメソッドを含むクラスCustomerLock
があります。このクラスを、Bean 管理のトランザクションを持つステートレス EJB に変換したいと考えました。add()
remove()
Set
add()
メソッドはトランザクションを開始して行をロックし、remove()
メソッドはトランザクションをコミットして行をロック解除します。しかし、トランザクションの開始と終了は同じ方法で行わなければならないようです。私が説明したアプローチを使用する方法はありますか、またはトランザクションが同じ方法で開始および終了するようにロジックを変更する必要がありますか?
カスタマーロック クラス:
CustomerProvisioner クラスの抜粋:
StandardCustomerProvisioner クラス:
java - WildFly 13 移行 - Bean 管理のトランザクション境界を持つセッションおよびメッセージ駆動型 Bean のみが UserTransaction にアクセスできます
WildFly 13 内の JCA コンポーネントに使用している「XAManager」クラスがあります。
standalone-full.xml では、問題のリソース アダプターは次のように定義されています。
...
....
このクラスは、JCA の ManagedConnection クラスで使用され、getXAResource() メソッドで返されます。
public XAResource getXAResource() は ResourceException をスローします {
}
クラス定義は次のとおりです。
public class LuceneXAManager は XAResource を実装します {
}
私が抱えている問題は、JNDI 経由で UserTransaction を取得しようとすると、Caused by: javax.naming.NameNotFoundException: UserTransaction [Root exception is java.lang.IllegalStateException: WFLYEJB0137: Only session and message-driven beans with bean-managed transaction demarcation are allowed to access UserTransaction]
この問題を克服するために、クラスに@Stateless
andで注釈を付けようと@TransactionManagement(TransactionManagementType.BEAN)
しましたが、役に立ちませんでした。@Inject UserTransaction を介して UserTransaction を注入しようとしましたが、この場合、UserTransaction は null です。
何か案は ?
cdi - TransactionImpleManager.suspend が暗黙的に呼び出される
私はBMTを使って豆を食べています。BMT を使用する別の Bean が最初の Bean に注入されます。最初のメソッドが 2 番目のメソッドを呼び出すと、突然トランザクションが閉じられます。私のコードでは、メソッド呼び出しの前とその内部に正確に絞り込みました。
トレースは次のとおりです。
2018-11-23 12:15:32,275 +0100 [TRACE] [com.arjuna.ats.jta] (デフォルト タスク 18) TransactionImple.getStatus: javax.transaction.Status.STATUS_ACTIVE
2018-11-23 12:15:32,276 +0100 [TRACE] [com.arjuna.ats.jta] (デフォルトのタスク-18) TransactionImpleManager.suspend
2018-11-23 12:15:32,277 +0100 [TRACE] [com.arjuna.ats.jta] (デフォルト タスク 18) TransactionSynchronizationRegistryImple.getTransactionKey
コード例:
JBoss EAP 7.0.9 で発生します。
私はこの星座をたくさんの場所に持っていますが、ここだけ壊れています。基本的なものが欠けていますか?追加の手がかりはどこで探すことができますか?