You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by warrior389 <jo...@gmail.com> on 2009/10/06 21:50:42 UTC

How can a jaxws service know its location?

I'm using servicemix (fuse 4.1.0.2) with cxf 2.2.2.1-fuse and the cxf osgi
transport 4.1.0.2-fuse on a windows machine with jdk 6u16.

I'm trying to make a simple jaxws service like the servicemix 
http://servicemix.apache.org/SMX4/cxf-examples.html cxf-osgi example . 
Something like:

<jaxws:endpoint 
  id="helloWorld" 
  implementor="org.apache.servicemix.examples.cxf.HelloWorldImpl"
  address="/HelloWorld"/>

and the WebService annotations are simple. Just @WebService on the
@WebService(endpointInterface =
"org.apache.servicemix.examples.cxf.HelloWorld") on the implementation.

The example page I linked earlier says that the service should be published
at http://localhost:8080/cxf/HelloWorld?wsdl, but for me its at a different
port, http://localhost:8181/cxf/HelloWorld?wsdl.  I had to netstat to find
what port it was listening on.  I can access the WSDL fine and exercise it
with SoapUI, and the example client.

So, I have four questions:
1.  Why is the port different (8080 vs 8181), and how is it determined?
2.  Why is the service at /cxf/HelloWorld, when the jaxws endpoint
definition said it is at /HelloWorld?  I assume some kind of cxf context is
prepended, but how is this controlled and where?  And can I override it in
my service configuration, either spring or annotation?
3.  This is probably the most important.  How can my service know what its
actual location is?  Even if I grab the WebServiceContext using a @Resource
annotation, it only gives me an address of /HelloWorld, not the full
http://localhost:8181/cxf/HelloWorld?wsdl.  I want to be able to register
the service in UDDI.
4.  If I change the address from /HelloWorld to nmr:HelloWorld, how would
the service know its endpoint?

Thanks!!!

-John

-- 
View this message in context: http://www.nabble.com/How-can-a-jaxws-service-know-its-location--tp25775479p25775479.html
Sent from the cxf-user mailing list archive at Nabble.com.


Re: How can a jaxws service know its location?

Posted by Daniel Kulp <dk...@apache.org>.
On Wed October 21 2009 11:10:27 am skarootz wrote:
> Ok, then you say it is possible to change the context "cxf" after 2.2.4,
>  but how is it done?

See the thread:
http://www.nabble.com/Use-of-OSGi-http-service-instead-of-jetty-engine-to25965535.html

Dan


