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:
parent
2b963b7ac1
commit
e682565d95
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue