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

时间:2016-05-25 07:53:41

标签: java asynchronous wildfly

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

2 个答案:

答案 0 :(得分:1)

基本上你只有两个选择:

  1. 将值作为参数传递
  2. 在某个全球范围内存储该值。像静态变量一样。
  3. 第一种选择更清洁,更容易。不要使用第二个:)

答案 1 :(得分:0)

有点丑陋的管道,可以解决如下(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类,并在其实例的附加字段中设置上下文数据。