首页 > 解决方案 > 在 Java Web 应用程序的 EJB 会话 bean 中生成唯一 ID

问题描述

我试图生成唯一的长ID。我在服务中生成它这是服务:

package x.y.z;

import java.util.Map; 
import java.util.concurrent.ConcurrentHashMap;
import javax.ejb.Startup; 
import javax.ejb.Stateless;

import  x.y.NiceObject;


@Stateless 
@Startup 
public class Transacciones {

     private  long idTransaccion = 0l;

     static Map<Long, NiceObject> mapaTransacciones = new ConcurrentHashMap<>();         

     public Transacciones() {
     }

    public long getIdTransaccion() {        
      ++idTransaccion;      
       return idTransaccion;    
     }

    public void setIdTransaccion(long idTransaccion) {
        idTransaccion = idTransaccion; 
    }

    public Map<Long, NiceObject> getMapaTransacciones() { 
        return mapaTransacciones;   
    }

    public void setMapaTransacciones(Map<Long, NiceObject> mapaTransacciones) {          
    this.mapaTransacciones = mapaTransacciones;     
    } 
}

我有一个托管 bean,我从这里调用这个服务并尝试使用这个生成的 id。这是bean的方法:

@EJB
private Transacciones transaccionService;


    public String capture() {
        ExecutorService service = Executors.newFixedThreadPool(2);
        try {
            long idTransaccion = 
            transaccionService.getIdTransaccion();
            method1(idTransaccion);
            service.submit(() -> {
                method2(idTransaccion);
            });
        } finally {
            if (service != null)
                service.shutdown();
        }
        return null;
    }

问题是在某个时间的某个地方,它失败了;因为我希望像这样生成 Id:

1,2,3,4,5,6.......

但我得到:

1,2,1,3,4,2,...

在这一行:

long idTransaccion = transaccionService.getIdTransaccion();

会有什么问题。请记住,我有一个 SessionScope 的托管 Bean,我从那里在 EJB 中调用此方法。

任何帮助提前谢谢!

标签: javaejb-3.0

解决方案


有一个无状态bean池。并且每个调用都委托给不同的实例,实际上您调用了一个代理方法,它将您的调用委托给了池的一个实例。无法保证即使对 bean 的两次连续调用(注入到您的 bean 中)也使用同一个 bean。所以当重新生成 1 时,就意味着它使用了另一个 bean。您可以使用单例而不是无状态。正如@prasad_3 所说,您不能在无状态 bean 中有状态。


推荐阅读