Nice post, this is worth a wiki page -- whenever you want ;)

I have a few remarks:
 * The provider endpoints are not used in this example as the eip routers
redirect to the saaj bindings
   you can use them instead of the saaj bindings by switching the
    <eip:exchange-target service="myns:targetForAxis" /> on the eip routers
to
    <eip:exchange-target service="ns1:AxisWebservice" />
 * On the consumer definitions, the targetInterfaceName is not needed and
will not be used as the
   targetServiceName is specified
 * On the http providers endpoint, the targetService is not used (this is
only for consumers)

Cheers,
Guillaume Nodet

On 7/20/06, Alessio D'Innocenti <[EMAIL PROTECTED]> wrote:

After many, many, too many attempts, finally I have understood how to
expose external webservice, that is how to proxy one or more webservices
(wsdl included).
(servicemix.xml file is attached)

Suppose I have two webservice to proxy at urls
http://pc-webservice:8080/axis/services/AxisWebservice
http://pc-webservice2:8080/xfire/services/XFireWebservice

1) I have to connect the wsdl and the remote webservices to the
endpoints (providers)

                            <http:endpoint service="ns1:AxisWebservice"
                                endpoint="axisWebserviceEP"
targetService="ns1:AxisWebservice"
                                role="provider"

locationURI="http://pc-webservice:8080/axis/services/AxisWebservice";

wsdlResource="http://pc-webservice:8080/axis/services/AxisWebservice?wsdl";
/>
                            <http:endpoint service="ns2:XFireWebservice"
                                endpoint="xfireWebserviceEP"
targetService="ns2:XFireWebservice"
                                role="provider"

locationURI="http://pc-webservice2:8080/xfire/services/XFireWebservice";

wsdlResource="
http://pc-webservice2:8080/xfire/services/XFireWebservice?wsdl";
/>

1) I have to make a connector for riceiving requests form clients
(consumers). I used http-component to make this:

                           <http:endpoint
                                service="ns1:AxisWebservice"
endpoint="axisWebserviceEP"
                                targetService="myns:routerForAxis"
role="consumer" soap="true"

targetInterfaceName="ns1:AxisWebservicePortType"

locationURI="http://localhost:8080/services/AxisService/";

defaultMep="http://www.w3.org/2004/08/wsdl/in-out"; />
                            <http:endpoint service="ns2:XFireWebservice"
                                endpoint="xfireWebserviceEP"
targetService="myns:routerForXFire"
                                role="consumer" soap="true"

                                targetInterfaceName="ns1:XFireWebserviceSEI"

locationURI="http://172.30.10.183:8888/services/XFireService/";

defaultMep="http://www.w3.org/2004/08/wsdl/in-out"; />

3) I have to create an invoker for the webservice

        <sm:activationSpec componentName="axisServiceComponent"
                service="myns:targetForAxis" endpoint="axisService">
                <sm:component>
                    <bean
class="org.apache.servicemix.components.saaj.SaajBinding">
                        <property name="soapAction" value="" />
                        <property name="soapEndpoint">
                            <bean class="javax.xml.messaging.URLEndpoint">
                                <constructor-arg
value="http://pc-webservice:8080/axis/services/AxisWebservice"; />
                            </bean>
                        </property>
                    </bean>
                </sm:component>
            </sm:activationSpec>
            <sm:activationSpec componentName="xfireServiceComponent"
                service="myns:targetForXFire" endpoint="xfireService">
                <sm:component>
                    <bean
class="org.apache.servicemix.components.saaj.SaajBinding">
                        <property name="soapAction" value="" />
                        <property name="soapEndpoint">
                            <bean class="javax.xml.messaging.URLEndpoint">
                                <constructor-arg
value="http://pc-webservice2:8080/xfire/services/XFireWebservice"; />
                            </bean>
                        </property>
                    </bean>
                </sm:component>
            </sm:activationSpec>

4)  Now let's create a service for redirecting the request, for example
the wireTrap router.

            <sm:activationSpec componentName="wireTrapAxis">
                <sm:component>
                    <eip:component>
                        <eip:endpoints>
                            <eip:wire-tap endpoint="wireTrapAxisEndpoint"
                                service="myns:axisWireTrap">
                                <eip:target>
                                    <eip:exchange-target
                                        service="myns:targetForAxis" />
                                </eip:target>
                                <eip:outListener>
                                    <eip:exchange-target
                                        service="myns:trace" />
                                </eip:outListener>
                            </eip:wire-tap>
                        </eip:endpoints>
                    </eip:component>
                </sm:component>
            </sm:activationSpec>
            <sm:activationSpec componentName="wireTrapXFire">
                <sm:component>
                    <eip:component>
                        <eip:endpoints>
                            <eip:wire-tap endpoint="wireTrapXFireEndpoint"
                                service="myns:xfireWireTrap">
                                <eip:target>
                                    <eip:exchange-target
                                        service="myns:targetForXFire" />
                                </eip:target>
                                <eip:outListener>
                                    <eip:exchange-target
                                        service="myns:trace" />
                                </eip:outListener>
                            </eip:wire-tap>
                        </eip:endpoints>
                    </eip:component>
                </sm:component>
            </sm:activationSpec>

