Estoy planeando usar algunas propiedades desde el nivel de aplicación (específicamente, un bean controlado por mensajes) a una devolución de llamada de ciclo de vida de persistencia que no puede ser inyectada directamente o pasar parámetros (escucha de sesión en EclipseLink, devolución de llamada de ciclo de vida de entidad, etc. .), y esa devolución de llamada está obteniendo el EJBContext
a través de JNDI.Usando EJBContext getContextData - ¿esto es seguro?
Esto parece funcionar, pero ¿hay algún truco oculto, como seguridad de hilo o vida útil del objeto que me falta? (Suponga que el valor de la propiedad que se pasa es inmutable como cuerdas o Long.)
código de bean de ejemplo
@MessageDriven
public class MDB implements MessageListener {
private @Resource MessageDrivenContext context;
public void onMessage(Message m) {
context.getContextData().put("property", "value");
}
}
A continuación, la devolución de llamada que consume el EJBContext
public void callback() {
InitialContext ic = new InitialContext();
EJBContext context = (EJBContext) ic.lookup("java:comp/EJBContext");
String value = (String) context.getContextData().get("property");
}
Lo que me pregunto es, ¿Puedo estar seguro de que los contenidos del mapa contextData
solo son visibles para la invocación/cadena actual? En otras palabras, si dos subprocesos ejecutan el método callback
de forma simultánea, y ambos buscan un EJBContext
de JNDI, en realidad están obteniendo contenidos de mapa contextData
diferentes.
Y, ¿cómo funciona eso realmente - es el EJBContext
devuelto de la búsqueda JNDI realmente un objeto envoltorio alrededor de una estructura similar a ThreadLocal
en última instancia?
Buena sugerencia. El patrón que estoy usando para 'EJBContext' es casi idéntico, inyectando' @ Resource' en un lugar, colocando objetos en el mapa y luego buscando en JNDI en otro lugar. Así que la pregunta es si el objeto 'EJBContext' también es independiente del hilo como' TransactionSynchronizationRegistry' – wrschneider
TransactionSynchronizationRegistry tiene un límite: siempre necesita una transacción, pero en algunos casos es necesario para propagar información sin una transacción – obe6