2017-01-15 29 views
1

現在、Java EE 7バッチAPIアプリケーションで作業中です。私のCDI Beanのライフサイクルが現在のジョブに関連していることを望みます。 実際には、このBeanに@JobScopedのスコープがあります(ただし、APIには存在しません)。また、私は、この豆を私の職業クラスのいずれかに注射可能にしたいと思います。まずJava EE 7バッチAPI:ジョブスコープのCDI Beanを生成

は、私がJobScopedContextなどで、自分の@JobScopedスコープを作成したいしかし、私は、バッチAPIは、Beanごとに一意のジョブIDを持つJobContext豆を持っているという考えに付属しています。

このJobContextを使用してジョブスコープBeanのライフサイクルを管理できるかどうかは疑問です。

@Alternative 
public class JobScopedBean 
{ 
    private String m_value; 

    public String getValue() 
    { 
     return m_value; 
    } 

    public void setValue(String p_value) 
    { 
     m_value = p_value; 
    } 
} 

は、その後、私は現在のジョブに関連したJobScopedBeanを返します。このBeanのプロデューサーを持っているでしょうに(感謝:

例えば、私は仕事がスコープになりたい私の豆を持っているでしょうジョブごとに一意であるJobContext

public class ProducerJobScopedBean 
{ 

    @Inject 
    private JobContext m_jobContext;// this is the JobContext of Batch API 

    @Inject 
    private JobScopedManager m_manager; 

    @Produces 
    public JobScopedBean getObjectJobScoped() throws Exception 
    { 
     if (null == m_jobContext) 
    { 
     throw new Exception("Job Context not active"); 
     } 

     return m_manager.get(m_jobContext.getExecutionId()); 
    } 
} 

そして、私のJobScopedBeanのマップを保持している管理者:

​​

もちろん、私は各ジョブの終了時に(JobListenerとCDI Eventを通して)JobScopedBeanの破壊を管理します。

私はこの解決策に間違っていると教えてもらえますか?

私には正しいようですが、何か不足している可能性がありますか?

これを処理するより良い方法がありますか?

ありがとうございました。

答えて

1

したがって、作成時にジョブに基づいて@DependentスコープBeanを作成することになります。仕事よりも寿命の短い豆の場合はうまく動作するので、標準スコープでは@Dependent(@ Request/@ Session/@ Converstionは問題ありませんが、ここでは適用されません)。

他のスコープ、特に@ ApplicationScoped/@ Singletonに問題が発生します。 JobScopedBeanをそのいずれかに注入した場合。初めて必要なときにアクティブなJobを持っているのは幸運かもしれませんが、Beanは常に最初の仕事に付けられます(@DependentスコープBeanは疑似スコープではないので、コンテキストインスタンスを取得するためにプロキシを作成しません)

このようなものが必要な場合は、カスタムスコープを作成します。

+0

ありがとう@ k5_。これは、私が逃したポイント、私には恥です!もちろん、問題は@ApplicationScoped Beanです(実際には、@ApplicationScoped Beanの 'JobContext'も注入されると、注入されたBeanは@ApplicationScoped Beanに依存するため問題が発生します)。解決策の問題を指摘してくれてありがとう、私は何かが悪いことを知っていましたが、私はそれを理解できませんでした。 – Rouliboy

+0

これを達成する唯一の方法と思われるカスタムCDIスコープで試してみます。 – Rouliboy

関連する問題