2017-01-15 39 views
1

我目前正在研究Java EE 7批處理API應用程序,並且希望我的一個CDI Bean的生命週期與當前作業相關。 其實我想這個bean有一個@JobScoped作用域(但它不存在於API中)。此外,我希望這個bean可以在我的任何職位上注射。Java EE 7批處理API:生成作業範圍CDI Bean

起初,我想創建我自己的@JobScoped作用域,使用JobScopedContext等等。但後來我發現Batch API擁有每個bean唯一的作業ID的JobContext bean。

所以我想知道我是否可以用這個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; 
    } 
} 

然後我會在這個bean的生產者將返回關聯到當前任務的JobScopedBean(感謝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