On Wed, Mar 4, 2009 at 10:30 AM, Simon Laws <[email protected]>wrote:

> - Show quoted text -
>
>
> On Wed, Mar 4, 2009 at 10:16 AM, Simon Laws <[email protected]>wrote:
>
>>
>>
>> On Tue, Mar 3, 2009 at 2:34 PM, Dave Sowerby <[email protected]>wrote:
>>
>>> Ok, I've played around with this some more.
>>>
>>> It looks like there's two issues here....
>>>
>>> The first is that the error messages I'm seeing from binding.ws are
>>> misleading "- No JMS connection factories are defined.Will not listen
>>> for any JMS messages" is not an indication that the SOAP/JMS service
>>> is not bound and listening, the service is in fact working.
>>>
>>> Also, with this second entry, I definitely don't see the jms binding
>>> within the generated WSDL, despite the service itself functioning -
>>> I've raised TUSCANY-2900 to reflect this.
>>>
>>> Cheers,
>>>
>>> Dave.
>>> - Show quoted text -
>>>
>>> On Tue, Mar 3, 2009 at 7:16 AM, Dave Sowerby <[email protected]>
>>> wrote:
>>> > Hey Simon,
>>> >
>>> > Thanks for the reply.
>>> >
>>> > I've updated my composite to read:
>>> >
>>> >   <service name="HelloWorldService">
>>> >     <interface.java interface="helloworld.HelloWorldService" />
>>> >     <binding.ws name="SOAPJMSBinding" uri="jms:/..." />
>>> >     <binding.ws name="SOAPHTTPBinding" />
>>> >   </service>
>>> >
>>> > Upon startup the node initialisation outputs the following:
>>> >
>>> > 03-Mar-2009 07:03:00
>>> > org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceProvider start
>>> > INFO: Axis2 JMS
>>> >
>>> URL=jms:/jms/HelloWorldRequestQueue?transport.jms.ConnectionFactoryJNDIName=HelloWorldConnectionFactory&java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory&java.naming.provider.url=t3://localhost:10402
>>> > - Mapping JNDI name : jms/HelloWorldRequestQueue and JMS Destination
>>> > name : hwResMod!HelloWorldRequestQueue against service :
>>> > jms/HelloWorldRequestQueue
>>> > - JMS Transport Receiver (Listener) initialized...
>>> > - Connection factory : TuscanyQueueConnectionFactory initialized...
>>> > - No JMS connection factories are defined.Will not listen for any JMS
>>> messages
>>> > 03-Mar-2009 07:03:00
>>> > org.apache.tuscany.sca.host.webapp.WebAppServletHost addServletMapping
>>> > INFO: Added Servlet mapping: /helloworld/HelloWorldServiceComponent
>>> > - No JMS connection factories are defined.Will not listen for any JMS
>>> messages
>>> >
>>> > From the output it appears that it's getting confused about the
>>> > ConnectionFactory still.  The ?wsdl service is still available, but
>>> > with only one wsdl:binding present in the generated wsdl.
>>> >
>>> > If I remove the <binding.ws name="SOAPHTTPBinding" /> entry, the
>>> > SOAP/JMS service starts absolute fine, without any of the complaints
>>> > about the Connection Factory.
>>> >
>>> > Any ideas?
>>> >
>>> > Cheers,
>>> >
>>> > Dave.
>>> >
>>> >
>>> > On Mon, Mar 2, 2009 at 6:26 PM, Simon Laws <[email protected]>
>>> wrote:
>>> >>
>>> >>
>>> >> On Mon, Mar 2, 2009 at 5:41 PM, Dave Sowerby <[email protected]>
>>> wrote:
>>> >>>
>>> >>> Hi all,
>>> >>>
>>> >>> I have a functional service which is already accessible with
>>> >>> binding.ws, I'd like to make the same service available with
>>> SOAP/JMS
>>> >>> too.
>>> >>>
>>> >>> I've tried this (as an example) with helloworld-ws-reference-jms by
>>> >>> changing the service tag as follows:
>>> >>>
>>> >>>    <service name="HelloWorldService">
>>> >>>      <interface.java interface="helloworld.HelloWorldService" />
>>> >>>      <binding.ws uri="jms:/..." />
>>> >>>      <binding.ws />
>>> >>>    </service>
>>> >>>
>>> >>> When I attempt to start this, I get the following error:
>>> >>>
>>> >>> WARNING: Multiple bindings with the same name for a service: Service
>>> =
>>> >>> HelloWorldService Binding name = HelloWorldService
>>> >>>
>>> >>> Then I get the JMS bound service attempting to start but issues then
>>> >>> occur whilst it attempts to locate the Connection Factory.  In the
>>> end
>>> >>> the only service which is available is the SOAP/HTTP service, so that
>>> >>> I can see the service running and the wsdl in the usual ?wsdl URI.
>>> >>>
>>> >>> This behaviour leads me to believe that multiple bindings of the same
>>> >>> type cannot be used - is this so?  Ideally I'd like to have the two
>>> >>> bindings from the same service - I'd hope to see both bindings in the
>>> >>> generated wsdl.
>>> >>>
>>> >>> Does anyone have any thoughts on whether this should work?
>>> >>>
>>> >>> Cheers,
>>> >>>
>>> >>> Dave.
>>> >>
>>> >> HI Dave
>>> >>
>>> >> This should work but the spec defined rules for how the bindings are
>>> named
>>> >> and hence distinguished. This kicks in when multiple bindings share
>>> the same
>>> >> scheme which doesn't appear the case here. So we'll have to have a
>>> look at
>>> >> how the binding name is being calculated as it would appear that they
>>> are
>>> >> both adopting the default which is the service name. Can you try
>>> giving the
>>> >> bindings an explicit name="" attribute with different names and see
>>> what
>>> >> happens.
>>> >>
>>> >> Regards
>>> >>
>>> >> Simon
>>> >>
>>> >
>>>
>>
>> Hi Dave
>>
>> Thanks for doing some more prodding.
>>
>> On the first issue, we have a JMS transport defined by default in our Axis
>> config regardless of whether JMS is in use so it's complaining that no
>> connection factories are specified for the transport in the case where
>> binding.ws is used with no JMS configuration. I've made a small change
>> locally that moves this configuration to the code so the message doesn't
>> appear. Testing now.
>>
>> Re. the WSDL problem. I've been thinking about this a bit and need to
>> discuss with the others here. I see the same effect as you do in that a
>> component defined as follows:
>>
>>     <component name="HelloWorldServiceComponent">
>>         <implementation.java class="helloworld.HelloWorldImpl" />
>>         <service name="HelloWorldService">
>>             <interface.wsdl interface="
>> http://helloworld#wsdl.interface(HelloWorld)<http://helloworld#wsdl.interface%28HelloWorld%29>"
>> />
>>             <binding.ws wsdlElement="
>> http://helloworld#wsdl.binding(HelloWorldSoapJmsBinding)<http://helloworld#wsdl.binding%28HelloWorldSoapJmsBinding%29>
>> "
>>
>> uri="jms:/queue.sample?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&amp;java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&amp;java.naming.provider.url=tcp://localhost:61619"/>
>>             <binding.ws/>
>>         </service>
>>     </component>
>>
>> Where the WSDL in the cntribution has both WS and JMS bindings. When I
>> ping
>>
>> http://l3aw203:8080/HelloWorldServiceComponent?wsdl
>>
>> What I see is
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <wsdl:definitions name="HelloWorldServiceComponent.HelloWorldService" 
>> targetNamespace="http://helloworld/HelloWorldServiceComponent/HelloWorldService";
>>  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"; 
>> xmlns:tns="http://helloworld/HelloWorldServiceComponent/HelloWorldService"; 
>> xmlns:ns0="http://helloworld"; 
>> xmlns:SOAP11="http://schemas.xmlsoap.org/wsdl/soap/";>
>>
>>
>>   <wsdl:import namespace="http://helloworld"; 
>> location="/HelloWorldServiceComponent?wsdl=wsdl/helloworld.wsdl">
>>
>>
>>     </wsdl:import>
>>   <wsdl:binding name="HelloWorldBinding" type="ns0:HelloWorld">
>>
>>     <SOAP11:binding style="document" 
>> transport="http://schemas.xmlsoap.org/soap/http"/>
>>
>>
>>     <wsdl:operation name="getGreetings">
>>       <SOAP11:operation soapAction="urn:getGreetings"/>
>>
>>
>>       <wsdl:input name="getGreetingsRequest">
>>         <SOAP11:body use="literal"/>
>>
>>       </wsdl:input>
>>       <wsdl:output name="getGreetingsResponse">
>>
>>         <SOAP11:body use="literal"/>
>>       </wsdl:output>
>>
>>     </wsdl:operation>
>>   </wsdl:binding>
>>   <wsdl:service name="HelloWorldService">
>>
>>     <wsdl:port name="HelloWorldPort" binding="tns:HelloWorldBinding">
>>
>>       <SOAP11:address 
>> location="http://192.168.247.1:8080/HelloWorldServiceComponent"/>
>>
>>     </wsdl:port>
>>   </wsdl:service>
>> </wsdl:definitions>
>>
>>
>> Now this is interesting as the address I'm pointing my browser at, i.e.
>> http://l3aw203:8080/HelloWorldServiceComponent, is the endpoint exposed
>> by binding.ws (rather than binding.ws uri="jms:/...") so maybe I would
>> expect just to see the WSDL ws binding information.
>>
>> Asking the question in a slightly different way. If I have just <
>> binding.ws uri="jms:/..."/> where would I have to point my browser at to
>> get the WSDL. Maybe you would expect some proper meta-data exchange protocol
>> for the component service as a whole but we don't have that at the moment.
>> I'll have a chat with the spec people.
>>
>> Regards
>>
>> Simon
>>
>
> So looking at the SCA web service binding spec [1] it
>
> - says all ws bindings for a service will be included in generated WSDL
> - assumes that the transport is soap/http
> - does though say  that..
>
> "265 Additional ports and bindings may be generated in this WSDL document
> for non-web service
> 266 bindings, or web service bindings with non-SOAP requirements. The
> manner in which that is
> 267 done is undefined."
>
> So I guess we have to do something Tuscany specific here and generate a JMS
> binding entry as appropriate.
>
> Regards
>
> Simon
>

