This seems to work for me, but I have my doubts. Following the example here:
https://github.com/ops4j/org.ops4j.pax.web/tree/master/samples/whiteboard-extended
<https://github.com/ops4j/org.ops4j.pax.web/tree/master/samples/whiteboard-extended>
I made the following changes.
In my blueprint:
<service
interface="org.ops4j.pax.web.service.whiteboard.HttpContextMapping">
<service-properties>
<entry key="httpContext.id">
<value>externalAPIContext</value>
</entry>
</service-properties>
<bean
class="org.ops4j.pax.web.extender.whiteboard.runtime.DefaultHttpContextMapping">
<property name="httpContextId"
value="externalAPIContext" />
<property name="path"
value="#{context.path}#{api.root.path}" />
<property name="parameters">
<map>
<entry key="httpContext.virtualhosts"
value="127.0.0.1"/>
<entry key="httpContext.connectors"
value="externalAPIConnector"/>
</map>
</property>
</bean>
</service>
<bean id="camelServlet"
class="org.apache.camel.component.servlet.CamelHttpTransportServlet"/>
<reference id="httpService"
interface="org.osgi.service.http.HttpService" />
<bean
class="org.apache.camel.component.servlet.osgi.OsgiServletRegisterer"
init-method="register"
destroy-method="unregister">
<property name="alias" value="#{context.path}#{api.root.path}"
/>
<property name="httpService" ref="httpService" />
<property name="servlet" ref="camelServlet" />
<property name="servletName" value="ResponderRestApiServlet"/>
<property name="matchOnUriPrefix" value="true"/>
</bean>
In my jetty.xml:
<Call name="addConnector">
<Arg>
<New class="org.eclipse.jetty.server.ServerConnector">
<Arg name="server">
<Ref refid="Server" />
</Arg>
<Arg name="factories">
<Array
type="org.eclipse.jetty.server.ConnectionFactory">
<Item>
<New
class="org.eclipse.jetty.server.HttpConnectionFactory">
<Arg
name="config">
<Ref
refid="httpConfig" />
</Arg>
</New>
</Item>
</Array>
</Arg>
<Set name="host">
<Property name="jetty.host"
default="127.0.0.1" />
</Set>
<Set name="port">
<Property name="jetty.port"
default="8285" />
</Set>
<Set name="idleTimeout">
<Property name="http.timeout"
default="30000" />
</Set>
<Set name="name">externalAPIConnector</Set>
</New>
</Arg>
</Call>
In my Camel Context:
<restConfiguration
component="servlet"
bindingMode="xml"
contextPath="{{context.path}}{{api.root.path}}"
port="{{port}}"
enableCORS="false"
clientRequestValidation="true">
<componentProperty key="matchOnUriPrefix" value="true"/>
<endpointProperty key="servletName"
value="ResponderRestApiServlet"/>
</restConfiguration>
But, I am wondering if this correct, because in the example the Servlet is
registered with service property httpContext.id, which I am not setting
anywhere. The Jetty Connector name is configured in the
org.ops4j.pax.web.service.whiteboard.HttpContextMapping, but I don’t see how
it is matched to my Camel Servlet. Notice that the
org.apache.camel.component.servlet.osgi.OsgiServletRegisterer bean is the one
registering the servlet with the OSGi HTTP Service, but there is no way to
specify the httpContext.id property. Is this property required to match the
HttpContextMapping to the Servlet?
Any insight is appreciated.
Best regards,
Alex soto
> On Jan 31, 2020, at 9:29 AM, Alex Soto <[email protected]> wrote:
>
> Thanks JB and Markus,
>
> This is very close to what I am looking for (I still need to read more the
> examples) but in my particular case, I am using Camel Rest DSL (with servlet
> component) connecting it to the OSGi managed
> org.osgi.service.http.HttpService. In other words, I am not using the Camel
> Jetty component for my rest services. This is how I am setting up Camel to
> use the OSGi HTTP Service:
>
> <reference id="httpService"
> interface="org.osgi.service.http.HttpService" />
> <bean id="camelServlet"
> class="org.apache.camel.component.servlet.CamelHttpTransportServlet"/>
> <bean
> class=“org.apache.camel.component.servlet.osgi.OsgiServletRegisterer"
> init-method="register" destroy-method="unregister”>
> <property name="alias" value="#{context.path}#{api.root.path}"
> />
> <property name="httpService" ref="httpService" />
> <property name="servlet" ref="camelServlet" />
> <property name="servletName" value="RestApiServlet"/>
> <property name="matchOnUriPrefix" value="true"/>
> </bean>
>
> <restConfiguration component=“servlet" bindingMode="xml"
> contextPath="{{context.path}}{{api.root.path}}"
> port="{{port}}"
> enableCORS="false"
> clientRequestValidation="true">
> <componentProperty key="matchOnUriPrefix" value="true"/>
> <endpointProperty key="servletName"
> value="RestApiServlet”/>
> ...
>
>
> So, the question is how do I bind the Camel servlet to a specific Jetty
> connection?
> Would the MANIFEST headers do it? If so, then that applies to the entire
> bundle.
>
> Best regards,
> Alex soto
>
>
>
>
>> On Jan 31, 2020, at 9:06 AM, Markus Rathgeb <[email protected]
>> <mailto:[email protected]>> wrote:
>>
>> Hi JB,
>>
>> as I comment that link already in the first thread and also answered
>> to your link in the second thread:
>>
>>> Isn't this similar to this thread (at least after some comments):
>>> https://lists.apache.org/thread.html/69182ee8feef88896f840efde48146053997119e820ef037853c1c9b@%3Cuser.karaf.apache.org%3E
>>>
>>> <https://lists.apache.org/thread.html/69182ee8feef88896f840efde48146053997119e820ef037853c1c9b@%3Cuser.karaf.apache.org%3E>
>>> You also referenced to http://blog.nanthrax.net/?p=352
>>> My observations has been that it should work for "Web Bundles" and I
>>> did not found (that time) a way to get it working for servlets.
>>
>> May I ask you if you already checked that this is really still working
>> for servlets?
>