The myns:trace service is simply a logger components that log messages

5) The chain is finished now we have the two external webservices
exposed at urls
      http://localhost:8080/services/AxisService/
      http://localhost:8080/services/XFireService/

     and their wsdl

      http://localhost:8080/services/AxisService?wsdl
      http://localhost:8080/services/XFireService?wsdl

6) complete listing of servicemix.xml and some explanation

<!-- Namespaces of the webservices wsdl must match the local namespaces
of the servicemix local services.
    Take a look at the ns1 and ns2 namespaces.
    You can retrieve this namespaces from the first line of the wsdl
document
    as attribute of the root tag definitions.
    <definitions name="AxisWebservice"
targetNamespace="http://axis.webservice.namespace";>

    The myns namespace is a user choosen namespace for dividing external
service from servicemix internal services
-->

<beans xmlns:sm="http://servicemix.apache.org/config/1.0";
    xmlns:eip="http://servicemix.apache.org/eip/1.0";
    xmlns:http="http://servicemix.apache.org/http/1.0";
    xmlns:ns1="http://axis.webservice.namespace";
    xmlns:ns2="http://xfire.webservice.namespace";
    xmlns:myns="http://myNameSpace/servicemix/1.0";>

    <!-- the JBI container -->
    <sm:container id="jbi" useMBeanServer="true"
        createMBeanServer="true" dumpStats="true" statsInterval="10">
        <sm:activationSpecs>
            <sm:activationSpec componentName="provider">
                <sm:component>
                    <http:component>
                        <http:endpoints>
                            <!-- REMEBER: Namespaces of the webservices
wsdl must match the local
                                namespaces of the servicemix local
services.
                                You can retrieve this namespace from the
first line of the wsdl document
                                as attribute of the root tag definitions.
                                <definitions name="AxisWebservice"
targetNamespace="http://axis.webservice.namespace";>

                                The name of the local servicemix service
and targetService
                                (service="ns1:AxisWebservice"
targetService="ns1:AxisWebservice")
                                must match the name of the webservice.
This information is in the wsdl too, as
                                attribute of tag <service
name="AxisWebservice"> (at the end of wsdl)

                                The endpoint name
(endpoint="axisWebserviceEP") is a your choice.

                                The role must be provider
(role="provider")

                                The wsdlResource must point to the wsdl
definition

