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