Hi!
I need to store data which is altered/touched within a transaction. At the end of that transaction (leaving my first SLSB) I need to create a report and send it to a JMS Queue.
So ThreadLocal is problematic in managed environments, Context is not transaction based so I searched and find TransactionLocal!
But how to use it right.
I have a EJB3 SLSessionBean DataCollectorHelperBean which should collect and store the data. This is used by all session beans which starts a transaction (first layer in our BL).
All data is collected in a UCData object which I want to store in a TransactionLocal.
Complicated? So here is the flow:
- Web calls BL Bean A
- Bean A registers some data in the DataCollectorHelperBean
- other beans register status informations using the DataCollectorHelperBean
- before returning the call from Bean A (ending the transaction) I want to get the UCData object from the DataCollectorHelperBean and pass it to a JMS module.
OK now the Question:
What is the best /working design for it?
A: Using a TransactionLocal in the Stateless Session Bean:
@Stateless(name = "UseCaseDataCollector")
public class UseCaseDataCollectorBean implements UseCaseDataCollector {
private static final TransactionLocal singleton = new TransactionLocal();
public void registerStuff(Object x){
UCData myData = singleton.get();
myData.addData(x);
}
}
@Stateless(name = "UseCaseDataCollector")
public class UseCaseDataCollectorBean implements UseCaseDataCollector {
public void registerStuff(Object x){
MySimpleSingleton.getInstance().registerStuff(x);
}
}
public class MySimpleSingleton {
private static final TransactionLocal singleton = new TransactionLocal();
private static final MySimpleSingleton INSTANCE = new MySimpleSingleton ();
public void registerStuff(Object x){
UCData myData = singleton.get();
myData.addData(x);
}
....
}