Iniciando Servicio “Server” con JPos/Q2

jpos.org

jpos.org

Para iniciar un servicio de “escucha” con JPos  tenemos que construir el esqueleto de directorios y una clase java que cumpla con las condiciones mínimas para funcionar con el framework; la cual sera la encargada de recibir y responder hacia nuestro “cliente”.

Directorios

Primero entramos al directorio “modules”:

moo@rcx01:~/jpos-1.6.9$ cd modules/
moo@rcx01:~/jpos-1.6.9/modules$
moo@rcx01:~/jpos-1.6.9$

Creamos el directorio de nuestro proyecto (puede ser cualquier nombre):

moo@rcx01:~/jpos-1.6.9/modules$ mkdir gomark

Crear directorios de esqueleto de proyecto (siempre tienen que existir):

moo@rcx01:~/jpos-1.6.9/modules/gomark$ mkdir cfg
moo@rcx01:~/jpos-1.6.9/modules/gomark$ mkdir cfg/packager
moo@rcx01:~/jpos-1.6.9/modules/gomark$ mkdir deploy
moo@rcx01:~/jpos-1.6.9/modules/gomark$ mkdir lib
moo@rcx01:~/jpos-1.6.9/modules/gomark$ mkdir src
moo@rcx01:~/jpos-1.6.9/modules/gomark$ mkdir bin
moo@rcx01:~/jpos-1.6.9/modules/gomark$

