我目前正在研究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
。
你能告訴我,如果我對這個解決方案有誤嗎?
它看起來對我來說正確,但也許我失去了一些東西?
可能有更好的方法來處理這個問題嗎?
謝謝。
謝謝@ k5_。這是我錯過的觀點,對我感到羞恥!當然,問題出在@ApplicationScoped bean上(實際上即使在@ApplicationScoped bean中注入'JobContext'也會導致問題,因爲注入的bean將依賴於@ApplicationScoped bean)。感謝您在我的解決方案中指出問題,我知道有什麼不好,但我無法弄清楚。 – Rouliboy
我會嘗試自定義CDI範圍,這似乎是實現這一目標的唯一方法。 – Rouliboy