(wsdlResource="http://pc-webservice:8080/axis/services/AxisWebservice?wsdl
")

                                The locationURI is the address where the
webservice is listening.

(locationURI="http://pc-webservice:8080/axis/services/AxisWebservice";)
                                Also this can be retrieved from wsdl as
attribute of tag
                                <wsdlsoap:address
location="http://pc-webservice:8080/axis/services/AxisWebservice"/>
                                at the end of wsdl
                            -->
                            <http:endpoint service="ns1:AxisWebservice"
                                endpoint="axisWebserviceEP"
targetService="ns1:AxisWebservice"
                                role="provider"

locationURI="http://pc-webservice:8080/axis/services/AxisWebservice";

wsdlResource="http://pc-webservice:8080/axis/services/AxisWebservice?wsdl";
/>
                            <http:endpoint service="ns2:XFireWebservice"
                                endpoint="xfireWebserviceEP"
targetService="ns2:XFireWebservice"
                                role="provider"

locationURI="http://pc-webservice2:8080/xfire/services/XFireWebservice";

wsdlResource="
http://pc-webservice2:8080/xfire/services/XFireWebservice?wsdl";
/>
                        </http:endpoints>
                    </http:component>
                </sm:component>
            </sm:activationSpec>

            <sm:activationSpec componentName="consumer">
                <sm:component>
                    <http:component>
                        <http:endpoints>
                            <!-- The name of the local servicemix
service and endpoint must match the linked provider http:endpoint
                                (service="ns1:AxisWebservice"
endpoint="axisWebserviceEP")

                                The role must be consumer
(role="consumer")

                                The soap attribute must be true for
compliant wsdl (soap="true")

                                The locationURI is the address where
servicemix must expose the webservice.

(locationURI="http://localhost:8080/services/AxisService/";)

                                The targetInterface name is the name of
the interface to expose.
                                You can retrieve this from wsdl as
attribute of tag <portType name="AxisWebservicePortType">
                                in the middle of wsdl.

                                The defaultMep attribute is for
specifying if the endpoint is for in-out (wait for response)

(defaultMep="http://www.w3.org/2004/08/wsdl/in-out";)

                                The targetService is the servicemix
local service to forwarding received message
                                (targetService="myns:routerForAxis")
                            -->
                            <http:endpoint service="ns1:AxisWebservice"
                                endpoint="axisWebserviceEP"
targetService="myns:routerForAxis"
                                role="consumer" soap="true"

targetInterfaceName="ns1:AxisWebservicePortType"

locationURI="http://localhost:8080/services/AxisService/";

defaultMep="http://www.w3.org/2004/08/wsdl/in-out"; />
                            <http:endpoint service="ns2:XFireWebservice"
                                endpoint="xfireWebserviceEP"
targetService="myns:routerForXFire"
                                role="consumer" soap="true"

                                targetInterfaceName="ns1:XFireWebserviceSEI"

locationURI="http://172.30.10.183:8888/services/XFireService/";

defaultMep="http://www.w3.org/2004/08/wsdl/in-out"; />
                        </http:endpoints>
                    </http:component>
                </sm:component>
            </sm:activationSpec>

            <!-- This component invokes the remote service.
                The soapAction property is the default soapAction.
                Without this property set no SOAPAction header is addes
and some
                webservices providers (like Axis) could not work -->
            <sm:activationSpec componentName="axisServiceComponent"
                service="myns:targetForAxis" endpoint="axisService">
                <sm:component>
                    <bean

class="org.apache.servicemix.components.saaj.SaajBinding">
                        <property name="soapAction" value="" />
                        <property name="soapEndpoint">
                            <bean
                                class="javax.xml.messaging.URLEndpoint">
                                <constructor-arg

value="http://pc-webservice:8080/axis/services/AxisWebservice"; />
                            </bean>
                        </property>
                    </bean>
                </sm:component>
            </sm:activationSpec>
            <sm:activationSpec componentName="xfireServiceComponent"
                service="myns:targetForXFire" endpoint="xfireService">
                <sm:component>
                    <bean

class="org.apache.servicemix.components.saaj.SaajBinding">
                        <property name="soapAction" value="" />
                        <property name="soapEndpoint">
                            <bean
                                class="javax.xml.messaging.URLEndpoint">
                                <constructor-arg

value="http://pc-webservice2:8080/xfire/services/XFireWebservice"; />
                            </bean>
                        </property>
                    </bean>
                </sm:component>
            </sm:activationSpec>

            <!-- This is a simple trace component to log messages routed
here -->
            <sm:activationSpec componentName="trace"
                service="int:trace">
                <sm:component>
                    <bean xmlns="http://xbean.org/schemas/spring/1.0";

class="org.apache.servicemix.components.util.TraceComponent" />
                </sm:component>
            </sm:activationSpec>

            <!-- The routing services -->
            <sm:activationSpec componentName="wireTrapAxis">
                <sm:component>
                    <eip:component>
                        <eip:endpoints>
                            <eip:wire-tap
                                endpoint="wireTrapAxisEndpoint"
service="myns:routerForAxis">
                                <eip:target>
                                    <eip:exchange-target
                                        service="myns:targetForAxis" />
                                </eip:target>
                                <eip:outListener>
                                    <eip:exchange-target
                                        service="myns:trace" />
                                </eip:outListener>
                            </eip:wire-tap>
                        </eip:endpoints>
                    </eip:component>
                </sm:component>
            </sm:activationSpec>
            <sm:activationSpec componentName="wireTrapXFire">
                <sm:component>
                    <eip:component>
                        <eip:endpoints>
                            <eip:wire-tap
                                endpoint="wireTrapXFireEndpoint"
                                service="myns:routerForXFire">
                                <eip:target>
                                    <eip:exchange-target
                                        service="myns:targetForXFire" />
                                </eip:target>
                                <eip:outListener>
                                    <eip:exchange-target
                                        service="myns:trace" />
                                </eip:outListener>
                            </eip:wire-tap>
                        </eip:endpoints>
                    </eip:component>
                </sm:component>
            </sm:activationSpec>
        </sm:activationSpecs>
    </sm:container>
</beans>






Reply via email to