Thanks Ray.  See the pseudo code as below and we are also registering 
CXFServlet. During bundle activation we want to register the 
org.apache.cxf.transport.servlet.CXFServlet servlet, get the cxf bus returned 
from the servlet and set it as the default bus of cxf BusFactory. By doing this 
we can receive SOAP calls from HP devices and also send SOAP calls to HP 
devices.

In the old product we registered the CXFServlet servlet by calling 
httpService.registerServlet(…), the cxf bus was not null (an 
org.apache.cxf.bus.spring.SpringBus object), and the communication with HP 
device was always fine. Due to the OSGI version upgrading for the product we 
changed to use the whiteboard pattern to do the registration and we noticed the 
returned cxf bus from the CXFServlet is null after calling 
bundleContext.registerService(…) , and also, the published endpoints are not 
there for listening.  We are trying to find a solution. The experimentations 
showed the way to make it work is to get the org.osgi.service.http.HttpService 
reference ready first, and then call bundleContext.registerService(…) to 
register the CXFServlet. This way the returned cxf bus is not null anymore and 
the communication between the web server and HP device is fine. As mentioned, 
the HttpService instance seems to be lazy started. In order to get the 
org.osgi.service.http.HttpService reference ready, there has to be a web 
request sent to the web server. This is not we want and why we asked the 
question.

... ...
import javax.servlet.Servlet;
import javax.xml.ws.Endpoint;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.apache.cxf.transport.http.osgi.HTTPTransportActivator;
import org.apache.cxf.transport.servlet.CXFServlet;
... ...

@Component(service = { HPOmniWebServicePublishComponent.class })
public class HPOmniWebServicePublishComponent implements IWebComponent {
    ... ...
    private HTTPTransportActivator httpTransportActivator = new 
HTTPTransportActivator();
    ... ...

    @Activate
    public void activate(ComponentContext ctx)
    {
         try {
            // Set value for keystore and keystore password
                ... ...
            System.setProperty("javax.net.ssl.keyStore", keyStoreLocation);
            System.setProperty("javax.net.ssl.keyStorePassword", password);
            ... ...
            httpTransportActivator.start(ctx.getBundleContext());
        } catch (NoClassDefFoundError | Exception exception) {
            // Log error for starting HTTPTransportActivator
        }
        … …
        ClassLoader currentcl = Thread.currentThread().getContextClassLoader();
        try {
            // set classloader to CXF bundle class loader to avoid OSGi 
classloader problems
            ClassLoader bundlecl = BusFactory.class.getClassLoader();
            Thread.currentThread().setContextClassLoader(bundlecl);
            ... ...
            System.setProperty("javax.xml.ws.spi.Provider", 
"org.apache.cxf.jaxws.spi.ProviderImpl");
            … …
            CXFServlet servlet = new CXFServlet(); // 
org.apache.cxf.transport.servlet.CXFServlet
            BundleContext bundleContext = ctx.getBundleContext();
            params.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, 
ApplicationFactory.SERVICE_BASE_PATH);
           cxfServletRegistration = 
bundleContext.registerService(Servlet.class, servlet, params); // Register the 
org.apache.cxf.transport.servlet.CXFServlet servlet

            Bus bus = servlet.getBus(); // ==> The returned org.apache.cxf.Bus 
bus is always null if we didn’t get HttpService instance ready when calling 
bundleContext.registerService(Servlet.class, servlet, params);
            BusFactory.setDefaultBus(bus); //org.apache.cxf.BusFactory

                          // Publishe endpoints for specified implementors
           Endpoint.publish(path, implementor);
           ... ...

Regards.
Justin Li


Justin Li
Sr. Software Developer

[cid:Kofax_ab6d7362-d88f-454c-a5e0-9fbdacd27b9c.jpg]

Kofax Canada, ULC
460 Phillip Street
Waterloo, ON N2L 5J2

Tel: +1 519 880 7543
justin...@kofax.com

 [cid:WorkLikeTomorrow_5b748fe4-9e86-42f8-b5af-b79a2d6ee254.jpg]
________________________________

This communication is only for the use of the intended recipient. It may 
contain confidential or proprietary information. If you are not the intended 
recipient or have received this communication in error, please notify the 
sender via phone and destroy this communication immediately.
From: Raymond Auge <raymond.a...@liferay.com>
Sent: Thursday, July 23, 2020 10:29 AM
To: felix users <users@felix.apache.org>
Cc: Justin Li <justin...@kofax.com>
Subject: [EXTERNAL] Re: How to make HttpService reference ready when 
bundleContext.registerService() is called



On Thu, Jul 23, 2020 at 8:59 AM Justin Li 
<justin...@kofax.com<mailto:justin...@kofax.com>> wrote:
Our development requirement needs us to get the 
org.osgi.service.http.HttpService reference during the activation of our 
bundle, but the tests show the HttpService reference is always null if we want 
to locate it from the bundle context.

You appear to be mixing HttpService and Http Whiteboard modes. Why do you need 
HttpService if you are registering your servlet as a service using 
bundleContext.registerService(Servlet.class, myServlet, params) ?

- Ray

The following is an example. "myServlet" is registered by calling 
"bundleContext.registerService" with whiteboard pattern. According to tests, we 
do get the org.osgi.service.http.HttpService reference by registering a 
ServiceListener ,  but the HttpService reference is not ready unless we REALLY 
make a web call to the web service itself. Actually the dumped HttpService is 
an org.apache.felix.http.base.internal.service.PerBundleHttpServiceImpl object. 
So, it seems the HttpService is lazy started.
We do not want the HttpService to be lazy started. The question is, is there 
any config or setting can be used so that when bundleContext.registerService() 
is called the HttpService reference will also be ready?

@Activate
public void activate(ComponentContext ctx)
{
   ... ...
 BundleContext bundleContext = ctx.getBundleContext();
  Hashtable<String, String> params = new Hashtable<>();
  params.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_PATTERN, 
"/currentView.*");
 ... ...
  bundleContext.registerService(Servlet.class, myServlet, params);
 ... ...
}
 Thanks.
Justin

--
Raymond 
Augé<https://urldefense.proofpoint.com/v2/url?u=http-3A__www.liferay.com_web_raymond.auge_profile&d=DwMFaQ&c=8oAR4sJCO2ADPpMooHT9XjkFhHutOc0lw16D57ldqyU&r=PRQSnbTAits5rOqriUqGVNp3ZSD_Y0883f9OHh2uyH8&m=k0K36SHBAFNcg0jZML1rYDdCQsBQu7DbaWMg20ltAoo&s=7SRY5xx5C_khvRmPPm-WJ8VFmr4zekWRO78LiVoEn3g&e=>
 (@rotty3000)
Senior Software Architect Liferay, 
Inc.<https://urldefense.proofpoint.com/v2/url?u=http-3A__www.liferay.com&d=DwMFaQ&c=8oAR4sJCO2ADPpMooHT9XjkFhHutOc0lw16D57ldqyU&r=PRQSnbTAits5rOqriUqGVNp3ZSD_Y0883f9OHh2uyH8&m=k0K36SHBAFNcg0jZML1rYDdCQsBQu7DbaWMg20ltAoo&s=X-HD-i42JbovIZROb6ronxj_PnZlQ95mZXaD3YeIXOY&e=>
 (@Liferay)

Reply via email to