mercredi 31 mars 2010

Appeler un composite SCA en java

Voici un mémo expliquant comment appeler un composite SCA de Soa Suite 11G PS1 depuis une classe java.

Avant tout il faut créer un projet SOA comprenant un composant Bpel (par exemple) qui fait un "hello world" en synchrone ou en asynchrone ...

Ensuite dans le composite il suffit de rajouter une interface "Direct Binding Service"




Nous avons donc ci-dessus un composite offrant une interface Web Service et une interface type RMI.


Oracle SOA suite propose nativement l'ensemble des API java afin de déclencher un composite SCA en RMI.


Pour cela il suffit de créer une connexion RMI via l'api "Locator" décrite dans ce code ci-dessous:


public class ClassTestRmi {
public ClassTestRmi() {
super();

Hashtable jndiProps = new Hashtable();
jndiProps.put(Context.PROVIDER_URL, "t3://10.0.0.1:7001/soa-infra");
jndiProps.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
jndiProps.put(Context.SECURITY_PRINCIPAL, "weblogic");
jndiProps.put(Context.SECURITY_CREDENTIALS, "welcome1");
jndiProps.put("dedicated.connection", "true");

Locator locator = null;
try {
// connect to the soa server
locator=LocatorFactory.createLocator(jndiProps);
System.out.println("Got locator : "+ locator.toString());
// find composite default domain, Helloworld Composite, version 1.0
CompositeDN compositedn = new CompositeDN("default", "Project1RMI", "1.0");

// call the direct binding of the Helloworld composite - spécifier le nom de l'interface de direct binding
DirectConnection conn = locator.createDirectConnection(compositedn,"Service1RMI");


String
inputPayload =
"
\n" +
VOTRE XML d'appel du composite (sans les balise SOAP)
"
\n";

DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = docBuilderFactory.newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(inputPayload)));
Element root = doc.getDocumentElement();

//

//
//


Map partData = new HashMap();
// have to use payload see BPELProcess1RequestMessage
partData.put("payload", root);

Payload payload = PayloadFactory.createXMLPayload(partData);

//Messages are created using the MessageFactory
Message request = XMLMessageFactory.getInstance().createMessage();
request.setPayload(payload);

//

//

//
//
//

//

// this is a request-reply service so we need to use conn.request else use conn.post
// need to provide operation name so we need to use process
Message response = conn.request("process", request);

TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
transformer.setOutputProperty("indent", "yes");
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);

//

//
//

// need to use payload again
DOMSource source = new DOMSource((Node)response.getPayload().getData().get("payload"));

transformer.transform(source, result);
System.out.println("Result\n"+sw.toString());

} catch (Exception e) {
e.printStackTrace();
}

}




Je vous propose en attachement dans ce zip mon projet SOA composite, avec le projet Jdev d'appel en java : ICI



ps: Il est important d'importer les jar nécessaires aux api java. Voici la liste:


Aucun commentaire: