簡體   English   中英

在無狀態會話Bean之間傳遞對象

[英]Pass objects between stateless session beans

我有幾個無狀態和單例豆。

@Stateful
@Local(IMyService.class)
@LocalBean
public class MyService implements IMyService {

    private @EJB Singleton1 singleton1;
    private @EJB Singleton2 singleton2;

    public void doSomeStuff() {
        // construct shared object
        singleton1.doOtherStuff();
        singleton2.doOtherStuff();
    }
}

@Singleton
@LocalBean
public class Singleton1 extends MySingleton {
    @Override
    public void doOtherStuff() {
        // use shared object
    }
}

@Singleton
@LocalBean
public class Singleton2 extends MySingleton {
    @Override
    public void doOtherStuff() {
        // use shared object
    }
}

public abstract class MySingleton {
    public abstract void doOtherStuff();
}

現在,我希望在所有這些bean之間共享一個對象,而不必將其作為參數傳遞。

我本可以使用有狀態會話Bean,但是在無狀態Bean中注入有狀態Bean無效。

我沒有將其作為參數傳遞,因為我不想一直將其傳遞給方法,盡管僅在少數情況下才需要使用它。

是否有在客戶端會話中注入對象的方法,以便無論我身在何處都可以讀取它?

您可以將ContextHolder模式與ThreadLocal和Interceptor一起使用。

ThreadLocal —此類允許將變量存儲在線程作用域中。 我無意進入使用ThreadLocal的利弊。 我只是說它非常強大,必須非常小心地使用。

EJB攔截器 —用於攔截對bean實例的業務方法和生命周期事件的調用。

現在讓我們希望在所有這些bean之間共享一個用戶對象,而不必將其作為參數傳遞。

因此,我們的AuditContextHolder將是:

public class AuditContextHolder {
    private static final ThreadLocal<String> AUDIT_CONTEXT = new ThreadLocal<>();

    private AuditContextHolder() {
    }

    public static void put(String  auditUser) {
        AUDIT_CONTEXT.set(auditUser);
    }

    public static String get() {
        return AUDIT_CONTEXT.get();
    }

    public static void cleanup() {
        AUDIT_CONTEXT.remove();
    }
} 

審計攔截器將是這樣的:

public class AuditInterceptor {

    @Resource
    private SessionContext sessionContext;

    @AroundInvoke
    public Object inject(InvocationContext ctx) throws Exception {
        String userName = sessionContext.getCallerPrincipal().toString();
        try {
            AuditContextHolder.put(userName);
            return ctx.proceed();
        } finally {
            // very important
            AuditContextHolder.cleanup();
        }
    }
}

現在,您可以在調用鏈中第一個無狀態會話Bean中使用@Interceptors(AuditInterceptor.class) 在調用鏈中的任何地方,您都可以通過調用AuditContextHolder.get()獲得審核用戶。

參考文獻:

  1. http://www.adam-bien.com/roller/abien/entry/how_to_pass_context_with
  2. https://www.captechconsulting.com/blogs/a-persistence-pattern-using-threadlocal-and-ejb-interceptors

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM