是否有将上下文数据传递给@Asynchronous ejb调用的干净方法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否有将上下文数据传递给@Asynchronous ejb调用的干净方法?相关的知识,希望对你有一定的参考价值。

在wildfly中,我异步执行无状态ejb方法(它与@Asynchronous注释映射。)在调用方法中,我在本地线程中有一些上下文信息。将此数据传递给异步方法的最佳方法是什么?我不想向异步方法签名添加其他参数。

答案

基本上,您只有两个选择:

  1. 作为参数传递值
  2. 在全球范围内存储该价值。就像静态变量一样。

第一种选择更清洁,更容易。不要使用第二个:)

另一答案

使用一些丑陋的管道可以按以下方式解决此问题(wildfly 8.x.x):

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);
}

基本上,您需要创建自己的Principal类,并在其实例的其他字段中设置上下文数据。

另一答案

@ vinga您可以在此代码中准确地放在哪里吗?我无法理解您的答案。我需要将线程本地租户名称传递到异步池线程中。这将是很大的帮助。我没有足够的信誉,所以无法评论您的答案,所以将其发布为答案。请问一下。

以上是关于是否有将上下文数据传递给@Asynchronous ejb调用的干净方法?的主要内容,如果未能解决你的问题,请参考以下文章

在将数据传递给序列化器 django api 时添加额外的上下文

iOS Swift:查询完成后将数据传递给其他 VC 的最佳方式

是否可以将数据传递给css文件?

是否可以将数据传递给 Oracle 触发器?

Express - 将JavaScript数据传递给没有视图引擎的客户端

将动态数据传递给 Vue 参数/路由