我已将服务实现为无状态会话 EJB (3.2) 以通过 JPA 存储数据。此外,每次更新数据时,EJB 也会更新一个 Lucene 索引。会话 bean 是容器管理的。ejb 的代码如下所示:
@Stateless
@LocalBean
public class DataService {
....
public Data save(Data myData) {
// JPA work....
...
// update Lucene index
....
}
....
}
我有不同的其他 BusinessService-EJB 调用这个 DataService EJB 来插入或更新数据。我无法控制 BusinessService-EJB 实现。由 BusinessService-ejb 启动的事务可以包含对 DataService EJB 的 save() 方法的多次调用。
@Stateless
@LocalBean
public class SomeBusinessService {
@EJB
DataService dataService;
....
public void process(....) {
dataService.save(data1);
...
dataService.save(data2);
....
}
....
}
如果 BusinessService-EJBs 方法“进程”中断,我的问题就会出现。DataService.save() 的每个方法调用都会更新给定数据对象的 Lucene 索引。但是,如果后面的调用之一失败,则整个事务将回滚。我的 JPA 工作将按预期回滚(没有数据写入数据库)。但是现在 Lucene 索引已经在事务被取消之前为 save() 方法的所有成功完整调用更新。
所以我的问题是:我如何对我的 DataService EJB 中的这种情况做出反应?这甚至可能吗?
我看到使用 Statefull Session EJB 3.2 我可以使用注释“ @AfterCompletion”来注释方法。因此,我想这可能是仅当 @AfterCompletion 以“成功”调用时才编写 lucene 索引的解决方案。但是这个注释对于无状态会话 EJB 是不允许的。我应该简单地将我的 EJB 类型从无状态更改为有状态吗?但这对我的 BusinessService-EJB 场景有何影响,它仍然是一个无状态会话 EJB?这行得通吗?我还担心将我的 ejb 形式无状态更改为有状态会对性能产生影响。
或者有没有其他方法可以解决这个问题?例如,监听器根据事务 ID 写入日志,并在事务完全完成后更新 lucene 索引......?
有只小跳蛙
手掌心
相关分类