java - 在 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 中调用此方法。
任何帮助提前谢谢!
解决方案
有一个无状态bean池。并且每个调用都委托给不同的实例,实际上您调用了一个代理方法,它将您的调用委托给了池的一个实例。无法保证即使对 bean 的两次连续调用(注入到您的 bean 中)也使用同一个 bean。所以当重新生成 1 时,就意味着它使用了另一个 bean。您可以使用单例而不是无状态。正如@prasad_3 所说,您不能在无状态 bean 中有状态。
推荐阅读
- javascript - 我怎样才能找出一个值在数组中的频率?
- java - Sqlite-按所需顺序显示结果
- bash - 如何将单行分成 .txt 作为分隔符的行
- git - 意外的“git rebase”效果?
- p5.js - 我可以不使用 loadImage 函数中的变量吗?
- youtube-api - 如何为用户获取 YouTube 频道的区域?
- image - 在 CustomPainter 中画布 drawImage 缩放高度和宽度
- css - 我在 css 中不断收到预期的 RBRACE 错误
- java - 如何获取视频/音频信息,例如 Duration 和 with 和 height?
- amp-story - 我们可以在 AMP 故事中实现复制到剪贴板吗?