BlockingQueue とスレッド(4)

iBATIS 3 リリース間近で SqlMapClient での処理を書くのも引けてしまうが、
SqlSession でもこれを参考にしようかと思う。

import java.util.ArrayList;
import java.util.List;
import com.ibatis.sqlmap.client.SqlMapClient;

/**
 * SqlMapClient バッチ実行キュー処理.
 */

public abstract class SqlOpeCatcher extends QueCatcher<SqlOperation>{
   private List<SqlOperation> list;
   private SqlMapClient sqlmapclient;

   public SqlOpeCatcher(int readMax,long interruptCycle,SqlMapClient sqlmapclient){
      super(readMax,interruptCycle);
      this.list = new ArrayList<SqlOperation>();
      this.sqlmapclient = sqlmapclient;
   }
   /** 成功時にcall */
   public abstract void success();

   /** 失敗時にcall */
   public abstract void failed();

   /* (非 Javadoc)
    * @see QueCatcher#interrupt(boolean)
    */

   @Override
   public QueCatchNext interrupt(boolean isInterruptedExcept){
      boolean flg = true;
      try{
      this.sqlmapclient.startTransaction();
      this.sqlmapclient.startBatch();
      while(!this.list.isEmpty()){
         SqlOperation s = this.list.remove(0);
         if (s.obj==null){
            if (s.type.equals(SqlOpe.Insert)){
               this.sqlmapclient.insert(s.sqlID);
            }else if(s.type.equals(SqlOpe.Update)){
               this.sqlmapclient.update(s.sqlID);
            }else if(s.type.equals(SqlOpe.Delete)){
               this.sqlmapclient.delete(s.sqlID);
            }
         }else{
            if (s.type.equals(SqlOpe.Insert)){
               this.sqlmapclient.insert(s.sqlID,s.obj);
            }else if(s.type.equals(SqlOpe.Update)){
               this.sqlmapclient.update(s.sqlID,s.obj);
            }else if(s.type.equals(SqlOpe.Delete)){
               this.sqlmapclient.delete(s.sqlID,s.obj);
            }
         }
      }
      this.sqlmapclient.executeBatch();
      this.sqlmapclient.commitTransaction();
      }catch(Exception e){
         flg = false;
      }finally{
         try{this.sqlmapclient.endTransaction();}catch(Exception e){}
      }
      if (flg){
         this.success();
      }else{
         this.failed();
      }
      return QueCatchNext.CONTINUE;
   }

   /* (非 Javadoc)
    * @see QueCatcher#read(java.lang.Object)
    */

   @Override
   public QueCatchNext read(SqlOperation s){
      if (s.sqlID==null) return QueCatchNext.END;
      if (s.type != null) this.list.add(s);
      return QueCatchNext.CONTINUE;
   }

}
=====================================
public class SqlOperation implements Comparable<SqlOperation>{
   public String sqlID;
   public SqlOpe type;
   public Object obj;
   public SqlOperation(){}
   public SqlOperation(String sqlID,SqlOpe type){
      this.sqlID = sqlID;
      this.type = type;
      this.obj = null;
   }
   public SqlOperation(String sqlID,SqlOpe type,Object obj){
      this.sqlID = sqlID;
      this.type = type;
      this.obj = obj;
   }
   @Override
   public int compareTo(SqlOperation o){
      return 1;
   }
}
========================================
public enum SqlOpe{
   Insert
   ,Update
   ,Delete
}