【发布时间】:2017-06-24 20:10:05
【问题描述】:
假设类的构造如下:
一个Filereader 为文件找到匹配的导入器并调用Importer.import 方法。
此方法调用带有 REQUIRES_NEW 注释的抽象方法 importSpecific。
从容器的角度来看,本地调用不会打开新的事务,但从继承的角度来看,我不确定。
ImporterBase.import 中的importSpecific 调用是否创建新事务?为什么会这样?
类 FileReader:
@Singleton(name = "FileReader")
public class FileReader extends Traceable {
/*@Inject
@Any
public Instance<Importer> importers;*/
@EJB
ExampleImporter importer;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void listenToFileAvailableEvent(@Observes FileAvailable event) throws InterruptedException {
for (final String filename : event.getFilenames()) {
readFile(filename);
}
}
public void readFile(String filenameWithPath) {
//[...]-> Extract FileMetadata and find correct importer
importer.import(dateiMeta);
}
}
接口导入器:
@Local
public interface Importer {
void import(FileMetaData dateiMeta) throws Exception;
void importSpecific(FileMetaData dateiMeta) throws Exception;
}
类 ImporterBase:
public abstract class ImporterBase implements Importer {
@Resource
private SessionContext ctx;
@Override
public void import(FileMetaData dateiMeta) throws Exception {
try {
ctx.getBusinessObject(Importer.class).importSpecific(dateiMeta);//This causes the error
} catch (Exception ex) {
//[...] Log Error
throw ex;
}
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public abstract void importSpecific(FileMetaData dateiMeta) throws Exception;
}
类 ExampleImporter:
@Stateless
public class ExampleImporter extends ImporterBase {
@Override
public void importSpecific(FileMetaData dateiMeta) throws Exception {
//Import from file
}
}
【问题讨论】:
标签: inheritance jakarta-ee transactions ejb