@Lock(LockType.READ)java 8中的Singleton Ejb

时间:2016-07-21 14:38:14

标签: java-8 locking singleton

将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)   ..."

1 个答案:

答案 0 :(得分:2)

我无法理解为什么这样的事情曾经起作用。但我发现的是:对于容器管理的并发,语义是"只要没有写入就会允许并发读取"。我需要的是"允许并发读取,同时写入继续,但只有一个线程将一次写入"。为了达到这个目的,我已将课程改为

  

@Lock(LockType.READ)

     

@Singleton

     

公共类OperacaoServiceImpl实现了OperacaoService {

和方法

  

public void geraEIniciaOperacao()抛出CoreException {

  

syncronized public void geraEIniciaOperacao()抛出CoreException {

参考:EJB 3.1 container managed concurrency vs. synchronized