I think there is a work around for the lack of JMS binding in the WSDL. If I
change the component description to include a WSDL binding reference on the
non-JMS binding.ws as follows

    <component name="HelloWorldServiceComponent">
        <implementation.java class="helloworld.HelloWorldImpl" />
        <service name="HelloWorldService">
            <interface.wsdl interface="
http://helloworld#wsdl.interface(HelloWorld)" />
            <binding.ws wsdlElement="
http://helloworld#wsdl.binding(HelloWorldSoapJmsBinding)"

uri="jms:/queue.sample?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&amp;java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&amp;java.naming.provider.url=tcp://localhost:61619"/>
            <binding.ws wsdlElement="
http://helloworld#wsdl.binding(HelloWorldSoapBinding)"/>
        </service>
    </component>

I get the following wsdl generated

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="HelloWorldServiceComponent.HelloWorldService"
targetNamespace="http://helloworld/HelloWorldServiceComponent/HelloWorldService";
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/";
xmlns:tns="http://helloworld/HelloWorldServiceComponent/HelloWorldService";
xmlns:ns0="http://helloworld";
xmlns:SOAP11="http://schemas.xmlsoap.org/wsdl/soap/";>
  <wsdl:import namespace="http://helloworld";
location="/HelloWorldServiceComponent?wsdl=wsdl/helloworld.wsdl">
    </wsdl:import>
  <wsdl:service name="HelloWorldService">
    <wsdl:port name="HelloWorldPort" binding="ns0:HelloWorldSoapBinding">
      <SOAP11:address
location="http://192.168.247.1:8080/HelloWorldServiceComponent"/>
    </wsdl:port>
  </wsdl:service>

</wsdl:definitions>


This in turn  references

http://l3aw203:8080/HelloWorldServiceComponent?wsdl=wsdl/helloworld.wsdl

Which I can look at to get the original, non-generated, wsdl with the JMS
binding entry in it..

Simon

Reply via email to