我有一个应用程序通过smack(基于事件的java库)处理IQ节。我们现在从vanilla Tomcat切换到glassfish 3.1,我想切换到ejb 3.1。
@Stateless
public class DispatchIQService {
private static Logger log = Logger.getLogger(DispatchIQService.class);
@PersistenceContext(unitName="hq")
private EntityManager em;
....
public void process(XMPPConnection connection, IQ rawRequest) {
log.debug("Raw Provider IQ: " + rawRequest.toXML());
RawResponse answer = null;
try{
StateWrapper state = new StateWrapper(em, connection, rawRequest);
// parsing raw xml from request
rawRequest.parse();
// processing action
answer = rawRequest.dispatchAction(state);
由于基于事件的库,我为每个请求获取了正确的对象。 StateWrapper是一个旧的构造,用于通过消息处理传递em,请求和连接。我想通过ejbs和依赖注入尽快删除它。
使用rawRequest.dispatchAction(state)我将控件传递给请求对象以查找Facade Service并从业务逻辑开始。
@Override
public RawResponse dispatchAction(StateWrapper state) {
ModelFacade modelFacade = Core.lookup(ModelFacade.class);
return modelFacade.listModels(state, childElement.getIds());
}
Core.lookup只是进行jndi查找以获取所需的Bean。在这个bean我可以注入em。
@Stateless
public class ModelFacade {
@PersistenceContext(unitName="hq")
private EntityManager em;
...
public RsModelListIQ listModels(StateWrapper state, List<Long> list) { ...
我的问题是:这个em是否运行与DispatchIQService中的em相同的事务? 我怎么检查它? em的地址?
最好的问候 米答案 0 :(得分:1)
只要您处于同一事务中,则两个实例中注入的EntityManager将引用相同的“JPA事务上下文”。容器通常通过注入EntityManager代理来实现这一点,该代理通过查看事务线程上下文然后重新分派到每个事务的EntityManager来实现每个方法。您可以通过在DispatchIQService中更新实体然后在ModelFacade中重新查找实体以确保更新仍在那里来测试我的断言。