Obserwuję niezwykłe zachowanie i chciałbym zrozumieć, co się dzieje.Metoda EJB wymaga więcej czasu, aby powrócić po każdym wywołaniu
Wyobraź sobie prostą konfigurację.
Najpierw Mam bezstanowej fasoli, które po prostu zwraca coś:
@Stateless
public class SimpleService{
private Map<String, String> map;
@PostConstruct
public init(){
map = new HashMap<>();
}
public Map<String,String> getMap(){
return map;
}
}
Następnie mam innego bezstanowej fasoli, który wykonuje pewne przetwarzanie
@Stateless
public class ProcessService{
private static final Logger log = LoggerFactory.getLogger(ProcessService.class);
private static final int MAX = 2000;
@Inject
private SimpleService simpleService;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void process(){
final long start = System.currentTimeMillis();
for(int i=0; i<MAX; i++){
simpleService.getMap();
}
final long end = System.currentTimeMillis();
log.info(MessageFormat.format("Process took {0} ms", end - start));
}
}
Następnie Mam proste CDI fasoli zadzwonić do metoda procesowa.
Wynik:
Kiedy wzywam process
metoda kilka razy z rzędu, czas proces wciąż rośnie:
Process took 900 ms
Process took 1,100 ms
Process took 1,200 ms
Process took 1,400 ms
I ciągle dzieje się za każdym razem, gdy wywoływana jest metoda.
Jak to wyjaśnić?
Używam Java JDK 1.7.0_25 i JBOSS EAP 6.1.
EDIT
Nawiasem mówiąc, jedynym sposobem na „reset” czas przetwarzania dla metoda jest ponowne uruchomienie serwera.
Czy przetestowałeś to z więcej niż 4 iteracjami z rzędu i czy czasy zawsze rosły lub są o tym samym poziomie? po pewnym punkcie? – Thomas
Tak, zrobiłem więcej niż 4, to po prostu idzie dalej. W tym przykładzie wziąłem go do 5s dla tej samej metody (około 25 wywołań). Właściwie to może być interesujące zauważyć, że często trochę maleje, a następnie powraca: 350ms, 340ms, 460ms, 450ms, 700ms, 680ms, 900ms itd. W końcu to zawsze kończy się zwiększeniem – phoenix7360
Nie mogę Podejmij ten przykład bardzo poważnie, gdy już łamiesz wszystkie reguły, mając stan bezstanowy. Jest to jednak interesujący problem, ponieważ można oczekiwać, że czas upłynie pod pewnymi optymalizacjami środowiska wykonawczego. Niestety, nie da się zobaczyć, gdzie przebiega czas przetwarzania kodu, który prawie nic nie robi. W tym momencie byłoby interesujące złożyć to jako błąd dla JBoss i zobaczyć, co się z nim stanie. – Gimby