sleep java and crontab on server

0

Good morning.

I explain my situation.

I have a java application that performs a process of inserting and executing procedures, the program works well if I execute it from my machine.

The detail is that I put it on a server and create a crontab to run every 15 minutes, after 1 hour I check my server and the process is 4 times.

Here is my java code:

package applicationserver.appPortal;
import java.util.*;
import java.sql.*;
import oracle.sql.*;
import java.util.ResourceBundle;
import oracle.jdbc.OracleDriver;
public class ReplicaRemesas extends applicationserver.classes.Template
{

String qry = "";
public static String lista="";
ResourceBundle bundlep;
//Función que inicia el proceso
@Override
public void run()
{
    try 
    {
        this.setParams();           //Función parametros
        while (true){
            this.checkActive();
            this.checkHour2();      //Verifica la hora en que debe estar activa
            this.checkPendings();
        }
    }
    catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

// Indica la definición de parametros
@Override
public void setParams()
{
    this.setAppName("ReplicaRemesas");                   //Nombre de la Aplicacion
    this.dhEasy.setResourceName(this.getResource());    //Asigna parametros de properties
    //this.bundlep = ResourceBundle.getBundle(this.getIdeaCMX()); //Parametros de Portal
    //this.setMilliseconds(900000);                       //3Min (1Minuto->60000 milisegundos)
    this.setMilliseconds(180000); //3 minutos;
    this.setHourI(900);                                 //Hora de inicio  9:00 am
    this.setHourT(100);                                 //Hora de termino 1:00 am
    //this.setMailHeader("Carga Pagina Clientes!!");      //Encabezado de Correo
}

//Verifica que tiene pendientes
private void checkPendings(){
    String valor="";
    try{
    String urlProd = "jdbc:oracle:thin:@192.168.0.233:1521:pam";
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection connProd = DriverManager.getConnection(urlProd, "Movil", "noesqwerty7");

     if(!connProd.isClosed() || connProd!=null){
            Statement stmtProd = connProd.createStatement();
            String query="select  COUNT(*) AS TOTAL  from bloques_remesas where estatus='PENDIENTE' ";

             ResultSet rs2 = stmtProd.executeQuery(query);
             while(rs2.next()){
                 valor = rs2.getString("TOTAL");
             }
             if(valor.equals("0")){
                 System.out.println("Inactivo");
             }else {
                 inserta();
                 replica();
                 templated();
                 updateMovil();
                 cleanTemp();
             }
             connProd.close();
     }
     else {
         sleep(this.getMilliseconds());
     }

     System.out.println("TerminaCuenta pendientes");
}catch(Exception e){
    System.out.println("Error " + e);
}

}

 public static void inserta(){
    try{
    DriverManager.registerDriver(new OracleDriver());
    Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.249:1521:easy", "app", "q4e0pz12");
    List<String> list = new ArrayList<String>();
    CallableStatement stmt = conn.prepareCall("BEGIN p_array_test(?); END;");
    String cadena="\"";
     String urlProd = "jdbc:oracle:thin:@192.168.0.233:1521:pam";
        Class.forName("oracle.jdbc.driver.OracleDriver");
        Connection connProd = DriverManager.getConnection(urlProd, "Movil", "noesqwerty7");
        Statement stmtProd = connProd.createStatement();
        String qry ="SELECT * FROM BLOQUES_REMESAS WHERE ESTATUS='PENDIENTE'";

        ResultSet rs2 = stmtProd.executeQuery(qry);

        while(rs2.next()){
            list.add(rs2.getString("remesa"));
            lista += rs2.getString("remesa")+",";
        }
        System.out.println(list);
        lista = lista.substring(0, lista.length()-1);
        System.out.println("lista normal global> " + lista);
    ArrayDescriptor arrDesc =ArrayDescriptor.createDescriptor("T_VARCHAR2_ARRAY", conn);

    Array array = new ARRAY(arrDesc, conn, list.toArray());
    stmt.setArray(1, array);
    stmt.execute();

    conn.commit();
    conn.close();
    connProd.close();
    }catch(Exception e){
        System.out.println("Error " + e);
    }
}

public static void replica(){
    try{
        DriverManager.registerDriver(new OracleDriver());
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.249:1521:easy", "app", "q4e0pz12");
        CallableStatement stmt = conn.prepareCall("BEGIN NCTE_REPLICA(); COMMIT; END;");
        stmt.execute();
        conn.commit();
        conn.close();
        System.out.println("Termina Replica");
    }catch(Exception e){
        System.out.println("Error "+ e);
    }

}

public static void templated(){
    try{
        DriverManager.registerDriver(new OracleDriver());
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.249:1521:easy", "app", "q4e0pz12");
        CallableStatement stmt = conn.prepareCall("BEGIN TEMPLATED_REPLICA(); COMMIT; END;");
        stmt.execute();
        conn.commit();
        conn.close();
        System.out.println("Termina templated");
    }catch(Exception e){
        System.out.println("Error "+ e);
    }

}
public static void updateMovil(){
try{
    String urlProd = "jdbc:oracle:thin:@192.168.0.233:1521:pam";
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection connProd = DriverManager.getConnection(urlProd, "Movil", "noesqwerty7");
    Statement stmtProd = connProd.createStatement();
    String qry="update bloques_remesas set estatus='PROCESADO' where remesa in ("+lista+")";

     ResultSet rs2 = stmtProd.executeQuery(qry);
     connProd.commit();
     connProd.close();
     System.out.println("Termina updateMovil");
}catch(Exception e){
    System.out.println("Error " + e);
}
}

public static void cleanTemp(){
     try{
    String urlProd = "jdbc:oracle:thin:@192.168.0.249:1521:easy";
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection connProd = DriverManager.getConnection(urlProd, "app", "q4e0pz12");
    Statement stmtProd = connProd.createStatement();
    String qry="DELETE FROM APP.STRINGS";

     ResultSet rs2 = stmtProd.executeQuery(qry);
     connProd.commit();
     connProd.close();
     System.out.println("Terminado clean");
}catch(Exception e){
    System.out.println("Error " + e);
}

}
}

My crontab on the server:

  */15 * * * * java -jar "/var/tmp/AppPortal.jar" ReplicaRemesas

I do not know if I have to put the sleep in after my checkPendings method finishes the process.

I hope you can help me.

Greetings.

    
asked by Jairo Ordaz Moreno 29.03.2017 в 19:28
source

1 answer

0

The problem is that your process never ends, within else of if(valor.equals("0")){ in any of those functions there must be an infinite cycle or maybe that cycle is out of checkPendings() . that is why when the crontab passes it raises another process without the previous process having finished or died. Possibly after 2 hours you have 8 processes or a similar number if any if you died.

    
answered by 29.03.2017 в 19:43