3

EclipseLink と JBoss Weld を使用して JavaEE 6 環境を実行しています。EntityManager については、現在 @ConversationScoped スコープを使用しており、JSF インタラクションに対して非常にうまく機能します。

ここで、データの自動チェック (期限のチェックなど) のために @Schedule メソッドを含めたいと考えています。ただし、自動通話が会話を作成していないように見えるため、これが可能かどうかはわかりません。これが現在のアプローチです。

@Stateless
public class Scheduler

  @Inject
  private CampaignService campaignService; 
    // CampaignService is @ApplicationScoped and uses an EntityManager

  @Schedule(second="*/3", ...)
  public void checkDeadlines(){
    campaignService.getAll() // fetches all campaigns from EntityManager
    ...
  }

}

ただし、EntityManager が @ConversationScoped である限り、インジェクションは機能しません。(ContextNotActiveException)

JSFを呼び出す以外に会話を「作成」する可能性はありますか? または、 How to use CDI-@SessionScoped without a http-session のように、カスタムスコープを作成する唯一の可能性はありますか?

4

1 に答える 1

2

スケジューラを使用する場合、最善の解決策は@PersistenceContextEntityManager を取得することです。もう 1 つのオプションは、会話スコープのエンティティ マネージャーを使用せず (これはとにかく悪い習慣と見なす必要があります)、デフォルトのスコープまたはリクエスト スコープのエンティティ マネージャーを使用することです。

会話スコープのエンティティ マネージャーは、初期化の遅延の問題、エンティティの切り離し、メモリ リークを簡単に引き起こす可能性があるため、不適切な方法であると私は言います。

于 2013-07-02T18:10:18.717 に答える