天天看點

java定時器處理

最近有個小項目讓我實作每天自動生成封包,然後一個财務系統通過FTP可以到我指定的目錄下取檔案,還實作一個檔案不要超過10M等功能,我用了分批處理,但是目前定時的還點問題,貼下代碼,哪位同仁有時間幫忙看下

如果解決了,會貼出代碼來共享

部分分批處理代碼

======================================

 while (rs.next()) {

        sb.append(rs.getString(1)).append("|");

        sb.append(rs.getString(2)).append("|");

        sb.append(rs.getString(3)).append("|");

        sb.append(rs.getString(4)).append("|");

        sb.append(rs.getString(5)).append("|");

        sb.append(rs.getString(6)).append("|");

        sb.append(rs.getString(7)).append("|");

        sb.append(rs.getString(8)).append("|");

        sb.append(rs.getString(9)).append("|");

        sb.append(rs.getString(9)).append("|");

        sb.append(rs.getString(10)).append("|");

        sb.append(rs.getString(11)).append("|");

        sb.append("/n");

        count++;

        if (count % 80000 == 0) { //每次批量插入80000條換一個檔案夾

          page++;

          if (Integer.toString(page).length() != 2) { //數字補零

            sb2.append("sjwj_").append(sdate).append("_0").append(page);

          }

          else {

            sb2.append("sjwj_").append(sdate).append("_").append(page);

          }

          sb1.append("d://bankmessagedemo//").append(sb2.toString()).append(".txt");

          BufferedWriter out = new BufferedWriter(new FileWriter(sb1.toString(), true));

          out.write(sb.toString());

          sb.delete(0, sb.length()); //每次先清空一次資料緩存

          sb1.delete(0, sb1.length()); //每次先清空一次封包路徑指向緩存

          sb2.delete(0, sb2.length()); //每次先清空一次封包頭緩存

          out.flush();

          returnPage(page); //傳回page供下面使用,如果沒有到80000條,直接需要從1開始

        }

      }

      page = returnPage(page); //得到傳回page值

      if (Integer.toString(page).length() != 2) { //數字補零(兩種情況,1種COUNG出來的記錄數沒有80000條,2種是零頭)

        if (page == 0) {

          sb2.append("sjwj_").append(sdate).append("_0").append(1);

        }

        else {

          sb2.append("sjwj_").append(sdate).append("_0").append(page+1);

        }

      }

      else {

        sb2.append("sjwj_").append(sdate).append("_").append(page+1);

      }

      sb1.append("d://bankmessagedemo//").append(sb2.toString()).append(".txt");

      BufferedWriter out = new BufferedWriter(new FileWriter(sb1.toString(), true));

      out.write(sb.toString());

      sb1.delete(0, sb1.length()); //每次先清空一次封包路徑指向緩存

      sb2.delete(0, sb2.length()); //每次先清空一次封包頭緩存

      out.flush();

======================================

有沒有更好的方法優化?我總覺得我的這個做法很啰嗦

定時器

======================================

package tf.dt.credit.view;

import java.util.Calendar;

import java.util.Date;

import java.util.TimerTask;

import java.util.Timer;

import tf.dt.credit.view.CreditMessageView;

import tf.dt.credit.database.odbcConnection;

public class TimeManageMessage {

  public static void main(String[] args) throws InterruptedException {

    // Get the Date corresponding to 11:01:00 pm today.

    Calendar calendar = Calendar.getInstance();

    calendar.set(Calendar.HOUR_OF_DAY, 5); //控制時

    calendar.set(Calendar.MINUTE, 1); //控制分

    calendar.set(Calendar.SECOND, 0); //控制秒

    Date time = calendar.getTime();

    Timer timer = new Timer();

    // timer.schedule(new TimeManageMessage.myrun(), time);

    int i = 0;

    while (true) {

     // Thread.sleep(10000l);

      i++;

      timer.schedule(new TimeManageMessage.myrun(), time);

    }

  }

  static class myrun extends TimerTask {

    odbcConnection oc = new odbcConnection();

    String date = oc.getLastDate(); //得到UC賬務日期

    public void run() {

      CreditMessageView vmc = new CreditMessageView();

      int oneMessage = vmc.oneMessage("", "1", date); //會計憑證資訊檔案

      if (oneMessage != 1) {

        System.out.println("dingting:XKJ表中當天記錄為空......");

      }

      else {

        System.out.println("dingting:執行成功--會計憑證資訊檔案......");

      }

      int twoMessage = vmc.twoMessage("", "1", date); //匯率資訊檔案

      if (twoMessage != 1) {

        System.out.println("dingting:UX表中記錄為空.....");

      }

      else {

        System.out.println("dingting:執行成功--匯率資訊檔案.....");

      }

      int threeMessage = vmc.threeMessage("", "1", date); //全科目餘額對賬檔案

      if (threeMessage != 1) {

        System.out.println("dingting:XKJZD表中當天記錄為空......");

      }

      else {

        System.out.println("dingting:執行成功--全科目餘額對賬檔案......");

      }

    }

  }

}

======================================

這個定時器的程式目前還是有點問題,有心人幫忙看看哪裡出的問題哈