在wildfly中,我異步執行無狀態ejb方法(它使用@Asynchronous註釋映射)。在調用方法中,我在線程局部中有一些上下文信息。將這些數據傳遞給異步方法的最佳方式是什麼?我不想將其他參數添加到異步方法簽名。有沒有乾淨的方式將上下文數據傳遞給@Asynchronous ejb調用?
4
A
回答
0
隨着有點難看管道的就可以解決如下(wildfly 8.xx):
if (SecurityContextAssociation.getSecurityContext()==null)
SecurityContextAssociation.setSecurityContext(new JBossSecurityContext("background-job"));
SecurityContext current = SecurityContextAssociation.getSecurityContext();
final Object cred = current.getUtil().getCredential();
final Subject s = current.getUtil().getSubject();
final Principal up = current.getUtil().getUserPrincipal();
boolean needToUpdatePrincipal=true;
if (up instanceof TenantPrincipal) {
if (t.getTenantName().equals(((TenantPrincipal) up).getAdditonalField())) {
needToUpdatePrincipal=false;
}
}
if (needToUpdatePrincipal) {
TenantPrincipal tp=new TenantPrincipal(up.getName());
tp.setAdditionalField(t.getTenantName());
current.getUtil().createSubjectInfo(
, cred, (Subject) s);
}
基本上你需要創建自己的主體類設置上下文數據在其實例的附加字段中。
1
從本質上講,你只有兩種選擇:
- 傳遞值作爲參數
- 保存在一些全球性的地方該值。像靜態變量一樣。
第一個選項更清潔和更容易。不要使用第二個:)
相關問題
- 1. EJB - 將上下文數據從JSF傳遞到EJB
- 2. 將上下文傳遞給JavaScript回調
- 3. 傳遞參數乾淨
- 4. 有沒有辦法將任務ID傳遞給調用函數?
- 5. 取消@Asynchronous EJB調用
- 6. 將數據庫上下文傳遞給靜態方法
- 7. OpenCover沒有將參數傳遞給NUnit
- 8. 沒有文件類型的乾淨URL
- 9. 有沒有一種乾淨的方式來檢索AWT事件調度線程
- 10. 有沒有更好的方法將「this」對象傳遞給回調函數?
- 11. 有沒有辦法將上下文傳遞到onDrawFrame(GL10 gl)?
- 12. 乾淨的方式從文本文件導入數據?
- 13. 有沒有更好的方式來處理多個參數傳遞給方法
- 14. 將數據傳遞給所有路線?
- 15. 將上下文傳遞給jquery hoverIntent
- 16. 將上下文傳遞給JobService Android JobScheduler
- 17. 將調用的上下文傳遞給「getSystemService」
- 18. 最乾淨的方式添加沒有造型<768px
- 19. 將空上下文傳遞給數據庫幫助程序
- 20. 將數據庫上下文作爲參數傳遞給mvc
- 21. 將上下文傳遞給異步類
- 22. 將上下文傳遞給React Thunk?
- 23. 有沒有辦法看到給模板的上下文數據?
- 24. 有沒有一種乾淨的方式將泛型類的類賦值給變量?
- 25. Matlab有沒有複製傳遞給mex函數的數據?
- 26. 我將參數傳遞給get_tags()的方式有什麼問題?
- 27. Python - 乾淨地傳遞參數
- 28. 將子列表傳遞給函數的有效方式
- 29. 將對象傳遞給AngularJS中的指令時沒有數據
- 30. 將ZMQ上下文傳遞給線程
第一個選項的問題是我沒有一個而是幾十個異步方法,我不想做如此大量的重構。而且我需要傳遞的參數通常不是直接用於這些方法,而是更深層次的調用層次結構。因此,從我真正需要的地方以另一種方式訪問它會更好。單獨的靜態變量不是線程安全的。 – vinga
線程安全取決於您如何使用該變量。你可以有'AtomicReference',你只能在'synchronized'塊中訪問它,你可以在靜態變量中爲你的數據設置線程安全的容器。選項很多。 – Nikem
我所需要的只是確保在訪問它時,這與調用方法中的值完全相同(例如它是請求範圍)。我可以使用例如ThreadLocal,但問題仍然是如何傳播數據? – vinga