2014-06-16 10 views
8

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.

+1

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

+0

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

+0

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

Antwort

4

@Inject Ich habe mit Wildfly 8.1.0.Final getan zu testen und ich folgendes:

Process took 900 ms 
Process took 600 ms 
Process took 400 ms 
Process took 300 ms 
Process took 130ms 
Process took 100ms 

Und es dann stabilisiert selbst etwa 90ms.

Also wir können sicher davon ausgehen, dass das ursprüngliche Problem ein Bug in JBoss AS 7 war, der in WildFly 8.1 behoben wurde. Mehr als behoben haben sie sogar eine Optimierung eingeführt!

BEARBEITEN!

Ich entschuldige mich, ich habe eine falsche Diagnose gemacht. Dieser Fehler hat nichts mit der Version von JBoss zu tun, sondern wurde von JRebel verursacht.

Als ich Wildfly heruntergeladen habe, habe ich es nicht im Debug-Modus mit angehängtem JRebel Agent ausgeführt (was ich ständig mit EAP 6.1 gemacht habe). Wenn ich JBoss EAP 6.1 ohne JRebel starte, tritt das Problem nicht auf.

Ich habe mich an JRebel gewöhnt Ich habe vergessen, ich hatte es eingeschaltet!

Ich werde ein Problem mit dem JRebel-Team melden.

EDIT 2

JRebel Team untersucht und waren in der Lage, den Mangel zu reproduzieren. Es wurde in der nächtlichen Build behoben und wird in der nächsten Version behoben (fällig August/September 2014)

+0

Das ist eine ziemliche Überraschung - sollte es dem AS 7 Team gemeldet werden? – bjedrzejewski

+0

Ja, ich tat das schon – phoenix7360

+0

Das ist ein ziemlich interessanter Fund! Haben Sie einen Link zum Fehlerbericht, damit ich den Fortschritt verfolgen kann? – Gimby

0

Können Sie den gleichen Test versuchen, aber eine Schnittstelle SimpleService erstellen und aktuelle SimpleService wird etwas wie SimpleServiceImpl, die SimpleService implementieren wird.
Ich würde davon ausgehen, dass cdi etwas Magie macht, um EJB zu wickeln. Hmm .. oder könnte eine andere Sache werden versuchen @EJB Injektion zu verwenden, anstatt

Verwandte Themen