2011-12-29 5 views
0

В настоящее время я пытаюсь настроить конечную точку webservice (в среде JBoss AS 6.1.0.FINAL), чтобы позволить клиентам проводить длительный опрос для серверных событий без блокировки потоков прослушивателя на сервере ,Конечная точка без блокировки Webservice с API продолжения JBoss6 и CXF

Поскольку, похоже, не существует стандартного решения, я нашел это blog post о продолжениях CXF (что рядом с WS-Impl. В JBoss).

я мог бы передать пример, как JAX-WS

import javax.annotation.Resource; 
import javax.jws.WebMethod; 
import javax.jws.WebService; 
import javax.servlet.annotation.WebServlet; 
import javax.xml.ws.BindingType; 
import javax.xml.ws.WebServiceContext; 
import javax.xml.ws.handler.MessageContext; 
import org.apache.cxf.continuations.Continuation; 
import org.apache.cxf.continuations.ContinuationProvider; 

@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING) 
@WebServlet(asyncSupported = true, urlPatterns = "/LongpollWebservice") 
@WebService(targetNamespace = "http://longpoll.edu/", name = "LongpollWebservice", serviceName = "LongpollWebservice", portName = "LongpollWebservice") 
public class LongpollWebserviceImpl implements LongpollWebservice { 

    @Resource 
    WebServiceContext ctx; 

    @Override 
    @WebMethod 
    public List<EventBase> getEvents(String topic, Date since) { 
     final ContinuationProvider cp = (ContinuationProvider) ctx.getMessageContext().get(ContinuationProvider.class.getName()); 
     final Continuation c = cp.getContinuation(); 
     if (c.isNew()) { 
      c.suspend(10000); 
      return null; 
     } else { 
      return Collections.emptyList(); 
     } 
    } 
} 

Продолжение API происходит от

<dependency> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-api</artifactId> 
    <version>2.3.1</version> 
    <scope>provided</scope> 
</dependency> 

Это уменьшенное пример. Вызов c.suspend(10000); должен указывать текущий вызов сервлета как State.SUSPENDED. Через десять секунд приостановка должна быть отключена, и запрос должен быть повторно вызван c.isNew() == false. (В реальном мире продолжение может быть передано в JMS-Listener Bean или с состоянием CDI-Eventlistener, а c.setObject(event); c.resume(); будет вызываться диспетчером событий после того, как событие будет доступно и готово к отправке)

Перехватчик CXF цепочка должна прерывать исполняемый поток с помощью SuspendedInvocationException и перенести вызов webservice. Он компилирует и разворачивает штраф на JBoss 6.1.0 FINAL до сих пор. Wsdl прекрасно поставляется.

НО: Когда я вызываю getEvents() из Webservice-Client, SuspendedInvocationException, похоже, не пойманы правильно. Целый Призыв падает со следующим StackTrace:

14:39:59,578 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/longpoll-warfacade].[edu.hsos.dwe.wss.longpoll.warfacade.LongpollWebserviceImpl]] Servlet.service() for servlet edu.hsos.dwe.wss.longpoll.warfacade.LongpollWebserviceImpl threw exception: org.apache.cxf.continuations.SuspendedInvocationException 
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:258) [:2.3.1-patch-01] 
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:113) [:2.3.1-patch-01] 
at org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:97) [:2.3.1-patch-01] 
at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:461) [:2.3.1-patch-01] 
at org.jboss.wsf.stack.cxf.ServletControllerExt.invoke(ServletControllerExt.java:172) [:3.4.1.GA] 
at org.jboss.wsf.stack.cxf.RequestHandlerImpl.handleHttpRequest(RequestHandlerImpl.java:57) [:3.4.1.GA] 
at org.jboss.wsf.stack.cxf.transport.ServletHelper.callRequestHandler(ServletHelper.java:156) [:3.4.1.GA] 
at org.jboss.wsf.stack.cxf.CXFNonSpringServletExt.invoke(CXFNonSpringServletExt.java:90) [:3.4.1.GA] 
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179) [:2.3.1-patch-01] 
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:103) [:2.3.1-patch-01] 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) [:1.0.0.Final] 
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159) [:2.3.1-patch-01] 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:324) [:6.1.0.Final] 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242) [:6.1.0.Final] 
at org.jboss.resteasy.plugins.server.servlet.FilterDispatcher.doFilter(FilterDispatcher.java:63) [:6.1.0.Final] 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:274) [:6.1.0.Final] 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242) [:6.1.0.Final] 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [:6.1.0.Final] 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [:6.1.0.Final] 
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:181) [:6.1.0.Final] 
at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.event(CatalinaContext.java:285) [:1.1.0.Final] 
at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.invoke(CatalinaContext.java:261) [:1.1.0.Final] 
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:88) [:6.1.0.Final] 
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:100) [:6.1.0.Final] 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:159) [:6.1.0.Final] 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [:6.1.0.Final] 
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) [:6.1.0.Final] 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [:6.1.0.Final] 
at org.jboss.web.tomcat.service.request.ActiveRequestResponseCacheValve.invoke(ActiveRequestResponseCacheValve.java:53) [:6.1.0.Final] 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [:6.1.0.Final] 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [:6.1.0.Final] 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:654) [:6.1.0.Final] 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951) [:6.1.0.Final] 
at java.lang.Thread.run(Thread.java:619) [:1.6.0_18] 

Итак, наконец, мой вопрос: Есть ли кто-нибудь, кто имеет опыт работы с CXF Продолжением и WS и может дать мне подсказку, что может быть не так с этим attemp?

Я действительно не понимаю, почему Исключение воссоздано в PhaseInterceptorChain.doIntercept.

С наилучшими пожеланиями, avithan

ответ

0

Решено:

  1. Установка CXF 2.3.4 к JBoss/общий/Lib (нам нужен этот вопрос неподвижную: https://issues.apache.org/jira/browse/CXF-3362).

  2. JBossWS-CXF не улавливает SuspendedInvocationException. Кажется, это просто не указано в jbossws-cxf-сервере. Я подал вопрос на номер https://issues.jboss.org/browse/JBWS-3409. Приложенный патч можно легко применить к проверке jbossws-cxf-3.4.1.GA (модуль jbossws-cxf-server) и перекомпилировать с помощью mvn package.

Сердечные приветы

 Смежные вопросы

  • Нет связанных вопросов^_^