【问题标题】:Code that runs in instances and stops for 5 minutes before running again在实例中运行并在再次运行前停止 5 分钟的代码
【发布时间】:2017-09-26 18:39:05
【问题描述】:

我想在每个实例的实例中运行我的代码代码从我的数据库中提取数据作为结果集并停止等待另外 5 分钟提取结果集并停止。程序永远不应该结束。问题是程序在第一个实例等待 5 分钟,但再次等待它继续运行 下面是代码。结果集和数据库连接部分没问题

package postilion_error.checker;

/**
 *
 * @author kithinjid
 */
import java.io.IOException;
import java.sql.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Timer;
import java.util.logging.*;
import java.util.TimerTask;
import static sun.font.FontManager.logger;

public class POSTILION_ERRORCHECKER {


  static Logger log;
  static Handler file_handler;
  Connection conn=null;
  Statement st=null;
  static ResultSet rs=null;
  static int i = 0;
  static int counter=0;
  static boolean checker=true;


    private  void dbconnect()
    {
        String username="Postilion";
        String password="Password12";

        String hostname="jdbc:sqlserver://172.16.112.6;databaseName=realtime";
        try
        {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            conn=DriverManager.getConnection(hostname,username,password);
            System.out.println("TIME:"+dateString("MM:dd-HH:mm:ss")+":connected to database");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
      }
    private ResultSet check_00(String query1)
    {
        dbconnect();     

        try
        {
        st=conn.createStatement();
        rs=st.executeQuery(query1);
        }catch(Exception e)
        {
        e.printStackTrace();
        }


        return rs ;
    }
    public static void scheduled()
    {


         Timer timer=new Timer();
    timer.schedule(new TimerTask() {

    @Override
   public void run() {
    while(checker==true)
    {
    log=logger.getLogger("my logger");
    try {
    file_handler=new FileHandler("C:\\Users\\kithinjid\\Google Drive\\interswitch\\NetBeansProjects\\POSTILION_ERROR CHECKER\\dist\\logg.txt");
    SimpleFormatter formatter=new SimpleFormatter();
    file_handler.setFormatter(formatter);
    log.addHandler(file_handler);
    } catch (IOException ex) {
    log.info(dateString("HHmmss"));
    Logger.getLogger(POSTILION_ERRORCHECKER.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SecurityException ex)
    {
    Logger.getLogger(POSTILION_ERRORCHECKER.class.getName()).log(Level.SEVERE, null, ex);
    }
    String query="SELECT TOP 100 [tran_nr]\n" +
"      ,[gmt_date_time]\n" +
"      ,[time_local]\n" +
"      ,[date_local]\n" +
"      ,[sink_node]\n" +
"      ,[rsp_code_req_rsp]\n" +
"      ,[rsp_code_cmp]\n" +
"      ,[rsp_code_rev]\n" +
"  FROM [realtime].[dbo].[tm_trans_10] where sink_node = 'GTBUSDsnk' ORDER BY tran_nr desc";
       POSTILION_ERRORCHECKER pe=new POSTILION_ERRORCHECKER();
       pe.dbconnect();


    try
    {
      ResultSet result=pe.check_00(query);

       while(result.next()==true)
       {
          //loop for counter and displaying
      int response=Integer.parseInt(result.getString("rsp_code_req_rsp"));
     System.out.println(response);
     if (response==91)
     {
     counter++;
    if (counter>=10)
    System.out.println("TIME:"+dateString("MM:dd-HH:mm:ss")+"--error respose code:91 of count:"+ counter+" to sink node GTBUSDsnk");
     }

       }
       }catch(Exception e)
       {
           e.printStackTrace();
       }
                       // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
                    }
                    }
                },30000,30000); 

    }

    public static void main(String[] args) 
    {
        scheduled();
        System.out.println("execution started");
    }
    private static String dateString(String formart)
    {
        DateFormat dateFormat = new SimpleDateFormat(formart);
        java.util.Date date = new java.util.Date();
        return dateFormat.format(date);
    }


}

【问题讨论】:

  • 无法真正阅读未格式化的代码,但最终的问题是什么或您面临什么问题?
  • @DaveNewton 我需要代码运行一次选择结果集并停止 5 分钟然后再次选择
  • 简单使用Quartz调度库,无需重新发明轮子
  • 我认为应该有一个java代码解决方案
  • 什么是 ,30000,30000 这是无效的语法。是的,不需要库,Thread.sleep 可以完成这项工作。

标签: java sql algorithm while-loop


【解决方案1】:

感谢@user1637645,这是工作代码

package postilion_error.checker;

/**
 *
 * @author kithinjid
 */
import java.io.IOException;
import java.sql.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Timer;
import java.util.logging.*;
import java.util.TimerTask;
import static sun.font.FontManager.logger;

public class POSTILION_ERRORCHECKER {


  static Logger log;
  static Handler file_handler;
  Connection conn=null;
  Statement st=null;
  static ResultSet rs=null;
  static int i = 0;
  static int counter=0;
  static boolean checker=true;


    private  void dbconnect()
    {
        String username="Postilion";
        String password="Password12";

        String hostname="jdbc:sqlserver://172.16.112.6;databaseName=realtime";
        try
        {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            conn=DriverManager.getConnection(hostname,username,password);
            System.out.println("TIME:"+dateString("MM:dd-HH:mm:ss")+":connected to database");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
      }
    private ResultSet check_00(String query1)
    {
        dbconnect();     

        try
        {
        st=conn.createStatement();
        rs=st.executeQuery(query1);
        }catch(Exception e)
        {
        e.printStackTrace();
        }


        return rs ;
    }
    public static void scheduled()
    {


         Timer timer=new Timer();
    timer.schedule(new TimerTask() {

    @Override
   public void run() {
    while(checker==true)
    {
    log=logger.getLogger("my logger");
    try {
    file_handler=new FileHandler("C:\\Users\\kithinjid\\Google Drive\\interswitch\\NetBeansProjects\\POSTILION_ERROR CHECKER\\dist\\logg.txt");
    SimpleFormatter formatter=new SimpleFormatter();
    file_handler.setFormatter(formatter);
    log.addHandler(file_handler);
    } catch (IOException ex) {
    log.info(dateString("HHmmss"));
    Logger.getLogger(POSTILION_ERRORCHECKER.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SecurityException ex)
    {
    Logger.getLogger(POSTILION_ERRORCHECKER.class.getName()).log(Level.SEVERE, null, ex);
    }
    String query="SELECT TOP 100 [tran_nr]\n" +
"      ,[gmt_date_time]\n" +
"      ,[time_local]\n" +
"      ,[date_local]\n" +
"      ,[sink_node]\n" +
"      ,[rsp_code_req_rsp]\n" +
"      ,[rsp_code_cmp]\n" +
"      ,[rsp_code_rev]\n" +
"  FROM [realtime].[dbo].[tm_trans_10] where sink_node = 'GTBUSDsnk' ORDER BY tran_nr desc";
       POSTILION_ERRORCHECKER pe=new POSTILION_ERRORCHECKER();
       pe.dbconnect();


    try
    {
      ResultSet result=pe.check_00(query);

       while(result.next()==true)
       {
          //loop for counter and displaying
      int response=Integer.parseInt(result.getString("rsp_code_req_rsp"));
     System.out.println(response);
     if (response==91)
     {
     counter++;
    if (counter>=10)
    System.out.println("TIME:"+dateString("MM:dd-HH:mm:ss")+"--error respose code:91 of count:"+ counter+" to sink node GTBUSDsnk");
     }
    }
         delay();
       }catch(Exception e)
       {
           e.printStackTrace();
       }
                       // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
                    }
                    }
                },0,30000); 

    }
    public static void delay()
    {
        try
        {
            Thread.sleep(5 * 60 * 1000);
        }catch(Exception e)
        {

        }
    }

    public static void main(String[] args) 
    {
        scheduled();
        System.out.println("execution started");

    }
    private static String dateString(String formart)
    {
        DateFormat dateFormat = new SimpleDateFormat(formart);
        java.util.Date date = new java.util.Date();
        return dateFormat.format(date);
    }
}

【讨论】:

  • 在下次连接数据库之前输出 5 分钟
【解决方案2】:

您可以如下创建一个名为 delay() 的函数,然后在您想等待 5 分钟时调用该函数。但这可能会阻止您的程序,并且如果您同时需要做其他事情,它也将无法工作......

private void delay()
{
    try {
         Thread.sleep(5 * 60 * 1000);
    } catch(Exception e) { }
}

【讨论】:

  • 等待时你仍然可以做其他事情,但你必须使用另一个线程。
  • @maraca 等待时间是为了做一些逻辑。该代码从 postilion 数据库获取响应代码,这是银行和金融机构的 ISO8583 切换。因此,等待时间用于分析数据库中的结果集,也用于等待更多事务发生
  • @user1637645 我可以在我的代码中不使用线程时使用该代码吗?我没有继承线程功能
  • @DENNISKITHINJI 是的,你可以... Thread 类在默认导入的 java.lang 包中,Thread.sleep() 是一个静态函数... 此外,Thread.sleep( ) 使“当前执行”线程进入休眠状态,并且由于始终存在一个主线程(即使您没有显式创建一个),您可以使用此函数。
猜你喜欢
  • 2021-08-13
  • 2019-03-28
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多