IDEMPIERE-3653 1004207 Change behavior of system cacheing for multi-tenants. Use distributed cache for scheduler model. / integrate patch from hengsin

This commit is contained in:
Carlos Ruiz 2014-08-19 17:11:56 +08:00
parent 2b963b7ac1
commit e682565d95
1 changed files with 60 additions and 35 deletions

View File

@ -27,6 +27,7 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.List; import java.util.List;
import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.model.MAttachment; import org.compiere.model.MAttachment;
@ -45,6 +46,7 @@ import org.compiere.model.MUser;
import org.compiere.process.ProcessInfo; import org.compiere.process.ProcessInfo;
import org.compiere.process.ProcessInfoUtil; import org.compiere.process.ProcessInfoUtil;
import org.compiere.process.ServerProcessCtl; import org.compiere.process.ServerProcessCtl;
import org.compiere.util.CCache;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.DisplayType; import org.compiere.util.DisplayType;
import org.compiere.util.Env; import org.compiere.util.Env;
@ -71,32 +73,34 @@ public class Scheduler extends AdempiereServer
public Scheduler (MScheduler model) public Scheduler (MScheduler model)
{ {
super (model, 30); // 30 seconds delay super (model, 30); // 30 seconds delay
m_model = model; AD_Scheduler_ID = model.getAD_Scheduler_ID();
// m_client = MClient.get(model.getCtx(), model.getAD_Client_ID()); // m_client = MClient.get(model.getCtx(), model.getAD_Client_ID());
} // Scheduler } // Scheduler
/** The Concrete Model */
protected MScheduler m_model = null;
/** Last Summary */ /** Last Summary */
protected StringBuffer m_summary = new StringBuffer(); protected StringBuffer m_summary = new StringBuffer();
/** Transaction */ /** Transaction */
protected Trx m_trx = null; protected Trx m_trx = null;
protected int AD_Scheduler_ID;
private static CCache<Integer,MScheduler> s_cache = new CCache<Integer,MScheduler>(MScheduler.Table_Name, 10, 60, true);
/** /**
* Work * Work
*/ */
protected void doWork () protected void doWork ()
{ {
m_summary = new StringBuffer(m_model.toString()) m_summary = new StringBuffer(get(getCtx(), AD_Scheduler_ID).toString())
.append(" - "); .append(" - ");
// Prepare a ctx for the report/process - BF [1966880] // Prepare a ctx for the report/process - BF [1966880]
MClient schedclient = MClient.get(getCtx(), m_model.getAD_Client_ID()); MClient schedclient = MClient.get(getCtx(), get(getCtx(), AD_Scheduler_ID).getAD_Client_ID());
Env.setContext(getCtx(), "#AD_Client_ID", schedclient.getAD_Client_ID()); Env.setContext(getCtx(), "#AD_Client_ID", schedclient.getAD_Client_ID());
Env.setContext(getCtx(), "#AD_Language", schedclient.getAD_Language()); Env.setContext(getCtx(), "#AD_Language", schedclient.getAD_Language());
Env.setContext(getCtx(), "#AD_Org_ID", m_model.getAD_Org_ID()); Env.setContext(getCtx(), "#AD_Org_ID", get(getCtx(), AD_Scheduler_ID).getAD_Org_ID());
if (m_model.getAD_Org_ID() != 0) { if (get(getCtx(), AD_Scheduler_ID).getAD_Org_ID() != 0) {
MOrgInfo schedorg = MOrgInfo.get(getCtx(), m_model.getAD_Org_ID(), null); MOrgInfo schedorg = MOrgInfo.get(getCtx(), get(getCtx(), AD_Scheduler_ID).getAD_Org_ID(), null);
if (schedorg.getM_Warehouse_ID() > 0) if (schedorg.getM_Warehouse_ID() > 0)
Env.setContext(getCtx(), "#M_Warehouse_ID", schedorg.getM_Warehouse_ID()); Env.setContext(getCtx(), "#M_Warehouse_ID", schedorg.getM_Warehouse_ID());
} }
@ -104,14 +108,14 @@ public class Scheduler extends AdempiereServer
Env.setContext(getCtx(), "#SalesRep_ID", getAD_User_ID()); Env.setContext(getCtx(), "#SalesRep_ID", getAD_User_ID());
// TODO: It can be convenient to add AD_Scheduler.AD_Role_ID // TODO: It can be convenient to add AD_Scheduler.AD_Role_ID
MUser scheduser = MUser.get(getCtx(), getAD_User_ID()); MUser scheduser = MUser.get(getCtx(), getAD_User_ID());
MRole[] schedroles = scheduser.getRoles(m_model.getAD_Org_ID()); MRole[] schedroles = scheduser.getRoles(get(getCtx(), AD_Scheduler_ID).getAD_Org_ID());
if (schedroles != null && schedroles.length > 0) if (schedroles != null && schedroles.length > 0)
Env.setContext(getCtx(), "#AD_Role_ID", schedroles[0].getAD_Role_ID()); // first role, ordered by AD_Role_ID Env.setContext(getCtx(), "#AD_Role_ID", schedroles[0].getAD_Role_ID()); // first role, ordered by AD_Role_ID
Timestamp ts = new Timestamp(System.currentTimeMillis()); Timestamp ts = new Timestamp(System.currentTimeMillis());
SimpleDateFormat dateFormat4Timestamp = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat dateFormat4Timestamp = new SimpleDateFormat("yyyy-MM-dd");
Env.setContext(getCtx(), "#Date", dateFormat4Timestamp.format(ts)+" 00:00:00" ); // JDBC format Env.setContext(getCtx(), "#Date", dateFormat4Timestamp.format(ts)+" 00:00:00" ); // JDBC format
MProcess process = new MProcess(getCtx(), m_model.getAD_Process_ID(), null); MProcess process = new MProcess(getCtx(), get(getCtx(), AD_Scheduler_ID).getAD_Process_ID(), null);
try try
{ {
m_trx = Trx.get(Trx.createTrxName("Scheduler"), true); m_trx = Trx.get(Trx.createTrxName("Scheduler"), true);
@ -133,10 +137,10 @@ public class Scheduler extends AdempiereServer
} }
// //
int no = m_model.deleteLog(); int no = get(getCtx(), AD_Scheduler_ID).deleteLog();
m_summary.append(" Logs deleted=").append(no); m_summary.append(" Logs deleted=").append(no);
// //
MSchedulerLog pLog = new MSchedulerLog(m_model, m_summary.toString()); MSchedulerLog pLog = new MSchedulerLog(get(getCtx(), AD_Scheduler_ID), m_summary.toString());
pLog.setReference("#" + String.valueOf(p_runCount) pLog.setReference("#" + String.valueOf(p_runCount)
+ " - " + TimeUtil.formatElapsed(new Timestamp(p_startWork))); + " - " + TimeUtil.formatElapsed(new Timestamp(p_startWork)));
pLog.saveEx(); pLog.saveEx();
@ -153,18 +157,18 @@ public class Scheduler extends AdempiereServer
if (log.isLoggable(Level.INFO)) log.info(process.toString()); if (log.isLoggable(Level.INFO)) log.info(process.toString());
boolean isReport = (process.isReport() || process.getAD_ReportView_ID() > 0 || process.getJasperReport() != null || process.getAD_PrintFormat_ID() > 0); boolean isReport = (process.isReport() || process.getAD_ReportView_ID() > 0 || process.getJasperReport() != null || process.getAD_PrintFormat_ID() > 0);
String schedulerName = Env.parseContext(getCtx(), -1, m_model.getName(), false, true); String schedulerName = Env.parseContext(getCtx(), -1, get(getCtx(), AD_Scheduler_ID).getName(), false, true);
// Process (see also MWFActivity.performWork // Process (see also MWFActivity.performWork
int AD_Table_ID = m_model.getAD_Table_ID(); int AD_Table_ID = get(getCtx(), AD_Scheduler_ID).getAD_Table_ID();
int Record_ID = m_model.getRecord_ID(); int Record_ID = get(getCtx(), AD_Scheduler_ID).getRecord_ID();
// //
MPInstance pInstance = new MPInstance(process, Record_ID); MPInstance pInstance = new MPInstance(process, Record_ID);
fillParameter(pInstance); fillParameter(pInstance);
// //
ProcessInfo pi = new ProcessInfo (process.getName(), process.getAD_Process_ID(), AD_Table_ID, Record_ID); ProcessInfo pi = new ProcessInfo (process.getName(), process.getAD_Process_ID(), AD_Table_ID, Record_ID);
pi.setAD_User_ID(getAD_User_ID()); pi.setAD_User_ID(getAD_User_ID());
pi.setAD_Client_ID(m_model.getAD_Client_ID()); pi.setAD_Client_ID(get(getCtx(), AD_Scheduler_ID).getAD_Client_ID());
pi.setAD_PInstance_ID(pInstance.getAD_PInstance_ID()); pi.setAD_PInstance_ID(pInstance.getAD_PInstance_ID());
pi.setIsBatch(true); pi.setIsBatch(true);
pi.setPrintPreview(true); pi.setPrintPreview(true);
@ -175,7 +179,7 @@ public class Scheduler extends AdempiereServer
if ( pi.isError() ) // note, this call close the transaction, don't use m_trx below if ( pi.isError() ) // note, this call close the transaction, don't use m_trx below
{ {
// notify supervisor if error // notify supervisor if error
int supervisor = m_model.getSupervisor_ID(); int supervisor = get(getCtx(), AD_Scheduler_ID).getSupervisor_ID();
if (supervisor > 0) if (supervisor > 0)
{ {
MUser user = new MUser(getCtx(), supervisor, null); MUser user = new MUser(getCtx(), supervisor, null);
@ -187,20 +191,20 @@ public class Scheduler extends AdempiereServer
if (email) if (email)
{ {
MClient client = MClient.get(m_model.getCtx(), m_model.getAD_Client_ID()); MClient client = MClient.get(get(getCtx(), AD_Scheduler_ID).getCtx(), get(getCtx(), AD_Scheduler_ID).getAD_Client_ID());
client.sendEMail(from, user, schedulerName, pi.getSummary() + " " + pi.getLogInfo(), null); client.sendEMail(from, user, schedulerName, pi.getSummary() + " " + pi.getLogInfo(), null);
} }
if (notice) { if (notice) {
int AD_Message_ID = 442; // HARDCODED ProcessRunError int AD_Message_ID = 442; // HARDCODED ProcessRunError
MNote note = new MNote(getCtx(), AD_Message_ID, supervisor, null); MNote note = new MNote(getCtx(), AD_Message_ID, supervisor, null);
note.setClientOrg(m_model.getAD_Client_ID(), m_model.getAD_Org_ID()); note.setClientOrg(get(getCtx(), AD_Scheduler_ID).getAD_Client_ID(), get(getCtx(), AD_Scheduler_ID).getAD_Org_ID());
note.setTextMsg(schedulerName+"\n"+pi.getSummary()); note.setTextMsg(schedulerName+"\n"+pi.getSummary());
note.setRecord(MPInstance.Table_ID, pi.getAD_PInstance_ID()); note.setRecord(MPInstance.Table_ID, pi.getAD_PInstance_ID());
note.saveEx(); note.saveEx();
String log = pi.getLogInfo(true); String log = pi.getLogInfo(true);
if (log != null && log.trim().length() > 0) { if (log != null && log.trim().length() > 0) {
MAttachment attachment = new MAttachment (getCtx(), MNote.Table_ID, note.getAD_Note_ID(), null); MAttachment attachment = new MAttachment (getCtx(), MNote.Table_ID, note.getAD_Note_ID(), null);
attachment.setClientOrg(m_model.getAD_Client_ID(), m_model.getAD_Org_ID()); attachment.setClientOrg(get(getCtx(), AD_Scheduler_ID).getAD_Client_ID(), get(getCtx(), AD_Scheduler_ID).getAD_Org_ID());
attachment.setTextMsg(schedulerName); attachment.setTextMsg(schedulerName);
attachment.addEntry("ProcessLog.html", log.getBytes("UTF-8")); attachment.addEntry("ProcessLog.html", log.getBytes("UTF-8"));
attachment.saveEx(); attachment.saveEx();
@ -210,7 +214,7 @@ public class Scheduler extends AdempiereServer
} }
// always notify recipients // always notify recipients
Integer[] userIDs = m_model.getRecipientAD_User_IDs(); Integer[] userIDs = get(getCtx(), AD_Scheduler_ID).getRecipientAD_User_IDs();
if (userIDs.length > 0) if (userIDs.length > 0)
{ {
ProcessInfoUtil.setLogFromDB(pi); ProcessInfoUtil.setLogFromDB(pi);
@ -234,10 +238,10 @@ public class Scheduler extends AdempiereServer
if (isReport) if (isReport)
AD_Message_ID = 884; // HARDCODED SchedulerResult AD_Message_ID = 884; // HARDCODED SchedulerResult
MNote note = new MNote(getCtx(), AD_Message_ID, userIDs[i].intValue(), null); MNote note = new MNote(getCtx(), AD_Message_ID, userIDs[i].intValue(), null);
note.setClientOrg(m_model.getAD_Client_ID(), m_model.getAD_Org_ID()); note.setClientOrg(get(getCtx(), AD_Scheduler_ID).getAD_Client_ID(), get(getCtx(), AD_Scheduler_ID).getAD_Org_ID());
if (isReport) { if (isReport) {
note.setTextMsg(schedulerName); note.setTextMsg(schedulerName);
note.setDescription(m_model.getDescription()); note.setDescription(get(getCtx(), AD_Scheduler_ID).getDescription());
note.setRecord(AD_Table_ID, Record_ID); note.setRecord(AD_Table_ID, Record_ID);
} else { } else {
note.setTextMsg(schedulerName + "\n" + pi.getSummary()); note.setTextMsg(schedulerName + "\n" + pi.getSummary());
@ -248,7 +252,7 @@ public class Scheduler extends AdempiereServer
if (fileList != null && !fileList.isEmpty()) { if (fileList != null && !fileList.isEmpty()) {
// Attachment // Attachment
attachment = new MAttachment (getCtx(), MNote.Table_ID, note.getAD_Note_ID(), null); attachment = new MAttachment (getCtx(), MNote.Table_ID, note.getAD_Note_ID(), null);
attachment.setClientOrg(m_model.getAD_Client_ID(), m_model.getAD_Org_ID()); attachment.setClientOrg(get(getCtx(), AD_Scheduler_ID).getAD_Client_ID(), get(getCtx(), AD_Scheduler_ID).getAD_Org_ID());
attachment.setTextMsg(schedulerName); attachment.setTextMsg(schedulerName);
for (File entry : fileList) for (File entry : fileList)
attachment.addEntry(entry); attachment.addEntry(entry);
@ -258,7 +262,7 @@ public class Scheduler extends AdempiereServer
if (log != null && log.trim().length() > 0) { if (log != null && log.trim().length() > 0) {
if (attachment == null) { if (attachment == null) {
attachment = new MAttachment (getCtx(), MNote.Table_ID, note.getAD_Note_ID(), null); attachment = new MAttachment (getCtx(), MNote.Table_ID, note.getAD_Note_ID(), null);
attachment.setClientOrg(m_model.getAD_Client_ID(), m_model.getAD_Org_ID()); attachment.setClientOrg(get(getCtx(), AD_Scheduler_ID).getAD_Client_ID(), get(getCtx(), AD_Scheduler_ID).getAD_Org_ID());
attachment.setTextMsg(schedulerName); attachment.setTextMsg(schedulerName);
} }
attachment.addEntry("ProcessLog.html", log.getBytes("UTF-8")); attachment.addEntry("ProcessLog.html", log.getBytes("UTF-8"));
@ -271,11 +275,11 @@ public class Scheduler extends AdempiereServer
if (email) if (email)
{ {
MMailText mailTemplate = new MMailText(getCtx(), m_model.getR_MailText_ID(), null); MMailText mailTemplate = new MMailText(getCtx(), get(getCtx(), AD_Scheduler_ID).getR_MailText_ID(), null);
String mailContent = ""; String mailContent = "";
if (mailTemplate.is_new()){ if (mailTemplate.is_new()){
mailContent = m_model.getDescription(); mailContent = get(getCtx(), AD_Scheduler_ID).getDescription();
}else{ }else{
mailTemplate.setUser(user); mailTemplate.setUser(user);
mailTemplate.setLanguage(Env.getContext(getCtx(), "#AD_Language")); mailTemplate.setLanguage(Env.getContext(getCtx(), "#AD_Language"));
@ -284,7 +288,7 @@ public class Scheduler extends AdempiereServer
schedulerName = mailTemplate.getMailHeader(); schedulerName = mailTemplate.getMailHeader();
} }
MClient client = MClient.get(m_model.getCtx(), m_model.getAD_Client_ID()); MClient client = MClient.get(get(getCtx(), AD_Scheduler_ID).getCtx(), get(getCtx(), AD_Scheduler_ID).getAD_Client_ID());
if (fileList != null && !fileList.isEmpty()) { if (fileList != null && !fileList.isEmpty()) {
client.sendEMailAttachments(from, user, schedulerName, mailContent, fileList); client.sendEMailAttachments(from, user, schedulerName, mailContent, fileList);
} else { } else {
@ -308,12 +312,12 @@ public class Scheduler extends AdempiereServer
protected int getAD_User_ID() { protected int getAD_User_ID() {
int AD_User_ID; int AD_User_ID;
if (m_model.getSupervisor_ID() > 0) if (get(getCtx(), AD_Scheduler_ID).getSupervisor_ID() > 0)
AD_User_ID = m_model.getSupervisor_ID(); AD_User_ID = get(getCtx(), AD_Scheduler_ID).getSupervisor_ID();
else if (m_model.getCreatedBy() > 0) else if (get(getCtx(), AD_Scheduler_ID).getCreatedBy() > 0)
AD_User_ID = m_model.getCreatedBy(); AD_User_ID = get(getCtx(), AD_Scheduler_ID).getCreatedBy();
else if (m_model.getUpdatedBy() > 0) else if (get(getCtx(), AD_Scheduler_ID).getUpdatedBy() > 0)
AD_User_ID = m_model.getUpdatedBy(); AD_User_ID = get(getCtx(), AD_Scheduler_ID).getUpdatedBy();
else else
AD_User_ID = 100; //fall back to SuperUser AD_User_ID = 100; //fall back to SuperUser
return AD_User_ID; return AD_User_ID;
@ -325,7 +329,7 @@ public class Scheduler extends AdempiereServer
*/ */
protected void fillParameter(MPInstance pInstance) protected void fillParameter(MPInstance pInstance)
{ {
MSchedulerPara[] sParams = m_model.getParameters (false); MSchedulerPara[] sParams = get(getCtx(), AD_Scheduler_ID).getParameters (false);
MPInstancePara[] iParams = pInstance.getParameters(); MPInstancePara[] iParams = pInstance.getParameters();
for (int pi = 0; pi < iParams.length; pi++) for (int pi = 0; pi < iParams.length; pi++)
{ {
@ -574,4 +578,25 @@ public class Scheduler extends AdempiereServer
return "#" + p_runCount + " - Last=" + m_summary.toString(); return "#" + p_runCount + " - Last=" + m_summary.toString();
} // getServerInfo } // getServerInfo
/**
* @param ctx
* @param AD_Scheduler_ID
* @return MScheduler
*/
protected static MScheduler get(Properties ctx, int AD_Scheduler_ID)
{
Integer key = new Integer(AD_Scheduler_ID);
MScheduler retValue = (MScheduler)s_cache.get(key);
if (retValue == null)
{
retValue = new MScheduler(ctx, AD_Scheduler_ID, null);
if (AD_Scheduler_ID == 0)
{
String trxName = null;
retValue.load(trxName); // load System Record
}
s_cache.put(key, retValue);
}
return retValue;
} // get
} // Scheduler } // Scheduler