2015-04-18 8 views
13

Ich bin eine @Stateless Bean in einem asynchronen Servlet injizieren und Aufruf @Asynchronous-Methode von der Serrvlet. In den Serverprotokollen des Jboss kann ich keine Ausnahme sehen, aber beim Starten des Java Mission Controls, Flight Recorder, kann ich ContextNotActiveExcetion sehen, wann immer Servlet die Methode @Asyncrhonous aufruft.ContextNotActiveException beim Aufruf von @Asynchronous-Methode von @Stateless Bean

Servlets ::

@WebServlet(urlPatterns = { "/asyncservice" }, asyncSupported = true) 
public class AsyncServiceServlet extends HttpServlet { 

@Inject 
private Service service; 

protected void doPost(final HttpServletRequest request, final HttpServletResponse response) 
     throws ServletException, IOException { 
    final AsyncContext asyncContext = request.startAsync(request, response); 
    asyncContext.start(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       service.service(asyncContext); 
      } catch (ContextNotActiveException | IOException e) { 
       e.printStackTrace(); 
      } 
     }); 
    } 

Service-Klasse ::

@Stateless 
public class Service { 

@Asynchronous 
public void service(final AsyncContext asyncContext) throws IOException { 
    HttpServletResponse res = (HttpServletResponse) asyncContext.getResponse(); 
    res.setStatus(200); 
    asyncContext.complete(); 
    } 
} 

die Stack-Trace i im Flug Recorder sehen können ::

 java.lang.Throwable.<init>() 4 
     java.lang.Exception.<init>() 4 
     java.lang.RuntimeException.<init>() 4 
     javax.enterprise.context.ContextException.<init>() 4 
     javax.enterprise.context.ContextNotActiveException.<init>() 4 
     org.jboss.weld.context.ContextNotActiveException.<init>(Enum,Object[]) 4 
     org.jboss.weld.manager.BeanManagerImpl.getContext(Class) 4 
     org.jboss.as.weld.ejb.EjbRequestScopeActivationInterceptor.processInvocation(InterceptorContext) 4 
    org.jboss.invocation.InterceptorContext.proceed() 4 
     org.jboss.invocation.InitialInterceptor.processInvocation(InterceptorContext) 4 
    org.jboss.invocation.InterceptorContext.proceed() 4 
    org.jboss.invocation.ChainedInterceptor.processInvocation(InterceptorContext) 4 
org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor.processInvocation(InterceptorContext) 4 
    org.jboss.invocation.InterceptorContext.proceed() 4 
     org.jboss.as.ejb3.component.pool.PooledInstanceInterceptor.processInvocation(InterceptorContext) 4 
    org.jboss.invocation.InterceptorContext.proceed() 4 
    org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(InterceptorContext,TransactionManager,EJBComponent) 4 
    org.jboss.as.ejb3.tx.CMTTxInterceptor.required(InterceptorContext,EJBComponent,int) 4 
    org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(InterceptorContext) 

Ich habe durch viele gegangen Beiträge, aber immer noch das Problem gleich bleiben, bitte helfen Sie mir aus.

+0

Ist das die ganze Stacktrace? Wie baut man das Projekt (Maven, Ant)? Sind Sie sicher, dass keine Abhängigkeit fehlt? :) –

+0

Welche JBoss AS Version? Kann nicht in WildFly 8.2 reproduziert werden. Funktioniert gut, sieht also nur wie ein Fehler in der Weld-Version aus, wie er in Ihrem JBoss AS verwendet wird. Es könnte sich auch lohnen, auf WildFly oder zumindest die Weld-Version zu aktualisieren, wie sie in WildFly 8.2 verwendet wird. – BalusC

+0

Ich benutze jboss eap 6.1, dies wird keinen Fehler/Ausnahme in einem der Server-Logs oder Konsolen-Ausgabe erzeugen, aber wenn Sie Java Mission Control starten und Java-Flugschreiber starten, können Sie ContextNotActiveException in Code >> Exception sehen. –

