Hi,
I am trying to realize the following scenario:
1. Have one bundle (WC) initialize a web context (/app) via Pax
WebContainer and bind CXFNonSpringServlet to it (/app/services).
2. Allow other bundles (A, B, ...) to add endpoints and resources to
this web context. CXF endpoints should not be added to /cxf and
/app/services should not include ones from /cxf.
All configuration should be achievable from blueprint.
The last restriction of the second point is causing problems.
I have managed to register the CXFNonSpringServlet in WC. In order to
meet the restrictions figured out that I must provide a new
DestinationRegistry to the servlet. I'm doing this via the bus by adding
a custom feature to it:
<cxf:bus id="hicBus" bus="hicBus" name="hicBus">
<cxf:features>
<cxf:logging />
<ref component-id="hicRegistryFeature" />
</cxf:features>
</cxf:bus>
<!-- Bind a new CXFServlet to created bus -->
<bean id="hicCXFServlet"
class="org.apache.cxf.transport.servlet.CXFNonSpringServlet">
<property name="bus" ref="hicBus" />
</bean>
The feature uses a trivial implementation:
@Override
public void initialize(Bus bus) {
DestinationRegistry reg = new DestinationRegistryImpl();
new HTTPTransportFactory(bus, reg);
}
In bundles which contribute to that context I am looking up the CXF bus
and use it in the jaxrs server configuration:
<!-- Get the bus for this context -->
<reference id="bus" interface="org.apache.cxf.Bus"
availability="mandatory" filter="cxf.bus.id=hicBus" />
<bean id="service" class="..." />
<jaxrs:server bus="bus" id="server" address="/a">
<jaxrs:serviceBeans>
<ref component-id="service" />
</jaxrs:serviceBeans>
</jaxrs:server>
When I start my bundles everything works as expected. The servlet at
/cxf is not showing any endpoint registrations. The services at /app/a
and /app/b are accessible.
But when I stop one of the bundles, its registered endpoints do not get
removed from the registry (it's still showing up at /app/services) and
every query to any endpoint at /apps/* leads to an internal server error:
org.osgi.service.blueprint.container.ServiceUnavailableException: The
Blueprint container is being or has been destroyed:
(&(cxf.bus.id=hicBus)(objectClass=org.apache.cxf.Bus))
at
org.apache.aries.blueprint.container.ReferenceRecipe.getService(ReferenceRecipe.java:234)
at
org.apache.aries.blueprint.container.ReferenceRecipe.access$000(ReferenceRecipe.java:54)
at
org.apache.aries.blueprint.container.ReferenceRecipe$ServiceDispatcher.call(ReferenceRecipe.java:292)
at Proxy81a82933_4a7a_4e12_b808_3a682f503a24.getExtension(Unknown
Source)
at
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:99)
at
org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:238)
at
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:218)
at
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:198)
at
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:137)
at
org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:158)
at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:243)
at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:168)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:693)
at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:219)
at
org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:652)
at
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:447)
at
org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:70)
at
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
at
org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:559)
at
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)
at
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1038)
at
org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:117)
at
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:374)
at
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)
at
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:972)
at
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at
org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:74)
at
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at org.eclipse.jetty.server.Server.handle(Server.java:363)
at
org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:483)
at
org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:53)
at
org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:920)
at
org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:982)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:635)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
at
org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:72)
at
org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:264)
at
org.eclipse.jetty.server.ssl.SslSocketConnector$SslConnectorEndPoint.run(SslSocketConnector.java:670)
at
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
at
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
at java.lang.Thread.run(Thread.java:722)
Am I missing something in my configuration? Or is there any simpler way
to achieve my goals?
Any help is greatly appreciated.
Thanks
Peter