Hi,
I have a couple of OSGi services which are available as remote OSGi service
with CXF-DOSGi. The services are registered with the following props, and that
all works fine:
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put("name", "MyServiceImpl");
props.put("type", "internal");
props.put("service.exported.interfaces", "*");
props.put("service.exported.configs", "org.apache.cxf.ws");
props.put("org.apache.cxf.ws.address", "http://" + serviceHost + ":" +
servicePort + "/MyService");
props.put("org.apache.cxf.ws.httpservice.context", "/MyService");
However, I would like to use the port defined with org.osgi.service.http.port
property as the service port. That doesn’t work though because CXF creates a
new instance of JettyHttpDestination for every used port. This is from
JettyHttpDesitination.java where servers for ea. port are created:
protected void retrieveEngine()
throws GeneralSecurityException,
IOException {
if (serverEngineFactory == null) {
return;
}
engine =
serverEngineFactory.retrieveJettyHTTPServerEngine(nurl.getPort());
if (engine == null) {
engine = serverEngineFactory.
createJettyHTTPServerEngine(nurl.getHost(), nurl.getPort(),
nurl.getProtocol());
}
And port 8088 is already claimed by the HttpService registered by CXF:
g! services (objectClass=*HttpService)
{org.osgi.service.http.HttpService,
org.eclipse.equinox.http.servlet.ExtendedHttpService}={service.description=Equinox
Jetty-based Http Service, service.vendor=Eclipse.org<http://Eclipse.org>,
http.port=8088, service.id=64, service.bundleid=31, service.scope=bundle}
"Registered by bundle:"
org.eclipse.equinox.http.servlet_1.1.400.v20130418-1354 [31]
"Bundles using service"
org.apache.cxf.cxf-rt-transports-http_3.1.6 [82]
cxf-dosgi-ri-dsw-cxf_1.7.0 [138]
The CXF-DOSGi
documentation<http://cxf.apache.org/distributed-osgi-reference.html> says about
the org.apache.cxf.ws.httpservice.contex:
"When this property is specified, the OSGi HTTP Service is used to expose the
service, rather than a dedicated Jetty HTTP Server. This property doesn't allow
the specification of a port number, as this is provided by the HTTP Service.
The Distributed OSGi distributions come with Pax-Web, for which configuration
information can be found at http://wiki.ops4j.org/display/paxweb/Configuration,
however other OSGi HTTP Service implementations are potentially configured
differently.”
When I try that, the service is bound to localhost:9000 instead of
0.0.0.0:8088, which seems to happen in
org.apache.cxf.dosgi.dsw.handlers.PojoConfiguration.java:
private String getPojoAddress(Map<String, Object> sd, Class<?> iClass) {
String address = getClientAddress(sd);
if (address != null) {
return address;
}
// If the property is not of type string this will cause an
ClassCastException which
// will be propagated to the ExportRegistration exception property.
Object port = sd.get(Constants.WS_PORT_PROPERTY);
if (port == null) {
port = "9000";
}
address = "http://localhost:" + port + "/" +
iClass.getName().replace('.', '/');
LOG.info("Using a default address: " + address);
return address;
}
I am trying to understand what I am missing for a while now, and every now and
again on a quiet Fri. afternoon (…) I take another stab at it, but I am not
getting much further.
FWIW… the CXF servlet IS registered under the port defined by
org.osgi.service.http.port.
This is all based on
CXF: 3.1.6 and CXF-DOSGi: 1.7.0
Java 8
Eclipse Equinox 3.10.2
I checked the release notes for 1.8.0 but didn’t see anything related to this
issue.
Any suggestions or pointers in the right directions would be greatly
appreciated.
Thanks,
Erwin
Erwin Hogeweg
CTO
3690 Airport Road
Boca Raton, FL 33431
P. +1 (954) 556-6565
M. +1 (561) 306-7395
F. +1 (561) 948-2730
[Seecago]<http://www.seecago.com>