> 
> dkulp wrote:
> > On Tue October 6 2009 3:50:42 pm warrior389 wrote:
> >> I'm using servicemix (fuse 4.1.0.2) with cxf 2.2.2.1-fuse and the cxf
> >> osgi
> >> transport 4.1.0.2-fuse on a windows machine with jdk 6u16.
> >>
> >> I'm trying to make a simple jaxws service like the servicemix
> >> http://servicemix.apache.org/SMX4/cxf-examples.html cxf-osgi example .
> >> Something like:
> >>
> >> <jaxws:endpoint
> >>   id="helloWorld"
> >>   implementor="org.apache.servicemix.examples.cxf.HelloWorldImpl"
> >>   address="/HelloWorld"/>
> >>
> >> and the WebService annotations are simple. Just @WebService on the
> >> @WebService(endpointInterface =
> >> "org.apache.servicemix.examples.cxf.HelloWorld") on the implementation.
> >>
> >> The example page I linked earlier says that the service should be
> >> published
> >> at http://localhost:8080/cxf/HelloWorld?wsdl, but for me its at a
> >> different
> >> port, http://localhost:8181/cxf/HelloWorld?wsdl.  I had to netstat to
> >> find
> >> what port it was listening on.  I can access the WSDL fine and exercise
> >> it
> >> with SoapUI, and the example client.
> >
> > Well, this really depends on which http transport you use and the
> > container
> > it's deployed in (if any).     There really are three options:
> >
> > 1) The "built in" http-jetty HTTP transport.  In this case, the "address"
> > in
> > the config would be a full address (like
> > http://localhost:8080/HelloWorld")
> > and we would bring up Jetty on that exact port and stick the endpoint at
> > that
> > exact address.   We control everything and can do this.   With the sample
> > you
> > mentioned above, if you change the <import> in the config from the osgi
> > http
> > to the cxf-extension-http-jetty.xml file, this should work (providing
> > jetty
> > bundles are available)
> >
> > 2) Servlet transport - in this case, a separate servlet engine is
> > providing
> > the http capabilities and a servlet is registered to handle things.  In
> > this
> > case, the port is completely controlled by the servlet engine (like
> > tomcat defaults to 8080).   Also, the application context and servlet
> > context are controlled by the war name and the config in the web.xml.  
> > The servlet (and
> > thus us), have no control over that.   What worse, we don't even know
> > those
> > things until request time.   In this case, the address is like above
> > ("/HelloWorld"), but the full url is the based on the host/port
> > configured in
> > the servlet container + the app context (normally the war name) + servlet
> > context (configured in the wars web.xml) + the above address.  Example:
> > http://localhost:8080/myapp/services/HelloWorld
> >
> > 3) OSGi transport - this is what you are using above.   It's very similar
> > to
> > the servlet transport.   The port is controlled by the osgi container. 
> > In your case, smx defaults to 8181.    The context currently is hard
> > coded to "cxf", but with 2.2.4, we've moved the OSGI transport from smx
> > into cxf and
> > added some OSGI config service things for it so you can change that.
> >
> >> So, I have four questions:
> >> 1.  Why is the port different (8080 vs 8181), and how is it determined?
> >> 2.  Why is the service at /cxf/HelloWorld, when the jaxws endpoint
> >> definition said it is at /HelloWorld?  I assume some kind of cxf context
> >> is
> >> prepended, but how is this controlled and where?  And can I override it
> >> in
> >> my service configuration, either spring or annotation?
> >
> > See above.
> >
> >> 3.  This is probably the most important.  How can my service know what
> >> its
> >> actual location is?  Even if I grab the WebServiceContext using a
> >> @Resource
> >> annotation, it only gives me an address of /HelloWorld, not the full
> >> http://localhost:8181/cxf/HelloWorld?wsdl.  I want to be able to
> >> register the service in UDDI.
> >
> > UNFORTUNATLY, due to limitations in the Servlet specs and such, there is
> > not a
> > way to know it until the first time someone actually hits the service.
> >
> > :-(
> >
> > What's worse, it can be different from request to request.   For example,
> > the
> > container can be configured to listen on both 8080 and 9090 and requests
> > can
> > come in from both.
> >
> >
> > Dan
> >
> >> 4.  If I change the address from /HelloWorld to nmr:HelloWorld, how
> >> would the service know its endpoint?
> 

-- 
Daniel Kulp
dkulp@apache.org
http://www.dankulp.com/blog

Re: How can a jaxws service know its location?

Posted by skarootz <ha...@gmail.com>.
Ok, then you say it is possible to change the context "cxf" after 2.2.4, but
how is it done?



dkulp wrote:
> 
> On Tue October 6 2009 3:50:42 pm warrior389 wrote:
>> I'm using servicemix (fuse 4.1.0.2) with cxf 2.2.2.1-fuse and the cxf
>> osgi
>> transport 4.1.0.2-fuse on a windows machine with jdk 6u16.
>> 
>> I'm trying to make a simple jaxws service like the servicemix
>> http://servicemix.apache.org/SMX4/cxf-examples.html cxf-osgi example .
>> Something like:
>> 
>> <jaxws:endpoint
>>   id="helloWorld"
>>   implementor="org.apache.servicemix.examples.cxf.HelloWorldImpl"
>>   address="/HelloWorld"/>
>> 
>> and the WebService annotations are simple. Just @WebService on the
>> @WebService(endpointInterface =
>> "org.apache.servicemix.examples.cxf.HelloWorld") on the implementation.
>> 
>> The example page I linked earlier says that the service should be
>> published
>> at http://localhost:8080/cxf/HelloWorld?wsdl, but for me its at a
>> different
>> port, http://localhost:8181/cxf/HelloWorld?wsdl.  I had to netstat to
>> find
>> what port it was listening on.  I can access the WSDL fine and exercise
>> it
>> with SoapUI, and the example client.
> 
> Well, this really depends on which http transport you use and the
> container 
> it's deployed in (if any).     There really are three options:
> 
> 1) The "built in" http-jetty HTTP transport.  In this case, the "address"
> in 
> the config would be a full address (like
> http://localhost:8080/HelloWorld") 
> and we would bring up Jetty on that exact port and stick the endpoint at
> that  
> exact address.   We control everything and can do this.   With the sample
> you 
> mentioned above, if you change the <import> in the config from the osgi
> http 
> to the cxf-extension-http-jetty.xml file, this should work (providing
> jetty 
> bundles are available)
> 
> 2) Servlet transport - in this case, a separate servlet engine is
> providing 
> the http capabilities and a servlet is registered to handle things.  In
> this 
> case, the port is completely controlled by the servlet engine (like tomcat 
> defaults to 8080).   Also, the application context and servlet context are 
> controlled by the war name and the config in the web.xml.   The servlet
> (and 
> thus us), have no control over that.   What worse, we don't even know
> those 
> things until request time.   In this case, the address is like above 
> ("/HelloWorld"), but the full url is the based on the host/port configured
> in 
> the servlet container + the app context (normally the war name) + servlet 
> context (configured in the wars web.xml) + the above address.  Example:
> http://localhost:8080/myapp/services/HelloWorld
> 
> 3) OSGi transport - this is what you are using above.   It's very similar
> to 
> the servlet transport.   The port is controlled by the osgi container.  In 
> your case, smx defaults to 8181.    The context currently is hard coded to 
> "cxf", but with 2.2.4, we've moved the OSGI transport from smx into cxf
> and 
> added some OSGI config service things for it so you can change that.   
> 
> 
>> So, I have four questions:
>> 1.  Why is the port different (8080 vs 8181), and how is it determined?
>> 2.  Why is the service at /cxf/HelloWorld, when the jaxws endpoint
>> definition said it is at /HelloWorld?  I assume some kind of cxf context
>> is
>> prepended, but how is this controlled and where?  And can I override it
>> in
>> my service configuration, either spring or annotation?
> 
> See above.
> 
>> 3.  This is probably the most important.  How can my service know what
>> its
>> actual location is?  Even if I grab the WebServiceContext using a
>> @Resource
>> annotation, it only gives me an address of /HelloWorld, not the full
>> http://localhost:8181/cxf/HelloWorld?wsdl.  I want to be able to register
>> the service in UDDI.
> 
> UNFORTUNATLY, due to limitations in the Servlet specs and such, there is
> not a 
> way to know it until the first time someone actually hits the service.  
> :-(  
> What's worse, it can be different from request to request.   For example,
> the 
> container can be configured to listen on both 8080 and 9090 and requests
> can 
> come in from both.   
> 
> 
> Dan
> 
>> 4.  If I change the address from /HelloWorld to nmr:HelloWorld, how would
>> the service know its endpoint?
> 
> 
> 
> -- 
> Daniel Kulp
> dkulp@apache.org
> http://www.dankulp.com/blog
> 
> 

-- 
View this message in context: http://www.nabble.com/How-can-a-jaxws-service-know-its-location--tp25775479p25994411.html
Sent from the cxf-user mailing list archive at Nabble.com.


Re: How can a jaxws service know its location?

Posted by Daniel Kulp <dk...@apache.org>.
On Tue October 6 2009 3:50:42 pm warrior389 wrote:
> I'm using servicemix (fuse 4.1.0.2) with cxf 2.2.2.1-fuse and the cxf osgi
> transport 4.1.0.2-fuse on a windows machine with jdk 6u16.
> 
> I'm trying to make a simple jaxws service like the servicemix
> http://servicemix.apache.org/SMX4/cxf-examples.html cxf-osgi example .
> Something like:
> 
> <jaxws:endpoint
>   id="helloWorld"
>   implementor="org.apache.servicemix.examples.cxf.HelloWorldImpl"
>   address="/HelloWorld"/>
> 
> and the WebService annotations are simple. Just @WebService on the
> @WebService(endpointInterface =
> "org.apache.servicemix.examples.cxf.HelloWorld") on the implementation.
> 
> The example page I linked earlier says that the service should be published
> at http://localhost:8080/cxf/HelloWorld?wsdl, but for me its at a different
> port, http://localhost:8181/cxf/HelloWorld?wsdl.  I had to netstat to find
> what port it was listening on.  I can access the WSDL fine and exercise it
> with SoapUI, and the example client.

Well, this really depends on which http transport you use and the container 
it's deployed in (if any).     There really are three options:

1) The "built in" http-jetty HTTP transport.  In this case, the "address" in 
the config would be a full address (like http://localhost:8080/HelloWorld") 
and we would bring up Jetty on that exact port and stick the endpoint at that  
exact address.   We control everything and can do this.   With the sample you 
mentioned above, if you change the <import> in the config from the osgi http 
to the cxf-extension-http-jetty.xml file, this should work (providing jetty 
bundles are available)

2) Servlet transport - in this case, a separate servlet engine is providing 
the http capabilities and a servlet is registered to handle things.  In this 
case, the port is completely controlled by the servlet engine (like tomcat 
defaults to 8080).   Also, the application context and servlet context are 
controlled by the war name and the config in the web.xml.   The servlet (and 
thus us), have no control over that.   What worse, we don't even know those 
things until request time.   In this case, the address is like above 
("/HelloWorld"), but the full url is the based on the host/port configured in 
the servlet container + the app context (normally the war name) + servlet 
context (configured in the wars web.xml) + the above address.  Example:
http://localhost:8080/myapp/services/HelloWorld

