13 noviembre, 2013
Lotus Java Agent. Acceso al iSeries desde Domino en Java.
En un post anterior os comentaba como acceder a los datos de la base de datos DB2 del iSeries desde un Agente Lotus Domino hecho en Lotus Script (este). Hoy os explico como hacer eso mismo desde un agente escrito en Java.
El utilizar un lenguaje u otro es únicamente por dos motivos, por preferencias de programación o por el entorno donde queremos ejecutarlos. Un agente escrito en Lotus Script sólo permite ejecutarlo desde un entorno cliente de Lotus, mientras que el escrito en Java podemos ejecutarlo desde el iSeries con el mandato SBMDOMCMD como os explicaba aquí.
Lotus Java Agent. Empecemos por las clases.
A la hora de hacer el agente Java para acceder a nuestra Base deDatos DB2 lo primero que tenemos que hacer es incluir en nuestro proyecto las clases java necesarias para todo lo relacionado con nuestro iSeries. Debeis añadir las siguientes clases
– jt400.jar y util400.jar que podemos encontrar en el directorio \QIBM\ProdData\HTTP\Public\jt400\lib
– Notes.jar que podeis encontrar en el directorio \QIBM\ProdData\LOTUS\NOTES de vuestro servidor
– db2_classes.jar, db2routines_classes.jar y sqlj_classes.jar que encontrareis en \QIBM\ProdData\Java400\ext
Para incluir las clases en nuestro proyecto debemos pinchar con la derecha en el titulo del proyecto, seleccionar propiedades del proyecto y vias de construcción. en la pestaña de bibliotecas tenemos la opción de añadir JAR externos.
Una vez cargadas las clases, creamos un nuevo agente en Java y empezamos a meter código.
Lo primero, como es habitual, es importar las clases de Lotus y Sql necesarias
import lotus.domino.*;
import java.sql.*;
Luego conectamos con la base de datos DB2 con el siguiente código, donde server es la dirección de nuestro servidor, user nuestro nombre de usuario y password nuestra clave.
DriverManager.registerDriver(new com.ibm.db2.jdbc.app.DB2Driver());
Connection dbConnect = DriverManager.getConnection(«jdbc:db2://» +server, user, password);
dbConnect.setTransactionIsolation(1);
dbConnect.setReadOnly(true);
Statement stmt = dbConnect.createStatement();
En este momento ya estamos conectados al iSeries, por lo que ya solo falta recuperar los datos de las tablas que necesitemos. Para ello usamos el siguiente código donde sql es un string con la sentencia SQL que queremos ejecutar.
ResultSet rs = stmt.executeQuery(sql);
rs.setFetchSize(1);
while (rs.next()) {
….. Proceso de registros leidos
}
Por último cerramos la conexión
stmt.close();
rs.close();
dbConnect.close();
Con este método podemos crear documentos Lotus Domino en una base de datos alojada en un iSeries en Java. Además, como he comentado antes, podemos llamarlo desde un programa CL con el mandato SBMDOMCMD, con lo que podemos automatizarlo y ejecutarlo dentro de cualquiera de nuestros programas.
Yo, por ejemplo, lo uso para generar las fichas de los artículos, que se preparan previamente con un programa ILERPG y que justo cuando termina hace una llamada al Agente para que actualice los datos en Domino.
Os pongo el ejemplo completo para que podáis estudiarlo y usarlo.
import lotus.domino.*; import java.sql.*; public class JavaAgent extends AgentBase { public void NotesMain() { try { Session session = getSession(); AgentContext agentContext = session.getAgentContext(); Database db = agentContext.getCurrentDatabase(); String fichero = db.getFileName(); Document doc; String server = ""; String user = ""; String password = ""; DriverManager.registerDriver(new com.ibm.db2.jdbc.app.DB2Driver()); Connection dbConnect = DriverManager.getConnection("jdbc:db2://" +server, user, password); dbConnect.setTransactionIsolation(1); dbConnect.setReadOnly(true); Statement stmt = dbConnect.createStatement(); String sql = " "; sql = "SELECT * FROM articulos"; ResultSet rs = stmt.executeQuery(sql); rs.setFetchSize(1); int Leidos = 0; byte PARCOD = 1; byte PARDES = 2; while (rs.next()) { Leidos=Leidos+1; Document nuevoDoc = db.createDocument(); nuevoDoc.replaceItemValue("form","fArticulos"); nuevoDoc.replaceItemValue("fArticulos_CodigoInterno",rs.getString(PARCOD).trim()); nuevoDoc.replaceItemValue("fArticulos_Descripcion",rs.getString(PARDES).trim()); nuevoDoc.save(true); nuevoDoc.recycle(); } stmt.close(); rs.close(); dbConnect.close(); } catch(Exception e) { System.out.print(e); System.out.print(e.getMessage()); e.printStackTrace(); } }