Ich beobachte ein ungewöhnliches Verhalten und ich würde gerne verstehen, was passiert.EJB-Methode braucht mehr Zeit, um nach jedem Anruf zurückzukehren
Stellen Sie sich eine einfache Einrichtung vor.
Zuerst habe ich eine stateless Bean, die gerade wieder etwas:
@Stateless
public class SimpleService{
private Map<String, String> map;
@PostConstruct
public init(){
map = new HashMap<>();
}
public Map<String,String> getMap(){
return map;
}
}
Dann habe ich eine andere stateless Bean, die eine gewisse Verarbeitung macht
@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));
}
}
Dann habe ich eine einfache CDI Bean haben die anrufen Prozessmethode.
Ergebnis:
Wenn ich die process
Methode mehrmals in einer Reihe nennen, hält die Prozesszeit zu erhöhen:
Process took 900 ms
Process took 1,100 ms
Process took 1,200 ms
Process took 1,400 ms
Und es hält heißt jedes Mal, das Verfahren nach oben.
Wie kann das erklärt werden?
Ich verwende Java JDK 1.7.0_25 und JBOSS EAP 6.1.
EDIT
Durch die Art und Weise, auf die einzige Art und Weise ‚Reset‘ die Verarbeitungszeit für das Verfahren den Server neu zu starten ist.
Haben Sie dies mit mehr als 4 Iterationen hintereinander getestet und die Zeiten immer erhöht oder sind sie ungefähr gleich nach einem bestimmten Punkt? – Thomas
ja, ich habe mehr als 4, es geht einfach weiter. Bei diesem Beispiel habe ich es für die gleiche Methode (ca. 25 Anrufe) auf 5s gebracht. Eigentlich könnte es interessant sein zu bemerken, dass es oft ein wenig abnimmt und dann wieder hochgeht: 350ms, 340ms, 460ms, 450ms, 700ms, 680ms, 900ms etc ... Am Ende wird es immer größer – phoenix7360
kann ich nicht Nehmen Sie dieses Beispiel sehr ernst, wenn Sie bereits alle Regeln brechen, indem Sie eine zustandslose Bohne mit Status verwenden. Es ist ein interessantes Problem, aber Sie würden erwarten, dass die Zeit bei gegebenen Laufzeitoptimierungen sinkt. Leider ist es unmöglich zu sehen, wo die Verarbeitungszeit in Code läuft, der fast nichts tut. An dieser Stelle wäre es interessant, dies als Bug bei JBoss abzulegen und zu sehen, was damit passiert. – Gimby