Hi Christan,
Thanks for your reply,
simply use the address:
props.put("org.apache.cxf.ws.address", "/MyService");
and no context. This way each of your services can have its own path and
all will share the http service port.
I had tried that, but that doesn’t quite work either. I get the wrong port, and
‘cxf’ is added to the context:
g! props
System properties:
...
org.osgi.service.http.port = 8088
2017-07-30 11:51:12,624 [INFO ] pool-3-thread-1 TopologyManagerExport:218
TopologyManager: export successful for
{my.service.interfaces.MyService}={org.apache.cxf.ws.address=/MyService,
name=MyServiceImpl, type=internal, service.exported.configs=org.apache.cxf.ws,
service.exported.interfaces=*, service.id=149, service.bundleid=118,
service.scope=singleton}, endpoints:
[{endpoint.framework.uuid=d0b196e5-3e75-0017-138b-f8dd2f9e5e15,
endpoint.id=http://192.168.180.1:8181/cxf/MyService,
endpoint.package.version.my.service.interfaces=4.1.0, endpoint.service.id=149,
name=MyServiceImpl, objectClass=[my.service.interfaces.MyService],
org.apache.cxf.ws.address=http://192.168.180.1:8181/cxf/MyService,
service.bundleid=118, service.imported=true,
service.imported.configs=[org.apache.cxf.ws], service.intents=[SOAP.1_1, HTTP,
SOAP], service.scope=singleton, type=internal}]
Oh, that’s interesting, the port in the endpoint.id and the address above is
incorrect. The wsdl IS available as http://localhost:8088/cxf/MyService?wsdl.
So the only challenge appear to be to remove the ‘cxf’ from the path (the
consumers of the service have the path hardcoded in the remoteservice.xml
file). Any ideas about that?
Thanks,
Erwin
Christian
2017-07-29 19:52 GMT+02:00 Erwin Hogeweg
<[email protected]<mailto:[email protected]>>:
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://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<http://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>
--
--
Christian Schneider
http://www.liquid-reality.de
<https://owa.talend.com/owa/redir.aspx?C=3aa4083e0c744ae1ba52bd062c5a7e46&URL=http%3a%2f%2fwww.liquid-reality.de>
Open Source Architect
http://www.talend.com
<https://owa.talend.com/owa/redir.aspx?C=3aa4083e0c744ae1ba52bd062c5a7e46&URL=http%3a%2f%2fwww.talend.com>
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>