有没有办法用eScript找出对象管理器的名称?

时间:2014-02-24 08:15:48

标签: oracle siebel server-administration escript

基本需要是确定当前运行任务的对象管理器名称。如果我们还可以获得任务ID,组件名称(一般),组件组名称,服务器名称和企业名称,则还有其他好处。

实际上有一个解决方案here,但它有严重的局限性。只要它使用纯粹的内存中对象的Server Admin buscomp并且不支持按示例查询,我们就必须遍历所有记录。这可能会导致生产服务器上出现数百甚至数千个活动任务的性能问题。我们还有其他方式可以获得这些信息吗?

1 个答案:

答案 0 :(得分:1)

我们可以使用服务器任务持久性组件来实现目标。此组件(在8.0版中引入)启用后,会将组件任务信息存储到 S_SRM_TASK_HIST 表中(此表的相应buscomp为“企业任务历史记录”)。提到的业务组件是基于表的,因此我们可以通常的方式查询。有几个参数可以设置组件行为。即参数“ DeleteEventHistoryInterval ”控制保留的任务信息的持续时间(默认为24小时),参数“ EnableEventHistory ”控制是否为各个服务器组件保存任务信息。

因此,为了使eScript代码能够正常工作,Server Task Persistance组件应该启动并运行,同时也应该为目标组件启用任务历史记录保存。我们在示例中获得任务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);
}