3) OSGi transport - this is what you are using above.   It's very similar to 
the servlet transport.   The port is controlled by the osgi container.  In 
your case, smx defaults to 8181.    The context currently is hard coded to 
"cxf", but with 2.2.4, we've moved the OSGI transport from smx into cxf and 
added some OSGI config service things for it so you can change that.   


> So, I have four questions:
> 1.  Why is the port different (8080 vs 8181), and how is it determined?
> 2.  Why is the service at /cxf/HelloWorld, when the jaxws endpoint
> definition said it is at /HelloWorld?  I assume some kind of cxf context is
> prepended, but how is this controlled and where?  And can I override it in
> my service configuration, either spring or annotation?

See above.

> 3.  This is probably the most important.  How can my service know what its
> actual location is?  Even if I grab the WebServiceContext using a @Resource
> annotation, it only gives me an address of /HelloWorld, not the full
> http://localhost:8181/cxf/HelloWorld?wsdl.  I want to be able to register
> the service in UDDI.

UNFORTUNATLY, due to limitations in the Servlet specs and such, there is not a 
way to know it until the first time someone actually hits the service.   :-(  
What's worse, it can be different from request to request.   For example, the 
container can be configured to listen on both 8080 and 9090 and requests can 
come in from both.   


Dan

> 4.  If I change the address from /HelloWorld to nmr:HelloWorld, how would
> the service know its endpoint?



-- 
Daniel Kulp
dkulp@apache.org
http://www.dankulp.com/blog