1 14 package org.compiere.acct; 15 16 import java.util.*; 17 import java.sql.*; 18 19 import org.compiere.util.*; 20 21 28 public class AcctServer extends Thread 29 { 30 38 public static boolean postImmediate (int AD_Table_ID, int AD_Client_ID, int Record_ID, boolean force) 39 { 40 return Doc.post(AD_Table_ID, AD_Client_ID, Record_ID, force); 41 } 43 44 private static Logger log = Logger.getCLogger(AcctServer.class); 45 46 47 48 57 public AcctServer (int workerNo, int sleepMinutes, int maxSleepMinutes, 58 int batchSize, AcctServerWork[] queue, boolean runOnce) 59 { 60 super("AcctServer_" + workerNo); 61 m_workerNo = workerNo; 62 m_sleepMinutes = sleepMinutes; 63 m_maxSleepMinutes = maxSleepMinutes; 64 m_batchSize = batchSize; 65 m_queue = queue; 66 m_runOnce = runOnce; 67 } 69 70 private int m_workerNo; 71 72 private int m_sleepMinutes; 73 74 private int m_maxSleepMinutes; 75 76 private int m_batchSize; 77 78 private AcctServerWork[] m_queue; 79 private boolean m_runOnce; 80 81 82 92 public void run() 93 { 94 try 95 { 96 Thread.sleep(60000); } 99 catch (InterruptedException ex) 100 { 101 log.info("run_" + m_workerNo + ": " + ex.getMessage()); 102 return; 103 } 104 105 int noTrx = 0; 106 int noSleeps = 0; 107 108 while (!isInterrupted()) 110 { 111 log.info("run_" + m_workerNo); 112 noTrx = 0; 114 for (int i = 0; !isInterrupted() && i < m_queue.length; i++) 115 { 116 Doc doc = Doc.get(m_queue[i].get_AD_Table_ID(), m_queue[i].get_AD_Client_ID()); 118 if (doc == null) 119 continue; 120 m_queue[i].addRun(); 121 StringBuffer sql = new StringBuffer ("SELECT "); 123 sql.append(doc.getTableName()).append("_ID") 124 .append(" FROM ").append(doc.getTableName()) 125 .append(" WHERE AD_Client_ID=?") 126 .append(" AND Processed='Y' AND Posted='N'"); 127 if (m_batchSize > 0) 128 sql.append(" AND ROWNUM <= ").append(m_batchSize); 129 sql.append(" ORDER BY Created"); 130 try 132 { 133 PreparedStatement pstmt = DB.prepareStatement(sql.toString()); 134 pstmt.setInt(1, m_queue[i].get_AD_Client_ID()); 135 ResultSet rs = pstmt.executeQuery(); 136 while (!isInterrupted() && rs.next()) 137 { 138 m_queue[i].addPost (doc.post(rs.getInt(1), false)); } 140 rs.close(); 141 pstmt.close(); 142 } 143 catch (SQLException e) 144 { 145 log.error("run_" + m_workerNo, e); 146 } 147 if (m_queue[i].getTrxInRun() > 0) 148 log.info("run_" + m_workerNo + " " 149 + m_queue[i].toString()); 150 noTrx += m_queue[i].getTrxInRun(); 151 } 153 if (isInterrupted()) 154 break; 155 156 new Matcher(m_queue[0].get_AD_Client_ID()).match (); 158 159 if (isInterrupted() || m_runOnce) 160 break; 161 162 if (noTrx == 0) 164 { 165 m_queue[0].addSleep(); 166 if (noSleeps++ > 0 && m_sleepMinutes < m_maxSleepMinutes) 167 m_sleepMinutes++; 168 log.debug("run_" + m_workerNo + " - sleeping - min=" + m_sleepMinutes); 169 try 170 { 171 for (int i = 0; i < m_sleepMinutes * 6; i++) 172 sleep (10000); if (isInterrupted()) 174 break; 175 } 176 catch (Exception e) 177 { 178 log.info ("run_" + m_workerNo + ": " + e.getMessage()); 179 return; 180 } 181 } 182 else 183 noSleeps = 0; 184 } log.info ("run_" + m_workerNo + " - done "); 186 } 188 } | Popular Tags |