基本需求是确定当前正在运行的任务的对象管理器的名称。如果我们还可以获得任务ID,组件名称(一般情况下),组件组名称,服务器名称和企业名称,那么额外的好处是。有没有一种方法可以找出对象管理器的名称与eScript?
实际上有一个解决方案提供here,但它有严重的局限性。只要它使用纯粹的内存中对象的Server Admin buscomps,并且不支持通过示例查询,我们就必须遍历所有记录。这可能会导致生产服务器上的数百甚至数千个活动任务出现性能问题。有没有其他办法可以获得这些信息?
基本需求是确定当前正在运行的任务的对象管理器的名称。如果我们还可以获得任务ID,组件名称(一般情况下),组件组名称,服务器名称和企业名称,那么额外的好处是。有没有一种方法可以找出对象管理器的名称与eScript?
实际上有一个解决方案提供here,但它有严重的局限性。只要它使用纯粹的内存中对象的Server Admin buscomps,并且不支持通过示例查询,我们就必须遍历所有记录。这可能会导致生产服务器上的数百甚至数千个活动任务出现性能问题。有没有其他办法可以获得这些信息?
我们可以使用服务器任务持久性组件实现目标。此组件(在8.0版中引入)启用后,会将组件任务信息存储到S_SRM_TASK_HIST表(此表的相应总线组件为“企业任务历史记录”)。所提及的业务组件是基于表的,所以我们可以通过常规方式进行查询。有几个参数可以设置组件行为。即参数“DeleteEventHistoryInterval”控制任务信息保存的时间(默认为24小时)和参数“EnableEventHistory”控制是否为各个服务器组件保存了任务信息。
因此,为了使以下eScript代码正常工作,Server Task Persistance组件应该已启动并正在运行,还应该为目标组件启用任务历史保存。我们得到任务标识样本中,几乎没有修改,我们也能获得组件名称,组件组名称,服务器名称,企业名称和其他有用的数据(用于字段的完整列表存储请参阅Siebel Tools中的相应buscomp定义)。
function Service_PreInvokeMethod (MethodName, psInputs, psOutputs)
{
if (MethodName == "Run")
{
var ProcessId = 0;
var ThreadId = 0;
var TaskId = 0;
var EntFound = false;
var SrvFound = false;
var TaskFound = false;
//Following two lines assume that Siebel server is running on Solaris OS
//Change as appropriate for other OS'es
ProcessId = SElib.dynamicLink("libsys.so", "getpid");
ThreadId = SElib.dynamicLink("libpthread.so", "pthread_self");
var boServerAdmin = TheApplication().GetBusObject("Server Admin");
var bcEnterpriseServer = boServerAdmin.GetBusComp("Enterprise Server");
var bcServerServer = boServerAdmin.GetBusComp("Server Server");
var bcTaskHistory = boServerAdmin.GetBusComp("Enterprise Task History");
with(bcEnterpriseServer)
{
ClearToQuery();
ExecuteQuery(ForwardOnly);
EntFound = FirstRecord();
while (EntFound)
//For all Enterprises
{
with(bcServerServer)
{
ClearToQuery();
ExecuteQuery(ForwardOnly);
SrvFound = FirstRecord();
while (SrvFound)
//For all Servers
{
with(bcTaskHistory)
{
ActivateField("O/S Proc Id");
ActivateField("Thread Id");
ActivateField("Task Id");
ClearToQuery();
SetSearchSpec("O/S Proc Id", ProcessId);
SetSearchSpec("Thread Id", ThreadId);
SetSortSpec("Task Start Time(DESCENDING)");
ExecuteQuery(ForwardOnly);
TaskFound = FirstRecord();
if (TaskFound)
{
//This sample returns TaskId
TaskId = GetFieldValue("Task Id");
psOutputs.SetProperty("TaskId", TaskId);
return (CancelOperation);
}
}
SrvFound = NextRecord();
}
}
EntFound = NextRecord();
}
}
psOutputs.SetProperty("TaskId", NaN);
return (CancelOperation);
}
return (ContinueOperation);
}