将Java 7与Jboss7一起使用以下代码。
@Singleton
public class OperacaoServiceImpl implements OperacaoService {
private Operacao operacaoEmAndamento;
@Override
@Lock(LockType.READ)
public Operacao getOperacaoEmAndamento() {
return operacaoEmAndamento;
}
@Override
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void geraEIniciaOperacao() throws CoreException {
geraOperacao();
iniciaOperacao();
}
}
现在我已经使用Wildfly迁移到Java 8,它停止了工作。如果geraEIniciaOperacao仍在运行,我无法访问getOperacaoEmAndamento。
" javax.ejb.ConcurrentAccessTimeoutException:WFLYEJB0241:EJB 3.1 在OperacaoServiceImpl上PFD2 4.8.5.5.1并发访问超时 - 无法在5000MILLISECONDS内获得锁定 org.jboss.as.ejb3.concurrency.ContainerManagedConcurrencyInterceptor.processInvocation(ContainerManagedConcurrencyInterceptor.java:106) ..."
答案 0 :(得分:2)
我无法理解为什么这样的事情曾经起作用。但我发现的是:对于容器管理的并发,语义是"只要没有写入就会允许并发读取"。我需要的是"允许并发读取,同时写入继续,但只有一个线程将一次写入"。为了达到这个目的,我已将课程改为
@Lock(LockType.READ)
@Singleton
公共类OperacaoServiceImpl实现了OperacaoService {
和方法
public void geraEIniciaOperacao()抛出CoreException {
到
syncronized public void geraEIniciaOperacao()抛出CoreException {