Antwort

0

Javadoc- für AsyncContext.start:

Register der gegebene AsyncListener mit der letzten Asynchron Zyklus, der durch einen Aufruf einer der ServletRequest.startAsync() Methoden gestartet wurde. Der angegebene AsyncListener erhält ein AsyncEvent, wenn der asynchrone Zyklus erfolgreich abgeschlossen wird, Zeitüberschreitung auftritt oder zu einem Fehler führt.

, dass dieser Anruf von der Zeit, zu

Implying

service.service (asyncContext);

gemacht wird, die HttpServletRequest „Kontext“ nicht zur Verfügung steht, und die Anforderung von Ihrem Service kann sogar begangen wurde, was zu CDI nicht zu bestimmen, in der Lage, irgendwelche ‚@RequestScoped‘ verwendeten Bohnen.

Beachten Sie, dass AsyncContext.start ein OnEvent registriert, das aufgerufen wird, wenn der Async-Aufruf abgeschlossen ist, oder bei einem Fehler, nicht beim Start.

Sie wahrscheinlich Zuhörer hinzufügen möchte, bevor AsyncContext.start Aufruf aufgerufen werden

+0

Der obige Code-Schnipsel funktioniert gut ich in der Lage bin Antwort von Service.service() -Methode zu senden, die aysncContext in Service.service verfügbar ist() –

+2

Wenn Sie mehr stacktrace anhängen, könnten wir zu welchem ​​Zeitpunkt der Ausführung helfen, herauszufinden, das cdi schlägt fehl. Wenn es während der Ausführung des '' 'service.service (asyncContext)' '' ist, ist die Wahrscheinlichkeit sehr hoch, dass der readscoped Kontext nicht mehr aktiv ist. – maress

+0

Ja nach dem Stacktrace tritt die Ausnahme bei service.service (asyncontext) -Aufruf auf, und Sie rechts @ Maress, da der Anfragekontext nicht aktiv ist, aber nicht wissen, wie Sie den Anfragekontext der Serviceklasse manuell hinzufügen. –

1

Die Ausnahme keine Auswirkung auf die Funktionalität hat; Es wird unter der Haube gehandhabt.

Die ContextNotActiveExcetion gilt für @RequestScoped Bohnen. Sie starten die doppelte asynchrone Verarbeitung mit AsyncContext.start und dem @Asynchronous EJB-Aufruf.

Die Ausnahme, die Sie innerhalb des Flugschreibers sehen, ist zu testen, ob der Standardkontext RequestScoped aktiv ist und falls ja, um fortzufahren. Wenn der Kontext RequestScoped nicht aktiv ist, wird ein neuer EjbRequestContext aktiviert und dem Thread zugeordnet.

Sie können eine sichtbare ContextNotActiveExcetion verursachen, wenn Sie eine @SessionScoped Bean erstellen und injizieren/Zugang, dass man innerhalb Ihrer Service

MySessionScoped.

java
@SessionScoped 
public class MySessionScoped implements Serializable { 

    private int value; 

    public int getValue() { 
     return value; 
    } 

    public void setValue(int value) { 
     this.value = value; 
    } 
} 

Service.java

@Stateless 
public class Service { 

    @Inject 
    private MySessionScoped mySessionScoped; 

    @Asynchronous 
    public void service(final AsyncContext asyncContext) throws IOException { 

     System.out.println(mySessionScoped.getValue()); 

     HttpServletResponse res = (HttpServletResponse) asyncContext.getResponse(); 
     res.setStatus(200); 
     asyncContext.complete(); 
    } 
} 
+0

Eine weitere Sache: Hier ist ein Beispiel für CDI, EJB und Asynchron-Verarbeitung: https://github.com/wildfly/quickstart/tree/master/servlet-async/src/main/java/org/jboss/as/quickstarts/ Servlet/Asynchron – mp911de