Archive for August, 2010

  • Axis WS Client Usando AXIOM

    0

    Apache Axis2, el cual ya esta siendo dejado de lado por su complejidad y el surgimiento de otros web services stack como Metro y Apache CXF con mayor performance, brinda a los usuarios variadas opciones de data bindings.

    Este artículo muestra como llamar a un Web Service utilizando Axis Object Model. Esta técnica es de "bajo nivel", parecida a la API de JAX-WS Provider/Dispatcher. Utilizar AXIOM es mejor que trabajar con XML DOM elements pero ciertamente más complejo que hacerlo con ADB o JAXB.

    Primero los imports de las classes utilizadas

    import org.apache.axiom.om.OMAbstractFactory;
    import org.apache.axiom.om.OMElement;
    import org.apache.axiom.om.OMFactory;
    import org.apache.axiom.om.OMNamespace;
    import org.apache.axis2.addressing.EndpointReference;
    import org.apache.axis2.client.Options;
    import org.apache.axis2.client.ServiceClient;

     

    Y ahora el código para el llamado al WS

    OMFactory factory = OMAbstractFactory.getOMFactory();
    OMNamespace omNs = fac.createOMNamespace("yournamespace", "someprefix");
    OMElement method = fac.createOMElement("theActionName", omNs);
    
    OMElement param1 = fac.createOMElement("someParam", omNs);
    param1.setText("someValue");
    method.addChild(param1);
    
    String url = "http://server/webserviceURL";
    ServiceClient client = new ServiceClient();
    Options opts = new Options();
    // es super importante, el timeout siempre lo define
    // el cliente, hay que tener en cuenta que si la operación
    // es larga es importante darle un buen timeout en ms
    opts.setTimeOutInMilliSeconds(300000);
    opts.setTo(new EndpointReference(url));
    opts.setAction("theActionName");
    client.setOptions(opts);
    OMElement res = client.sendReceive(method);
    
    // finalmente la respuesta que es nada mas
    // y nada menos que un XML
    System.out.println(res);

     

    La implementacion de AXIOM no es sencilla pero es lo más versátil en cuanto a customización de un request a un WebService.

  • Como Usar FTP en Shell Script

    2

    A diario hago backup en mis servers pero los archivos quedan residentes en las mismas máquinas. Obviamente mientras el backup esté mas lejos de los datos originales menores son las probabilidades de no recuperarse de un desastre computacional.

    Lo ideal seria hacer una transmisión FTPS o SFTP si estás preocupado por algun sniffer o similar, pero bueno, aquí vamos a ver la solución fácil y rápida con un shell script muy sencillo.

    #!/bin/sh
    HOST='www.myserver.com'
    USER='myuser'
    PASS='mypassword'
    #voy a hacer backup del folder creado ayer
    YESTERDAY=$(date --date='1 day ago' +%Y%m%d)
    
    # pensemos que dejamos los backups diariamente en este path
    # los cuales estan en folders con formato fecha cual
    # 20100227 (YYYYMMDD)
    cd /home/myuser/backups/
    # creo localmente un folder con el mismo nombre
    mkdir $YESTERDAY
    cd $YESTERDAY
    
    ftp -n $HOST <<END_SCRIPT
    quote USER $USER
    quote PASS $PASS
    # aca vamos a la misma locacion pero en el server
    cd /home/myuser/backups/$YESTERDAY
    # aca es donde bajamos el archivo que queremos backupear
    get backup.tar
    quit
    END_SCRIPT
    exit 0
    

    Y listo, solo nos falta una entrada en el cron para correr esto a diario. Para ello:

    crontab -e

    Entonces agregamos el script para ser llamado diariamente

    0 1 * * * /usr/share/scripts/mybackupscript.sh

    Esto soluciona grandes dolores de cabeza con mínimo esfuerzo. Que lo disfruten!

  • ZPL 2 Para Impresoras Zebra en Java

    8

    Hace unos dias me topé con una aplicación la cual requería impresión de unos labels y códigos de barra. La impresora era la famosa Zebra la cual es super versátil y el cual ha desarrollado la versión 2 de su propio lenguage para impresión. ZPL 2.

    Básicamente la impresora acepta comandos, no un stream de datos como estamos acostumbrados a enviar en Java. Veamos un ejemplo sencillo de código ZPL.

    ^XA
    ^FO10,0^ARN,11,7^FD SOME TEXT ^FS
    ^FO300,0^ARN,11,7^FD SOME VALUE ^FS
    ^FO10,35^ARN,11,7^FD SOME TEXT ^FS
    ^FO300,35^ARN,11,7^FD SOME VALUE ^FS
    ^FO10,70^ARN,11,7^FD SOME CODE ^FS
    ^FO10,115^ARN,11,7^BCN,60,Y,Y,N^FD 23749237439827 ^FS
    ^XZ

    Una vez que tenemos nuestro código ZPL definido (aca pueden ver como escribir ZPL) vamos a mandar un comando de impresión directamente a través de Java. Vale recordar que las impresoras Zebra se instalan como cualquier otra impresora (LPT1 o USB). Aquí el código Java.

    // aca obtenemos la printer default
    PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
    
    String zplCommand = "^XA\n" +
    "^FO10,0^ARN,11,7^FD SOME TEXT ^FS\n" +
    "^FO300,0^ARN,11,7^FD SOME VALUE ^FS\n" +
    "^FO10,35^ARN,11,7^FD SOME TEXT ^FS\n" +
    "^FO300,35^ARN,11,7^FD SOME VALUE ^FS\n" +
    "^FO10,70^ARN,11,7^FD SOME CODE ^FS\n" +
    "^FO10,115^ARN,11,7^BCN,60,Y,Y,N^FD 23749237439827 ^FS\n" +
    "^XZ";
    
    // convertimos el comando a bytes
    byte[] by = zplCommand.getBytes();
    DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
    Doc doc = new SimpleDoc(by, flavor, null);
    
    // creamos el printjob
    DocPrintJob job = printService.createPrintJob();
    
    // imprimimos
    job.print(doc, null);

    Así de simple podemos mandar cualquier comando a las impresoras Zebra que soporten ZPL 1 y ZPL 2. Si buscan en internet ZPL busquen ZPL Zebra porque ZPL tambien es un lenguage de programación para aplicaciones científcas.