Apache Camel and web services

前端 未结 2 2017
一向
一向 2021-01-19 18:22

I am trying to understand how to integrate Apache Camel with any web service that provides a WSDL to generate its classes to afterward call his methods to return some reques

2条回答
  •  一个人的身影
    2021-01-19 18:30

    You are referring to contract first or top-down development of Web-services. In this approach you generate stub code from the WSDL definitions and use these classes etc in your development. I have done this a lot and I have used WSDL's from service created in .Net, Java, PHP and even Delphi(though Delphi breaks WSI compliance don't even go there).

    CXF will generate classes from just about any WSDL you can point the library at. First thing is that you need to add an entry to your Maven POM file which tell Maven to generate classes from the WSDL for you.

    Add the following to your POM file:

    
        org.apache.cxf
        cxf-codegen-plugin
        get the latest version or the version you want
        
            
            generate-sources
            generate-sources
            
    
                
                ${basedir}/target/generated/src/main/java
                
                
                    
                    
                    URI/FILE PATH OF WSDL HERE
                    
                    
                    -impl <-- use this if you want to implement the service i.e. create it
                    -client <-- us this if you want to generate a client for the service.
                    
                    
                
            
            
            wsdl2java
            
            
        
    
    

    You can now runt he maven goal mvn generate-source to generate the needed stub classes to use this file.

    I normally drop into a processor/bean to do the actual implementation as most of the web-services I produce and or consume have rather complex data structures. However this really depends on the service.

    So in short you can use CXF to generate the stub classes for almost(Delphi guys are you listening?) web-service then use these generated classes in a processor to implement the client and or server.

    UPDATE:

    Based on your example above you are on the right track. First I want to just discuss something about CXF in camel which is an important concept. The CXF beans are a little different than the other beans for example when you see the following code:

    
    
    

    The file component is a producer it produces files after all and the mock component is a consumer as it takes data produced by the file component and consumes it to do its task.

    Web-services twists this concept slightly. When you have a route such as:

    The cxf bean is called a producer as it calls a web service. It gets interesting when you use a cxf bean as a consumer or in the part of your route.

    Here is an example of a web-service consumer:

    
    

    The CXF bean is consuming the web-service call and then sending the message on to various other parts. This allows you to expose something very complex such as downloading a file from an FTP server, enriching the contents to with a JDBC call and then processing the enriched data against a SAP system as web-service. Your route exposes the cxf bean in the as the service the rest of the route can do all the integration but it is exposed as a web-service. VERY powerful concept.

    In your case your web-service bean is a producer or a client. I typically don't use cxf beans for clients as te services I consume can be rather complex and i need the full power of Java to handle these cases. So I will show you how to do it this way.

    So in my world I would do the following camel route:

    
        
            
            
            
        
    
    

    And my processor bean will change to this:

    public class OsvWebServiceProcessor implements Processor
    {
        @Override
        public void process(Exchange exchange) throws Exception
        {
            Message inMessage = exchange.getIn();
    
    
    
           /*
                  SInce i dont have access to the WSDL and XSD I cant say how the following code will look but essentially you would need to call the web-service here in Java code and get the result back.
    
           */
          outSOAPMsg=  siemens_hiq8000.SiemensHiq8000PortType.OperationName(inSOAPMsg)
          //set the reply into the inbody and send onto other components for processing.
          inMessage.setBody(outSOAPMsg);
    
      }
    }
    

    Looking at your code I realised that it appears that your stub classes are not generated correctly. I strongly urge you to add the items described in my post to your POM file. If you could post some of the WSDL and XSD files I could give you more descriptive answer.

提交回复
热议问题