Sometimes when create a Web service in java dont return data but there are not any error. This happenig because the classs interface and the implementation dont have the same annotations. Solution: copy exactily the same funtion interface.
Tuesday, October 4, 2011
Monday, October 3, 2011
Create a Web Service in java without tomcat or glassfish
It`s posible create a Web service without a server. With java JSE 6 it's easy.
Create a interface with a method
package mycountry.entreprise.myservice;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
@WebService(name = "MyService",
targetNamespace = "http://MyService.entreprise.country/",
serviceName = "MyMethod")
public interface MyService {
@WebResult(name="returnValue")
public abstract String[] oneMethod(
@WebParam(name="param1") String param1);
}
Create a implementation of interface
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService(name = "MyService",
targetNamespace = "http://MyService.entreprise.country/",
serviceName = "MyServiceService")
public class MyServiceImpl implements MyService{
public String[] oneMethod(String param1) {
String []data= {"1","AA","1","01};
return data;
}
@WebMethod(exclude = true)
public static void main(String[] args) {
Endpoint.publish(
"http://localhost:8080/service/myservice",
new MyServiceImpl ());
}
}
and create a client for the web service
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
public class Client {
static QName serviceQName = new QName("http://MyService.entreprise.country/","MyServiceService");
static Service myServiceService;
public static void main(String[] args) {
try {
URL wsdlLocation= new URL("http://localhost:8080/service/myservice?WSDL");
myServiceService=Service.create(wsdlLocation, serviceQName);
Cliente client = new Cliente();
client.doTest(args);
} catch(Exception e) {
e.printStackTrace();
}
}
public void doTest(String[] args) {
System.out.println( " Data recieve ... " + myServiceService);
MyService myService=myServiceService.getPort(MyService.class);
String[] listofdatas= myService.oneMethod("send datas");
System.out.println(" incoming data .. :"+ listofdatas.length);
}
}
it's to easy...
Create a interface with a method
package mycountry.entreprise.myservice;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
@WebService(name = "MyService",
targetNamespace = "http://MyService.entreprise.country/",
serviceName = "MyMethod")
public interface MyService {
@WebResult(name="returnValue")
public abstract String[] oneMethod(
@WebParam(name="param1") String param1);
}
Create a implementation of interface
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService(name = "MyService",
targetNamespace = "http://MyService.entreprise.country/",
serviceName = "MyServiceService")
public class MyServiceImpl implements MyService{
public String[] oneMethod(String param1) {
String []data= {"1","AA","1","01};
return data;
}
@WebMethod(exclude = true)
public static void main(String[] args) {
Endpoint.publish(
"http://localhost:8080/service/myservice",
new MyServiceImpl ());
}
}
and create a client for the web service
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
public class Client {
static QName serviceQName = new QName("http://MyService.entreprise.country/","MyServiceService");
static Service myServiceService;
public static void main(String[] args) {
try {
URL wsdlLocation= new URL("http://localhost:8080/service/myservice?WSDL");
myServiceService=Service.create(wsdlLocation, serviceQName);
Cliente client = new Cliente();
client.doTest(args);
} catch(Exception e) {
e.printStackTrace();
}
}
public void doTest(String[] args) {
System.out.println( " Data recieve ... " + myServiceService);
MyService myService=myServiceService.getPort(MyService.class);
String[] listofdatas= myService.oneMethod("send datas");
System.out.println(" incoming data .. :"+ listofdatas.length);
}
}
it's to easy...
Friday, September 9, 2011
javax.wsdl.WSDLException: no content-type: java.net.UnknownServiceException
Whe you read a WSDL from local disc, no error, but if you read a wsdl from a URL throw a exception that:
Retrieving document at WSDLException: faultCode=OTHER_ERROR: Unable to resolve imported document at 'http://localhost:8080/mifichero.wsdl'
no content-type: java.net.UnknownServiceException: no content-type
This error is fixed if change the plugin reference javax.wsdl_1.5 by
javax.wsdl_1.6.2.v200806030405
Retrieving document at WSDLException: faultCode=OTHER_ERROR: Unable to resolve imported document at 'http://localhost:8080/mifichero.wsdl'
no content-type: java.net.UnknownServiceException: no content-type
This error is fixed if change the plugin reference javax.wsdl_1.5 by
javax.wsdl_1.6.2.v200806030405
Friday, May 27, 2011
Create a listener in your bussinnes process BPEL
When you´re execute a BPEL. I dont how debug a error. To see inside of a execution engenner you could implement a listener
import java.util.Properties;
import org.apache.ode.bpel.evt.BpelEvent;
import org.apache.ode.bpel.evt.EventContext;
import org.apache.ode.bpel.iapi.*;
public class Listener implements BpelEventListener {
EventContext context;
@Override
public void onEvent(BpelEvent arg0) {
context =arg0.eventContext;
// TODO Auto-generated method stub
String evento ="";
evento = evento+ "--------------------------------\n";
evento = evento+ "evento: ["+arg0.eventName(arg0)+"] \n";
evento = evento+ "linea : ["+arg0.getLineNo()+"] \n";
evento = evento+ "tipo : ["+arg0.getType()+"] \n";
evento = evento+ getNamesVariables();
evento = evento+ "--------------------------------\n";
System.out.println(evento );
}
@Override
public void shutdown() {
// TODO Auto-generated method stub
;
System.out.println( "-------------shutdown---------------\n");
}
@Override
public void startup(Properties arg0) {
String evento ="";
// TODO Auto-generated method stub
evento = evento+ "--------------------------------\n";
evento = evento+ arg0 ;
evento = evento+ "--------------------------------\n";
System.out.println(evento );
}
private String getNamesVariables(){
String cadena="";
for(String variable :context.getVariableNames()){
cadena = cadena +" variable["+ variable+"]\n";
}
return cadena ;
}
}
build a class and copy inside folder
apache-tomcat-5.5.33\webapps\ode\WEB-INF\classes
if you dont create a file in ode-axis2.properties you to have to create in
apache-tomcat-5.5.33\webapps\ode\WEB-INF\conf
this information are in http://ode.apache.org/ode-execution-events.html
import java.util.Properties;
import org.apache.ode.bpel.evt.BpelEvent;
import org.apache.ode.bpel.evt.EventContext;
import org.apache.ode.bpel.iapi.*;
public class Listener implements BpelEventListener {
EventContext context;
@Override
public void onEvent(BpelEvent arg0) {
context =arg0.eventContext;
// TODO Auto-generated method stub
String evento ="";
evento = evento+ "--------------------------------\n";
evento = evento+ "evento: ["+arg0.eventName(arg0)+"] \n";
evento = evento+ "linea : ["+arg0.getLineNo()+"] \n";
evento = evento+ "tipo : ["+arg0.getType()+"] \n";
evento = evento+ getNamesVariables();
evento = evento+ "--------------------------------\n";
System.out.println(evento );
}
@Override
public void shutdown() {
// TODO Auto-generated method stub
;
System.out.println( "-------------shutdown---------------\n");
}
@Override
public void startup(Properties arg0) {
String evento ="";
// TODO Auto-generated method stub
evento = evento+ "--------------------------------\n";
evento = evento+ arg0 ;
evento = evento+ "--------------------------------\n";
System.out.println(evento );
}
private String getNamesVariables(){
String cadena="";
for(String variable :context.getVariableNames()){
cadena = cadena +" variable["+ variable+"]\n";
}
return cadena ;
}
}
build a class and copy inside folder
apache-tomcat-5.5.33\webapps\ode\WEB-INF\classes
if you dont create a file in ode-axis2.properties you to have to create in
apache-tomcat-5.5.33\webapps\ode\WEB-INF\conf
this information are in http://ode.apache.org/ode-execution-events.html
Thursday, May 12, 2011
ejecutar la funcion doXslTrasnsform
Si quieres hacer transformacion de datos en el BPEL, existe una funcion que ejecuta las hojas de estilo XSLT, para ejecutar esta instruccion dentro de un BPEL necesita la ruta de un XSLT y un node-set. Este node-set no puede ser ni un tipo de dato definido en tu XML Schema, (fichero xsd) ni un mensaje WSDL. Así que lo unico que acepta son elementos definidos. Así que es un poco extraño que si en tu WSDL que no has definido nigún tipo de dato element, tengas que definirlo para realizar una llamada a un XSLT. Así que la solución que propongo es, defines un nuevo fichero Schema XML inserto un element en el fichero, importo el Schema XML en el WSDL, importo el WSDL en el BPEL.
<import location="HelloWorld.wsdl"
namespace="http://ode/bpel/unit-test.wsdl"
importType="http://schemas.xmlsoap.org/wsdl/" />
< ... mas nodos bpel
<variables>
<variable name="myVar" messageType="test:HelloMessage"/>
<variable name="tmpVar" element="data:elementoNuevo" />
<.... mas variables
</variables>
<... proceso
<... copia el mensaje a la variable.
<bpel:assign name="Assign">
<bpel:copy>
<bpel:from>bpel:doXslTransform('urn:/transforma.xsl',$tmpVar)</bpel:from>
<bpel:to variable="otherVar" part="TestPart" />
</bpel:copy>
</bpel:assign>
<import location="HelloWorld.wsdl"
namespace="http://ode/bpel/unit-test.wsdl"
importType="http://schemas.xmlsoap.org/wsdl/" />
< ... mas nodos bpel
<variables>
<variable name="myVar" messageType="test:HelloMessage"/>
<variable name="tmpVar" element="data:elementoNuevo" />
<.... mas variables
</variables>
<... proceso
<... copia el mensaje a la variable.
<bpel:assign name="Assign">
<bpel:copy>
<bpel:from>bpel:doXslTransform('urn:/transforma.xsl',$tmpVar)</bpel:from>
<bpel:to variable="otherVar" part="TestPart" />
</bpel:copy>
</bpel:assign>
Friday, April 29, 2011
Modificar los tipos de datos de un Wsdl por codigo.
Si quieres modificar los tipos de datos de un WSDL usa la implememtacion de la especificacion JSWDL llamada wsdl4j
javax.wsdl.xml.WSDLWriter wsdlWriter= javax.wsdl.factory.WSDLFactory.newInstance().newWSDLWriter();
javax.wsdl.xml.WSDLReader wsdlReader = javax.wsdl.factory.WSDLFactory.newInstance().newWSDLReader();
Definition wsdlDefinition =(Definition) wsdlReader.readWSDL(wsdlfile);
//elimina el esquema de datos antiguo
javax.wsdl.Types type=wsdlDefinition.getTypes();
for (Object e : type.getExtensibilityElements()) {
if (e instanceof com.ibm.wsdl.extensions.schema.SchemaImpl) {
//schema = (com.ibm.wsdl.extensions.schema.SchemaImpl)e;
//TODO:erase all schema
type.getExtensibilityElements().remove(e);
break;
}
}
//importa el el nuevo esquema de tipo de datos
com.ibm.wsdl.extensions.schema.SchemaImpl schema;
schema = (com.ibm.wsdl.extensions.schema.SchemaImpl) wsdlDefinition.getExtensionRegistry()
.createExtension(javax.wsdl.Types.class, new QName("http://www.w3.org/2001/XMLSchema", "schema"));
//com.ibm.wsdl.extensions.schema.SchemaImpl schema = new com.ibm.wsdl.extensions.schema.SchemaImpl();
SchemaReference schemaReference = new SchemaReferenceImpl();
schemaReference.setSchemaLocationURI("http://localhost:8000/allTypes2.xsd");
schema.addInclude(schemaReference);
type.addExtensibilityElement(schema);
wsdlDefinition.addNamespace(ns, nameSpace);
File file2 = new File("newwsdl.wsdl");
BufferedWriter output;
try {
output = new BufferedWriter(new FileWriter(file2));
wsdlWriter.writeWSDL(wsdlDefinition, output);
output.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
javax.wsdl.xml.WSDLWriter wsdlWriter= javax.wsdl.factory.WSDLFactory.newInstance().newWSDLWriter();
javax.wsdl.xml.WSDLReader wsdlReader = javax.wsdl.factory.WSDLFactory.newInstance().newWSDLReader();
Definition wsdlDefinition =(Definition) wsdlReader.readWSDL(wsdlfile);
//elimina el esquema de datos antiguo
javax.wsdl.Types type=wsdlDefinition.getTypes();
for (Object e : type.getExtensibilityElements()) {
if (e instanceof com.ibm.wsdl.extensions.schema.SchemaImpl) {
//schema = (com.ibm.wsdl.extensions.schema.SchemaImpl)e;
//TODO:erase all schema
type.getExtensibilityElements().remove(e);
break;
}
}
//importa el el nuevo esquema de tipo de datos
com.ibm.wsdl.extensions.schema.SchemaImpl schema;
schema = (com.ibm.wsdl.extensions.schema.SchemaImpl) wsdlDefinition.getExtensionRegistry()
.createExtension(javax.wsdl.Types.class, new QName("http://www.w3.org/2001/XMLSchema", "schema"));
//com.ibm.wsdl.extensions.schema.SchemaImpl schema = new com.ibm.wsdl.extensions.schema.SchemaImpl();
SchemaReference schemaReference = new SchemaReferenceImpl();
schemaReference.setSchemaLocationURI("http://localhost:8000/allTypes2.xsd");
schema.addInclude(schemaReference);
type.addExtensibilityElement(schema);
wsdlDefinition.addNamespace(ns, nameSpace);
File file2 = new File("newwsdl.wsdl");
BufferedWriter output;
try {
output = new BufferedWriter(new FileWriter(file2));
wsdlWriter.writeWSDL(wsdlDefinition, output);
output.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Crear una estructura de Map dentro de otra
Si quieres trabajar con una estructura compleja de un Map dentro de otra, usando generic, se realiza de la siguiente manera:
//definicion
Map <javax.xml.namespace.QName , Map < javax.xml.namespace.QName,String>> mapaComplejo;
//y lo inicializamos
mapaSimple=new HashMap<javax.xml.namespace.QName,String>();
mapaSimple.put(new QName("part"),"type");
//inicializamos mapa complejo
mapaComplejo = new HashMap <javax.xml.namespace.QName , Map<javax.xml.namespace.QName,String>>();
mapaComplejo.put(msg.getQName(), mapaSimple);
//definicion
Map <javax.xml.namespace.QName , Map < javax.xml.namespace.QName,String>> mapaComplejo;
//y lo inicializamos
mapaSimple=new HashMap<javax.xml.namespace.QName,String>();
mapaSimple.put(new QName("part"),"type");
//inicializamos mapa complejo
mapaComplejo = new HashMap <javax.xml.namespace.QName , Map<javax.xml.namespace.QName,String>>();
mapaComplejo.put(msg.getQName(), mapaSimple);
Tuesday, April 19, 2011
Compilando apache Ode 1.3.5 con Maven 3, error. Usa Maven 2
En la version 1.3.3 de Apache ODE el compilador es una herramienta muy util para comprobar que hacemos las cosas bien. Lo malo que hay un bug. en la versión 1.3.3, no se muy bien porque, cuando recibes un mensaje y ese mismo mensaje lo usa para invocar a otro WS se arma un lio con los mensajes SOAP y mete dos HEAD en vez de una. Asi que sin mas te bajas la version 1.3.5 y funciona correctamente.
Pues no es así, cuando ejecutas el compilador BPELC.bat lanza un error que no encuentra una clases
Caused by: java.lang.ClassNotFoundException: org.apache.ode.tools.bpelc.cline.BpelC
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: org.apache.ode.tools.bpelc.cline.BpelC. Program will exit.
Esto es debido a que cuando abres el jar de ode-bpel-compiler-1.3.5.jar ves que esta sin compilar las clases que estan dentro. Así que te bajas las fuentes e intentas compilar com Maven 3. Craso error. No compila porque no se que libreria, tiene por dependencia, eso creo yo, la 1.0-incubating-M7b woden.pom que en todos los repositorios que he buscado no lo he encontrado. Como era la 1º vez que uso Maven 3, he pensado que no estaba soportado para Maven 3, así que voy a probar con Maven 2. Yo pensaba que era una tonteria, ya que he leido que solo ha cambiado internamente y que no hay diferencia. Pues con Maven 2 ha compilado perfectamente.
Pues no es así, cuando ejecutas el compilador BPELC.bat lanza un error que no encuentra una clases
Caused by: java.lang.ClassNotFoundException: org.apache.ode.tools.bpelc.cline.BpelC
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: org.apache.ode.tools.bpelc.cline.BpelC. Program will exit.
Esto es debido a que cuando abres el jar de ode-bpel-compiler-1.3.5.jar ves que esta sin compilar las clases que estan dentro. Así que te bajas las fuentes e intentas compilar com Maven 3. Craso error. No compila porque no se que libreria, tiene por dependencia, eso creo yo, la 1.0-incubating-M7b woden.pom que en todos los repositorios que he buscado no lo he encontrado. Como era la 1º vez que uso Maven 3, he pensado que no estaba soportado para Maven 3, así que voy a probar con Maven 2. Yo pensaba que era una tonteria, ya que he leido que solo ha cambiado internamente y que no hay diferencia. Pues con Maven 2 ha compilado perfectamente.
Friday, March 25, 2011
Creacion de un bpel con varias operaciones
Si quieres hacer que un Bpel ejecute varias operaciones, puedes implementar distintas operaciones dependiendo del mesaje de entrada. Pero si el mensaje de entrada es el mismo, puedes hacer que el Bpel un solo EPR, pero que se ejecute distintas partes del Bpel solamente por la acción marcada en la cabecera del mensaje SOAP. Cuando un mensaje SOAP entra en un EPR este es direccionado a la operación del Bpel.
Para implementar cada una de las operaciones incluiremos las etiquetas "onMessage" en ellas se puede definir el "partnerLink" la "operation" y el "portType" y las "variable", pasamos a explicar cada una de ellas.
El partnerLink es el punto de acceso al Wsdl y el portType esta definido en el Wsdl la operacion es la operacion marcada en ese portType y la variable es la instancia del mensaje Wsdl.
la etiqueta onMessage se define dentro de la etiqueta pick de un BPEL. En ella se pueden poner tantos on Message como quieras.
Para implementar cada una de las operaciones incluiremos las etiquetas "onMessage" en ellas se puede definir el "partnerLink" la "operation" y el "portType" y las "variable", pasamos a explicar cada una de ellas.
El partnerLink es el punto de acceso al Wsdl y el portType esta definido en el Wsdl la operacion es la operacion marcada en ese portType y la variable es la instancia del mensaje Wsdl.
la etiqueta onMessage se define dentro de la etiqueta pick de un BPEL. En ella se pueden poner tantos on Message como quieras.
Thursday, March 24, 2011
ejecutar un bpel
Los Bpel tiene un punto de acceso. Estos se definen a través de un fichero Wsdl. Para ejecutar un BPEL es tan fácil como enviar un mensaje SOAP. La aplicacion ODE tiene un comando el cual manda el mensaje SOAP a un EPR (end point reference). Para llamalo esta es la sintaxis.
C:\>sendsoap -o D:\apache-ode-war-1.3.3\apache-ode-war-1.3.3\examples
\response.xml http://localhost:8080/ode/processes/HelloWorld D:\apache-ode-war-1.3.3\apache-ode-war-1.3.3\examples\HelloWorld\testRequest.soap
Ten en cuenta que el mensaje SOAP tiene que tener el formato adecuado con su definición en el WSDL.
He encontrado un problema en ODE, a veces da un error al enviar los mensajes. No hay mas que reiniciar el ODE.
C:\>sendsoap -o D:\apache-ode-war-1.3.3\apache-ode-war-1.3.3\examples
\response.xml http://localhost:8080/ode/processes/HelloWorld D:\apache-ode-war-1.3.3\apache-ode-war-1.3.3\examples\HelloWorld\testRequest.soap
Ten en cuenta que el mensaje SOAP tiene que tener el formato adecuado con su definición en el WSDL.
He encontrado un problema en ODE, a veces da un error al enviar los mensajes. No hay mas que reiniciar el ODE.
Monday, March 21, 2011
Creacion de un bpel partiendo de un WSDL
Un Bpel es un proceso el cual tiene una entrada, un conjunto de operaciones y una salida. Para editar un bpel tienes el Eclipse Java EE IDE for Web Developers. Y para ejecutar el bpel tienes el motor de ejecucion de Apache ODE.
Los puntos de entrada y de salilda de los bpel se llaman Receive y Reply. Para que un Bpel esté accesible, se tiene que crear un acceso a través de un Wsdl. Es decir, para llamar a un proceso Bpel hay que ejecutar una llamada a un WS. Además cualquier punto de aceso, ya sea para llamar a un WS o para dejar accesible el bpel a través de un WS tienes que crear un PartnerLink. Los Bpel son procesos abstractos, es decir no tiene un punto de acceso defnido, tienes un interfaz . El punto de acceso o implementacion del servicio se vincula en tiempo de despliegue del Bpel. En ODE cuando despliegas un servicio lo vinculas con un EPR (end point reference) con el fichero deploy.xml, en el cual indicas el partnetlink con el binding del Web service. Por todo esto un Partnerlink es una asociacion a un PortType de un Wsdl.
Un proceso básico de un Bpel se prodria definir de la siguiente manera:
Paso 1
Un WS simple con un servicio que tiene operacion que contiene un mensaje de entrada y un mensaje de salida, todo esto esta definido en un portType. La implementacion del servicio esta definido en un ERP.
Paso 2
Para creamos un Bpel e incluimos el PartnerLink al PortType y creamos 3 acciones una de entrada una invocacion y una de salidad, es decir receive invoke reply. creamos otro PartnerLink al portType
<process name="process"
xmlns:tns="urn:process/bpel/process/"
xmlns:bpel="http://docs.oasis-open.org/wsbpel/2.0/process/executable"
xmlns="http://docs.oasis-open.org/wsbpel/2.0/process/executable"
suppressJoinFailure="no"
xmlns:nshotel="http://hotel/reservadehotel/"
xmlns:nsimport="urn:import:service">
<bpel:import namespace="urn:import:service" location="process.wsdl"
importType="http://schemas.xmlsoap.org/wsdl/"/>
<partnerLinks>
<bpel:partnerLink name="hotelPartner"
partnerLinkType="nsimport:hotelPLT"
myRole="hotelRole"
partnerRole="hotelRole" />
<bpel:partnerLink name="hotelPartnerInvoke"
partnerLinkType="nsimport:hotelPLT"
partnerRole="hotelRoleInvoke" />
</partnerLinks>
<variables>
<variable name="input" messageType="nshotel:messageRequest"/>
<variable name="output" messageType="nshotel:messageResponse"/>
</variables>
<sequence name="MainSequence">
<bpel:receive name="receiveInput" partnerLink="hotelPartner"
createInstance="yes" operation="bookRoom" portType="nshotel:hotel" variable="input"/>
<bpel:invoke name="Invoke" partnerLink="hotelPartnerInvoke"
operation="bookRoom" portType="nshotel:hotel"
outputVariable="output" inputVariable="input"></bpel:invoke>
<bpel:reply name="replyOutput" partnerLink="hotelPartner"
operation="bookRoom" portType="nshotel:hotel"
variable="output" />
</sequence>
</process>
Paso 3
Creamos un WSDL con una referencia a ODE importando el WSDL del paso 1, e incluimos los ParnetLink para hacer de interface del BPEL y creamos una implementacion del WS para que nuestro BPEL pueda ser llamado
<plnk:partnerLinkType name="hotelPLT">
<plnk:role name="hotelRole" portType="nshotel:hotel" />
<plnk:role name="hotelRoleInvoke" portType="nshotel:hotel" />
</plnk:partnerLinkType>
<import location="hotel.wsdl" namespace="http://hotel/reservadehotel" />
<wsdl:binding name="HotelSoapBinding" type="nshotel:hotel" >
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="bookRoom">
<soap:operation
soapAction="http://hotel/reservadehotel/bookRoom" />
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="HotelService">
<wsdl:port name="HotelSoapBinding" binding="nsimport:HotelSoapBinding">
<soap:address location="http://localhost:8080/ode/processes/proceso"/>
</wsdl:port>
</wsdl:service>
Paso 4
Creamos con ayuda de eclipse el fichero de Deploy.xml vinculando a cada PartnetLink una implementacion de PortType para que pueda ser ejecutado.
<deploy xmlns="http://www.apache.org/ode/schemas/dd/2007/03"
xmlns:nshotel="http://hotel/reservadehotel/"
xmlns:nsimport="urn:import:service">
<process name="proceso">
<active>true</active>
<provide partnerLink="hotelPartner">
<service name="nsimport:HotelService" port="HotelSoapBinding"/>
</provide>
<invoke partnerLink="hotelPartnerInvoke">
<service name="nshotel:hotel" port="hotelSOAP"/>
</invoke>
</process>
</deploy>
Los puntos de entrada y de salilda de los bpel se llaman Receive y Reply. Para que un Bpel esté accesible, se tiene que crear un acceso a través de un Wsdl. Es decir, para llamar a un proceso Bpel hay que ejecutar una llamada a un WS. Además cualquier punto de aceso, ya sea para llamar a un WS o para dejar accesible el bpel a través de un WS tienes que crear un PartnerLink. Los Bpel son procesos abstractos, es decir no tiene un punto de acceso defnido, tienes un interfaz . El punto de acceso o implementacion del servicio se vincula en tiempo de despliegue del Bpel. En ODE cuando despliegas un servicio lo vinculas con un EPR (end point reference) con el fichero deploy.xml, en el cual indicas el partnetlink con el binding del Web service. Por todo esto un Partnerlink es una asociacion a un PortType de un Wsdl.
Un proceso básico de un Bpel se prodria definir de la siguiente manera:
Paso 1
Un WS simple con un servicio que tiene operacion que contiene un mensaje de entrada y un mensaje de salida, todo esto esta definido en un portType. La implementacion del servicio esta definido en un ERP.
Paso 2
Para creamos un Bpel e incluimos el PartnerLink al PortType y creamos 3 acciones una de entrada una invocacion y una de salidad, es decir receive invoke reply. creamos otro PartnerLink al portType
<process name="process"
xmlns:tns="urn:process/bpel/process/"
xmlns:bpel="http://docs.oasis-open.org/wsbpel/2.0/process/executable"
xmlns="http://docs.oasis-open.org/wsbpel/2.0/process/executable"
suppressJoinFailure="no"
xmlns:nshotel="http://hotel/reservadehotel/"
xmlns:nsimport="urn:import:service">
<bpel:import namespace="urn:import:service" location="process.wsdl"
importType="http://schemas.xmlsoap.org/wsdl/"/>
<partnerLinks>
<bpel:partnerLink name="hotelPartner"
partnerLinkType="nsimport:hotelPLT"
myRole="hotelRole"
partnerRole="hotelRole" />
<bpel:partnerLink name="hotelPartnerInvoke"
partnerLinkType="nsimport:hotelPLT"
partnerRole="hotelRoleInvoke" />
</partnerLinks>
<variables>
<variable name="input" messageType="nshotel:messageRequest"/>
<variable name="output" messageType="nshotel:messageResponse"/>
</variables>
<sequence name="MainSequence">
<bpel:receive name="receiveInput" partnerLink="hotelPartner"
createInstance="yes" operation="bookRoom" portType="nshotel:hotel" variable="input"/>
<bpel:invoke name="Invoke" partnerLink="hotelPartnerInvoke"
operation="bookRoom" portType="nshotel:hotel"
outputVariable="output" inputVariable="input"></bpel:invoke>
<bpel:reply name="replyOutput" partnerLink="hotelPartner"
operation="bookRoom" portType="nshotel:hotel"
variable="output" />
</sequence>
</process>
Paso 3
Creamos un WSDL con una referencia a ODE importando el WSDL del paso 1, e incluimos los ParnetLink para hacer de interface del BPEL y creamos una implementacion del WS para que nuestro BPEL pueda ser llamado
<plnk:partnerLinkType name="hotelPLT">
<plnk:role name="hotelRole" portType="nshotel:hotel" />
<plnk:role name="hotelRoleInvoke" portType="nshotel:hotel" />
</plnk:partnerLinkType>
<import location="hotel.wsdl" namespace="http://hotel/reservadehotel" />
<wsdl:binding name="HotelSoapBinding" type="nshotel:hotel" >
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="bookRoom">
<soap:operation
soapAction="http://hotel/reservadehotel/bookRoom" />
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="HotelService">
<wsdl:port name="HotelSoapBinding" binding="nsimport:HotelSoapBinding">
<soap:address location="http://localhost:8080/ode/processes/proceso"/>
</wsdl:port>
</wsdl:service>
Paso 4
Creamos con ayuda de eclipse el fichero de Deploy.xml vinculando a cada PartnetLink una implementacion de PortType para que pueda ser ejecutado.
<deploy xmlns="http://www.apache.org/ode/schemas/dd/2007/03"
xmlns:nshotel="http://hotel/reservadehotel/"
xmlns:nsimport="urn:import:service">
<process name="proceso">
<active>true</active>
<provide partnerLink="hotelPartner">
<service name="nsimport:HotelService" port="HotelSoapBinding"/>
</provide>
<invoke partnerLink="hotelPartnerInvoke">
<service name="nshotel:hotel" port="hotelSOAP"/>
</invoke>
</process>
</deploy>
Tuesday, February 22, 2011
Leer un fichero dentro de un Bundle
Cuando se empaqueta un Bundle estes es publicado todo en un jar. Para poder leer, por ejemplo ficheros de congfiguracion dentro del jar hay que hacer lo siguiente:
configurationURI = FileLocator.toFileURL(
FileLocator.find(Activator.getBundleContext().getBundle(), new Path(
"./resources/config.properties"), null)).getPath();
A partir de esta ruta ya puedes abrir el fichero con un new File();
Además que no se te olvide marcar en en fichero build.porperties que publicas el fichero, ya que si no, no te lo incluye en el jar
configurationURI = FileLocator.toFileURL(
FileLocator.find(Activator.getBundleContext().getBundle(), new Path(
"./resources/config.properties"), null)).getPath();
A partir de esta ruta ya puedes abrir el fichero con un new File();
Además que no se te olvide marcar en en fichero build.porperties que publicas el fichero, ya que si no, no te lo incluye en el jar
Monday, February 14, 2011
Como saber la fecha de compilacion de una clase desde GlassFish
Cuando realizas pruebas te interesa saber si estas usando la última versión de tu código compilado. Sobre todo cuando pruebas en un servidor de aplicaciones. Debido a que no se si existe algún método que te lo de, he realizado un pequeño código a partir de lo que he leido por distintos foros.
String classfilename =context.getRealPath("WEB-INF/classes/clasejava.class");
File file = new File(classfilename);
Long lastModified = file.lastModified();
Date date = new Date(lastModified);
context.log("Date compilated :" + date);
Mejoraría si no tuviera que parametrizarlo con el nombre de la clase para mejorarlo.
String classfilename =context.getRealPath("WEB-INF/classes/clasejava.class");
File file = new File(classfilename);
Long lastModified = file.lastModified();
Date date = new Date(lastModified);
context.log("Date compilated :" + date);
Mejoraría si no tuviera que parametrizarlo con el nombre de la clase para mejorarlo.
Thursday, February 3, 2011
Acceder al contexto del servlet desde una implemetacion de web service
¿Como desde una implemetacion de un Web service, puedo leer el contexto de un servlet?
La respuesta a esta pregunta, que a priori es muy sencilla, se vuelve un poco compleja. He estado buscando informacion por la red y he visto que la gente usaba Spring. Pero ¿para que? Así que, he seguido buscando y al final encontré una solucion para el estandar de J2EE 6 .
@webService
public class MiServicio{
@Resource
private WebServiceContext webServiceContext;
ServletContext context;
public boolean damePath(){
if(webServiceContext != null){
context=(ServletContext)webServiceContext.getMessageContext().get(MessageContext.SERVLET_CONTEXT);
return context.getContextPath();
}
}
}
Hay muchos comentarios que al acceder al contexto, devuelve Null. Esto es debido a que cuando llamas a un WS el metodo, no es persistente. Es decir las variables son inicializadas. Así que cada metodo del WS debe aceder a la carga del contexto para que este valor no sea nulo.
La respuesta a esta pregunta, que a priori es muy sencilla, se vuelve un poco compleja. He estado buscando informacion por la red y he visto que la gente usaba Spring. Pero ¿para que? Así que, he seguido buscando y al final encontré una solucion para el estandar de J2EE 6 .
@webService
public class MiServicio{
@Resource
private WebServiceContext webServiceContext;
ServletContext context;
public boolean damePath(){
if(webServiceContext != null){
context=(ServletContext)webServiceContext.getMessageContext().get(MessageContext.SERVLET_CONTEXT);
return context.getContextPath();
}
}
}
Hay muchos comentarios que al acceder al contexto, devuelve Null. Esto es debido a que cuando llamas a un WS el metodo, no es persistente. Es decir las variables son inicializadas. Así que cada metodo del WS debe aceder a la carga del contexto para que este valor no sea nulo.
Thursday, January 13, 2011
Lanzar glassFish en modo debug
En GlassFish he publicado una aplicacion y cada vez que la invoco se cuelga glassfish y me salta una mensaje killed
Para ejecutar GlassFish en modo debug ejecuta desde la consola de comandos o shell
asadmin start-domain --debug [domain-name]
Donde domain-name por defecto es domain1
Una vez realizado este paso puedes obtener la consola de debug ejecutando
desde UNIX systems:
jdb -attach 9009
For Windows:
jdb -connect com.sun.jdi.SocketAttach::hostname=localhost,port=9009
Esta informacion ha sido extraida del documento
http://dlc.sun.com/pdf/821-1752/821-1752.pdf
Para ejecutar GlassFish en modo debug ejecuta desde la consola de comandos o shell
asadmin start-domain --debug [domain-name]
Donde domain-name por defecto es domain1
Una vez realizado este paso puedes obtener la consola de debug ejecutando
desde UNIX systems:
jdb -attach 9009
For Windows:
jdb -connect com.sun.jdi.SocketAttach::hostname=localhost,port=9009
Esta informacion ha sido extraida del documento
http://dlc.sun.com/pdf/821-1752/821-1752.pdf
Creacion de una Feature y un Site, en Eclipse
Una vez que hemos desarrollado unos plugins en Eclipse, si queremos distribuirlos la mejor manera es creando un Site. Pero antes de crear el Site, debemos crear un plugin del tipo Feature. Este plugin Feature, contendrá la lista de todos los plugins necesarios para la correcta ejecucion de nuestros plugins. Para crear un Feature plugins lo que debemos realizar es ir a Eclipse ->proyecto nuevo -> plugins feature el asistente nos mostrará una pantalla en la cual debemos introducir el ID que es el nombre de nuestro plugin feature, el distribuidor la versión. Lo mas importante viene cuando pulsamos siguiente, aparece una pantalla con un boton que "Initialize form a launch configuration" en la cual seleccionaremos nuestro entorno de ejecucion previamente creado.
Una vez acabado, creamos un site en el cual incluimos nuestro bundle feature. pulsamos construir y sincronizar y ya lo tenemos disponible para instalarlo desde el P2 de Eclipse.
Un fallo que me he encontrado ha sido que al probarlo no me encontraba el bundle javax.wsdl [1.4.0 - 1.6.0). Una vez que he mirado en el site tenia el bundle javax.wsdl 1.6.2 ¿como es posible que no lo encuentre? Así que la solución es poner en el fuichero de bundles otra version de bundle. por ejemplo javax.wsdl 1.5.1, y republicamos. Si, pulsas actualizar te borra el cambio realizado.
Otro fallo que te puedes encontrar es que a la hora de publicar una actualizacion en el Site. Eclipse agrupa las acutalizaciones por categoria, si lo tiene así agrupado no te muestra la última actualización. Así que es mejor en en el asistente de P2 quitar la opción de agrupar por categorias.
Una vez acabado, creamos un site en el cual incluimos nuestro bundle feature. pulsamos construir y sincronizar y ya lo tenemos disponible para instalarlo desde el P2 de Eclipse.
Un fallo que me he encontrado ha sido que al probarlo no me encontraba el bundle javax.wsdl [1.4.0 - 1.6.0). Una vez que he mirado en el site tenia el bundle javax.wsdl 1.6.2 ¿como es posible que no lo encuentre? Así que la solución es poner en el fuichero de bundles otra version de bundle. por ejemplo javax.wsdl 1.5.1, y republicamos. Si, pulsas actualizar te borra el cambio realizado.
Otro fallo que te puedes encontrar es que a la hora de publicar una actualizacion en el Site. Eclipse agrupa las acutalizaciones por categoria, si lo tiene así agrupado no te muestra la última actualización. Así que es mejor en en el asistente de P2 quitar la opción de agrupar por categorias.
Subscribe to:
Posts (Atom)