在我们的项目中,我们使用来自openehealth的HL7文档的实现。此实现使用EMF作为原始模型,并将所有调用委托给EMF。我们需要处理大量文档,我们的流程涉及文档的并发处理(读取,验证,查询)。在并发环境中,EMF层与UnsupportedOperationException崩溃。来自openehealth网站,它说处理客户端api中的同步处理,但这会降低我们的系统性能,我们不希望这样。我尝试了EMF事务API,TransactionalEditingDomain,它表示支持只读模型事务,但没有成功。我的测试看起来像这样:
ExecutorService executorService = Executors.newFixedThreadPool(4);
final List<ClinicalDocument> documents = new ArrayList<ClinicalDocument>();
for (int i = 0; i < 100; i ++) {
executorService.submit(new Runnable() {
@Override
public void run() {
try {
int randomNum = 1 + (int)(Math.random()*6);
ClinicalDocument cda = readCda();
processIntensiveWork(cda);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
private void processIntensiveWork(final ClinicalDocument document) {
for (final Method method : document.getClass().getMethods())
if (method.getName().startsWith("get")) {
try {
domain.runExclusive(new RunnableWithResult.Impl() {
@Override
public void run() {
try {
method.invoke(document);
System.out.println("Invoked method: " + method.getName());
setResult(null);
} catch (UnsupportedOperationException e) {
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
对于这个测试用例,我们经常捕获java.lang.UnsupportedOperationException。 我提到,对于某些测试用例,我还从EMF事务API中发现了以下错误:java.lang.IllegalArgumentException:只能停用活动事务
敬请任何建议。请随意询问可能有助于您解决问题的其他信息。