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?
> 

Reply via email to