Seleccionar el canal iso8583 que vamos a utilizar (para los que no tienen claro que es el protocolo de Mensajes iso8584 el link: http://es.wikipedia.org/wiki/ISO8583). Para mi proyecto necesitamos utilizar el iso8583 base 1993 versión bitmap binario (existe una con versión bitmap asccii).

channel-iso8583

channel-iso8583

Para nuestro proyecto seleccionamos “iso93binary.xml”; como recomendación lo copiamos hacia nuestro directorio del proyecto, y le cambiamos el nombre ha “iso93binary-gomark-server.xml”:

moo@rcx01:~/jpos-1.6.9/modules/jpos/cfg/packager$ cp iso93binary.xml ../../../gomark/cfg/packager/iso93binary-gomark-server.xml
moo@rcx01:~/jpos-1.6.9/modules/jpos/cfg/packager$ cp iso93ascii.xml ../../../gomark/cfg/packager/iso93ascii-gomark-server.xml
Todo esto en le contexto de que por algún motivo dicho iso8583 tuviese que ser modificado. ¿Por que razón, si es una norma?. Un ejemplo seria una aplicación cliente “mal” construida, a la cual ya no es posible corregir. Por lo cual habría que amoldarse a la situación. Nueva información, nos tendremos amoldar, ya que la configuración base, el bipmap es un dato de tipo ASCII, pero nuestro cliente la esta enviando en Binario, aca adjunto la linea que hay que modificar del archivo iso93ascii-gomark-server.xml:
<isofield
      id="1"
      length="16"
      name="BIT MAP"
      class="org.jpos.iso.IFA_BITMAP"/>
Por el siguiente valor:
<isofield
      id="1"
      length="16"
      name="BIT MAP"
      class="org.jpos.iso.IFB_BITMAP"/>

Ahora vamos a crear el archivo de configuración para levantar el QServer. En el directorio deploy, de nuestro proyecto jpos (aka gomark), creamos el archivo “90-gomark-server.xml” (el número es para indicar en que nivel es ejecutado por jpos, obvio que el 0_xxxx es el primero que se carga)
Archivo configuración QServer

Archivo configuración QServer

Donde:
  • <attr name=”port” type=”java.lang.Integer”>12512</attr> , se configura el puerto de escucha.
  • <attr name=”minSessions” type=”java.lang.Integer”>10</attr>, se configura las sesiones mínimas reservadas en memorias.
  • <attr name=”maxSessions” type=”java.lang.Integer”>10</attr>, máximo número de sesiones simultaneas en el sistema (en producción, colocar según sea el nivel de maquina en el cual este alojado el jpos)
  • <channel name=”gomark-channel-server” class=”org.jpos.iso.channel.NACChannel” packager=”org.jpos.iso.packager.GenericPackager” header=”6000000000″ logger=”Q2″>, se asigna el tipo de canal, el cual se procesara la transacción. En nuestro caso NACChannel; en los 2 primeros bytes viaja el largo de la data, sin incluirlos. Tambien le informamos al framework que la data viene con un header con el siguiente formato “60xxxxYYYY” (header=”6000000000″), esto para que el framework no nos filtre la data, como información NO-iso8583.
  • <property name=”packager-config” value=”cfg/packager/iso93binary-gomark-server.xml.xml” />, acá le indicamos el formato de iso8583 que recibirá nuestro servicio.
  • <request-listener class=”cl.gomark.listener.RequestListener” logger=”Q2″>, nombre de la clase que procesara el requerimiento.

Programación de la Clase

Aca el pequeño trozo de codigo para responder código “99” al cliente, y actualizamos al fecha y hora de la respuesta:

package cl.gomark.listener;
import java.io.IOException;
import java.util.Date;
import org.jpos.iso.ISODate;
import org.jpos.iso.ISOException;
import org.jpos.iso.ISOMsg;
import org.jpos.iso.ISORequestListener;
import org.jpos.iso.ISOSource;
import org.jpos.iso.ISOFilter.VetoException;
import org.jpos.util.Log;
import org.jpos.util.LogEvent;
import org.jpos.util.LogSource;
public class RequestListener extends Log implements ISORequestListener, LogSource {
@Override
public boolean process(ISOSource source, ISOMsg m) {
ISOMsg r = (ISOMsg) m.clone();
try {
    r.setResponseMTI();
    r.set(12, ISODate.getTime(new Date()));
    r.set(13, ISODate.getDate(new Date()));
    r.set(39, "99");
    r.recalcBitMap();
  } catch (ISOException isoEx) {
  }
  try {
    source.send(r);
  } catch (IOException ex) {
  } catch (VetoException ex) {
  } catch (ISOException ex) {
}
  return true;
}
}

Una vez terminado, compilamos con ant y ejecutamos:

moo@rcx01:~/jpos-1.6.9$ ant run
Buildfile: build.xml

prepare:
     [echo] Build jPOS-1.6.9.2010.08.19.08.18.30

copy-lib:

modules:
     [copy] Copying 2 files to /home/moo/jpos-1.6.9/build/modules

prepare:
     [echo] Build jPOS-1.6.9.2010.08.19.08.18.30

support:
     [copy] Copying 12 files to /home/moo/jpos-1.6.9/build/classes
   [subant] No sub-builds to iterate on
   [subant] No sub-builds to iterate on

support:
     [copy] Copying 12 files to /home/moo/jpos-1.6.9/build/classes

copy-bin:

manifest:

main:

jar:
      [jar] Building jar: /home/moo/jpos-1.6.9/build/jpos.jar

run:
     [java] <log realm="Q2.system" at="Thu Aug 19 20:18:33 CLT 2010.881">
     [java]   <info>
     [java]     Q2 started, deployDir=/home/moo/jpos-1.6.9/build/deploy
     [java]   </info>
     [java] </log>
     [java] <log realm="Q2.system" at="Thu Aug 19 20:18:33 CLT 2010.940">
     [java]   <info>
     [java]     new classloader [22c95b] has been created
     [java]   </info>
     [java] </log>
     [java] <log realm="Q2.system" at="Thu Aug 19 20:18:33 CLT 2010.942">
     [java]   <info>
     [java]     deploy:/home/moo/jpos-1.6.9/build/deploy/90-gomark-server.xml
     [java]   </info>
     [java] </log>
     [java] <log realm="Q2.system" at="Thu Aug 19 20:18:33 CLT 2010.974">
     [java]   <info>
     [java]     deploy:/home/moo/jpos-1.6.9/build/deploy/99_sysmon.xml
     [java]   </info>
     [java] </log>
     [java] <log realm="org.jpos.q2.qbean.SystemMonitor" at="Thu Aug 19 20:18:34 CLT 2010.197">
     [java]   <info>
     [java]     Starting SystemMonitor
     [java]   </info>
     [java] </log>
     [java] <log realm="org.jpos.q2.qbean.SystemMonitor" at="Thu Aug 19 20:18:34 CLT 2010.203">
     [java]   <info>
     [java]     <release>jPOS 1.6.9 r2962</release>
     [java]     <instance>31962a07-7b64-4b84-896d-541dc612cd4f</instance>
     [java]     <uptime>00:00:00.653</uptime>
     [java]     <memory>
     [java]        freeMemory=5576376
     [java]       totalMemory=7995392
     [java]       inUseMemory=2419016
     [java]     </memory>
     [java]     <threads>
     [java]             delay=0 ms
     [java]           threads=15
     [java]             Thread[Reference Handler,10,system]
     [java]             Thread[Finalizer,8,system]
     [java]             Thread[Signal Dispatcher,9,system]
     [java]             Thread[Q2-31962a07-7b64-4b84-896d-541dc612cd4f,5,main]
     [java]             Thread[DestroyJavaVM,5,main]
     [java]             Thread[Timer-0,5,main]
     [java]             Thread[Thread-3,5,main]
     [java]             Thread[SystemMonitor,5,main]
     [java]             Thread[PooledThread-0,5,ThreadPool-0]
     [java]             Thread[PooledThread-1,5,ThreadPool-0]
     [java]             Thread[PooledThread-2,5,ThreadPool-0]
     [java]             Thread[PooledThread-3,5,ThreadPool-0]
     [java]             Thread[PooledThread-4,5,ThreadPool-0]
     [java]             Thread[PooledThread-5,5,ThreadPool-0]
     [java]             Thread[PooledThread-6,5,ThreadPool-0]
     [java]             Thread[PooledThread-7,5,ThreadPool-0]
     [java]             Thread[PooledThread-8,5,ThreadPool-0]
     [java]             Thread[PooledThread-9,5,ThreadPool-0]
     [java]     </threads>
     [java]     --- name-registrar ---
     [java]       server.gomark-server: org.jpos.iso.ISOServer
     [java]         connected=0, rx=0, tx=0, last=0
     [java]       tspace:default: org.jpos.space.TSpace
     [java]       logger.Q2: org.jpos.util.Logger
     [java]       gomark-server: org.jpos.q2.iso.QServer
     [java]       logger.: org.jpos.util.Logger
     [java]       logger.Q2.buffered: org.jpos.util.BufferedLogListener
     [java]   </info>
     [java] </log>
     [java] <log realm="gomark-server.server" at="Thu Aug 19 20:18:34 CLT 2010.244" lifespan="37ms">
     [java]   <iso-server>
     [java]     listening on port 12510
     [java]   </iso-server>
     [java] </log>

Listo! con esto tenemos andando nuestro servicio QServer iso8583 utilizando el framework JPOS.

Ahora a programar un pequeño cliente y adjuntare el LOG, para finalizar.

Saludos!

Advertisements

3 thoughts on “Iniciando Servicio “Server” con JPos/Q2

Agregar un comentario

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Google+ photo

You are commenting using your Google+ account. Log Out / Cambiar )

Connecting to %s