Генерирование уникального идентификатора в сессионном EJB-компоненте в веб-приложении Java - PullRequest
0 голосов
/ 22 ноября 2018

Я пытался сгенерировать и уникальный длинный идентификатор.Я генерирую это в сервисе, это сервис:

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-компонента:

@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();

В чем проблема,Remenber У меня есть управляемый компонент SessionScope, откуда я вызываю этот метод в EJB.

За любую помощь Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Существует пул бинов без состояния.И каждый вызов делегируется другому экземпляру, на самом деле вы вызываете метод прокси, и он делегирует ваш вызов экземпляру пула.Нет никакой гарантии, что даже два последовательных вызова компонента (введенных в ваш компонент) используют один и тот же компонент.Таким образом, когда восстанавливается 1, это означает, что он использовал другой боб.Вы можете использовать синглтон вместо лица без гражданства.Как сказал @ prasad_3, вы не должны иметь состояния в bean-компоненте без состояния.

0 голосов
/ 22 ноября 2018

Определить idTransaccion как статическую переменную.

...