基本需要是确定当前运行任务的对象管理器的名称。如果我们还可以获得任务 ID、组件名称(通常)、组件组名称、服务器名称和企业名称,那么额外的好处将是。
实际上这里提供了一个解决方案,但它有严重的局限性。只要它使用纯内存对象且不支持示例查询的 Server Admin buscomps,我们就必须遍历所有记录。这可能会导致具有数百甚至数千个活动任务的生产服务器出现性能问题。有没有其他方法可以获取这些信息?
基本需要是确定当前运行任务的对象管理器的名称。如果我们还可以获得任务 ID、组件名称(通常)、组件组名称、服务器名称和企业名称,那么额外的好处将是。
实际上这里提供了一个解决方案,但它有严重的局限性。只要它使用纯内存对象且不支持示例查询的 Server Admin buscomps,我们就必须遍历所有记录。这可能会导致具有数百甚至数千个活动任务的生产服务器出现性能问题。有没有其他方法可以获取这些信息?
我们可以使用服务器任务持久性组件来实现目标。该组件(在 8.0 版中引入)在启用时会将组件任务信息存储到S_SRM_TASK_HIST表中(该表的相应 buscomp 是“ Enterprise Task History ”)。上面提到的业务组件是基于表的,所以我们可以用通常的方式查询。有几个参数可以设置组件的行为。即参数“ DeleteEventHistoryInterval ”控制任务信息保留的持续时间(默认为 24 小时),参数“ EnableEventHistory ”控制是否为各个服务器组件保存任务信息。
因此,要使 eScript 代码正常工作,服务器任务持久性组件应该启动并运行,还应该为目标组件启用任务历史记录保存。我们在示例中获得了Task Id,只需稍加修改,我们还可以获得Component Name、Component Group Name、Server Name、Enterprise Name和其他有用的数据(有关存储字段的完整列表,请参见 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);
}