Sto pianificando di utilizzare EJBContext
per passare alcune proprietà dal livello applicazione (in particolare, un bean basato sui messaggi) a un callback del ciclo di vita della persistenza che non può essere immesso direttamente o passato parametri (listener di sessione in EclipseLink, callback del ciclo di vita dell'entità, ecc. .), e quella richiamata sta ottenendo il EJBContext
tramite JNDI.Utilizzo di EJBContext getContextData: è sicuro?
Questo sembra funzionare ma ci sono dei trucchi nascosti, come la sicurezza dei thread o la durata degli oggetti che mi manca? (Si assuma il valore della proprietà di essere passato è immutabile come String o Long.)
Esempio codice del bean
@MessageDriven
public class MDB implements MessageListener {
private @Resource MessageDrivenContext context;
public void onMessage(Message m) {
context.getContextData().put("property", "value");
}
}
Poi il callback che consuma l'EJBContext
public void callback() {
InitialContext ic = new InitialContext();
EJBContext context = (EJBContext) ic.lookup("java:comp/EJBContext");
String value = (String) context.getContextData().get("property");
}
Quello che mi chiedo è, posso essere sicuro che il contenuto della mappa contextData
sia visibile solo al richiamo/thread corrente? In altre parole, se due thread eseguono il metodo callback
contemporaneamente ed entrambi cercano uno EJBContext
da JNDI, in realtà ottengono diversi contenuti della mappa contextData
?
E, come funziona davvero - lo EJBContext
restituito dalla ricerca JNDI è davvero un oggetto wrapper attorno a una struttura di tipo ThreadLocal
alla fine?
Buon consiglio. Lo schema che sto usando per 'EJBContext' è quasi identico - iniettando con' @ Resource' in un posto, mettendo gli oggetti nella mappa, e poi cercando in JNDI da qualche altra parte. Quindi la domanda è se l'oggetto 'EJBContext' è anche indipendente dal thread come il 'TransactionSynchronizationRegistry' – wrschneider
TransactionSynchronizationRegistry ha un limite: ha sempre bisogno di una transazione, ma in alcuni casi è necessario propagare le informazioni senza una transazione – obe6