Search This Blog

Thursday, July 28, 2011

Calling a Soa Suite Direct Binding Service from Java & OSB

I was trying to connect Oracle Soa Suite 11G R1 PS1 with the OSB when I saw this new Direct Binding Service in the Soa Suite 11G. This direct binding make it possible to start this RMI service from OSB or Java. In a previous blog I already called a Soa Service from Java using the ADF binding but this direct binding makes it also possible to call this also from OSB using the SB transport . In this Blog I will call this RMI synchronous service from Java, I can not use this binding in OSB 10.3.1, probably in the next version of the OSB I can.

First we add the Direct Binding Service to exposed Services side of the composite and use the WSDL of one of the other exposed services and add a Wire to the Component.
In the source view of the composite xml you can see that this service uses the direct binding.

  1. <service name="RMIService" ui:wsdlLocation="BPELProcess1.wsdl">  
  2. <interface.wsdl interface="http://xmlns.oracle.com/HelloWorld/Helloworld/BPELProcess1#wsdl.interface(BPELProcess1)"/>  
  3. <binding.direct/>  
  4. </service>  

To see the WSDL of this service go to http://localhost:8001/soa-infra/ and select your RMI service.
  1. package nl.whitehorses.soa.client;  
  2.   
  3. import java.io.StringWriter;  
  4. import java.io.StringReader;  
  5.   
  6. import java.util.Hashtable;  
  7. import java.util.Map;  
  8. import java.util.HashMap;  
  9.   
  10. import javax.naming.Context;  
  11.   
  12. import javax.xml.transform.Transformer;  
  13. import javax.xml.transform.TransformerFactory;  
  14. import javax.xml.transform.dom.DOMSource;  
  15. import javax.xml.transform.stream.StreamResult;  
  16.   
  17. import oracle.soa.api.PayloadFactory;  
  18. import oracle.soa.api.XMLMessageFactory;  
  19. import oracle.soa.api.invocation.DirectConnection;  
  20. import oracle.soa.api.message.Message;  
  21. import oracle.soa.api.message.Payload;  
  22.   
  23. import oracle.soa.management.CompositeDN;  
  24. import oracle.soa.management.facade.Locator;  
  25. import oracle.soa.management.facade.LocatorFactory;  
  26.   
  27. import org.w3c.dom.Element;  
  28. import org.w3c.dom.Node;  
  29. import org.w3c.dom.Document;  
  30.   
  31. import javax.xml.parsers.DocumentBuilder;  
  32. import javax.xml.parsers.DocumentBuilderFactory;  
  33.   
  34. import org.xml.sax.InputSource;  
  35.   
  36.   
  37. public class StartRMIProcess {  
  38.   
  39.  public StartRMIProcess() {  
  40.      super();  
  41.   
  42.      Hashtable jndiProps = new Hashtable();  
  43.      jndiProps.put(Context.PROVIDER_URL, "t3://localhost:8001/soa-infra");  
  44.      jndiProps.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");  
  45.      jndiProps.put(Context.SECURITY_PRINCIPAL, "weblogic");  
  46.      jndiProps.put(Context.SECURITY_CREDENTIALS, "weblogic1");  
  47.      jndiProps.put("dedicated.connection""true");  
  48.   
  49.      Locator locator = null;  
  50.      try {  
  51.          // connect to the soa server  
  52.          locator = LocatorFactory.createLocator(jndiProps);  
  53.   
  54.          // find composite  default domain,  Helloworld Composite, version 1.0  
  55.          CompositeDN compositedn = new CompositeDN("default""Helloworld""1.0");  
  56.   
  57.          // call the direct binding of the Helloworld composite  
  58.          DirectConnection conn = locator.createDirectConnection(compositedn,"RMIService");  
  59.   
  60.   
  61.          String inputPayload =  
  62.          "<client:process xmlns:client=\"http://xmlns.oracle.com/HelloWorld/Helloworld/BPELProcess1\">\n" +  
  63.          "   <client:input>hello</client:input>\n" +  
  64.          "</client:process>\n" ;  
  65.         
  66.          DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();  
  67.          DocumentBuilder builder = docBuilderFactory.newDocumentBuilder();  
  68.          Document doc =  builder.parse(new InputSource(new StringReader(inputPayload)));  
  69.          Element  root = doc.getDocumentElement();  
  70.   
  71.          //<wsdl:message name="BPELProcess1RequestMessage">  
  72.          //        <wsdl:part name="payload" element="client:process"/>  
  73.          //</wsdl:message>  
  74.   
  75.          Map<String, Element> partData = new HashMap<String,Element>();  
  76.          // have to use payload see BPELProcess1RequestMessage  
  77.          partData.put("payload", root);  
  78.   
  79.          Payload<Element> payload = PayloadFactory.createXMLPayload(partData);  
  80.   
  81.          //Messages are created using the MessageFactory  
  82.          Message<Element> request = XMLMessageFactory.getInstance().createMessage();  
  83.          request.setPayload(payload);  
  84.   
  85.          //<wsdl:portType name="BPELProcess1">  
  86.          //        <wsdl:operation name="process">  
  87.          //                <wsdl:input  message="client:BPELProcess1RequestMessage" />  
  88.          //                <wsdl:output message="client:BPELProcess1ResponseMessage"/>  
  89.          //        </wsdl:operation>  
  90.          //</wsdl:portType>  
  91.          // this is a request-reply service so we need to use conn.request else use conn.post  
  92.          // need to provide operation name so we need to use process  
  93.          Message<Element> response = conn.request("process", request);  
  94.   
  95.          TransformerFactory tFactory = TransformerFactory.newInstance();  
  96.          Transformer transformer = tFactory.newTransformer();  
  97.          transformer.setOutputProperty("indent""yes");  
  98.          StringWriter sw = new StringWriter();  
  99.          StreamResult result = new StreamResult(sw);  
  100.   
  101.          //<wsdl:message name="BPELProcess1ResponseMessage">  
  102.          //        <wsdl:part name="payload" element="client:processResponse"/>  
  103.          //</wsdl:message>  
  104.          // need to use payload again  
  105.          DOMSource source =  new DOMSource((Node)response.getPayload().getData().get("payload"));  
  106.   
  107.          transformer.transform(source, result);  
  108.          System.out.println("Result\n"+sw.toString());  
  109.     
  110.      } catch (Exception e) {  
  111.          e.printStackTrace();  
  112.      }  
  113.  }  
  114.   
  115.  public static void main(String[] args) {  
  116.      StartRMIProcess startRMIProcess = new StartRMIProcess();  
  117.  }  
  118. }  

No comments:

Post a Comment