Run ODI from Essbase CalcScript
Source vvsprog
Недавно на каком то из блогов видел пример запуска сценария ODI с помощью написанной странички.
Здесь опишу способ запуска сценария без написания странички, а с помощью бизнес правила Essbase.
Сценарий могут запуcкать конечные пользователи из Hyperion Planning и задавать параметры для сценария интеграции страндартным образом.
В моем случае нужно грузить данные из OEBS (Oracle E-Business Suite) в Hyperion Planning. Для чего была написана view на стороне OEBS
и создан ODI сценарий загрузки с параметрами в Hyperion Planning из view OEBS.
Среда: OEBS 12, Hyperion 11.1.1.3, Oracle Data Integrator 11.1.1.3, компиляция с помощью jdk1.6.0_21, в essbase.cfg прописан jre из jdk1.6.0_21
Для того чтобы это сделать напишем UDF – ODI.java:
package com.oracle.essbase.cdf;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
import java.io.*;
import java.util.Map;
import java.util.HashMap;import oracle.odi.runtime.agent.invocation.RemoteRuntimeAgentInvoker;
import oracle.odi.runtime.agent.invocation.StartupParams;
import oracle.odi.runtime.agent.invocation.ExecutionInfo;
import oracle.odi.runtime.agent.invocation.InvocationException;public class ODI {
public static void main(String[] args) throws Exception, InvocationException{
InvokeODIScenario(“http://server:20910/oraclediagent;SUPERVISOR;12345678″,”ACTUALS_FROM_OEBS;001;DEVELOPMENT;5;WORKREP1″,
“PROJECT.Scenario=Actual;PROJECT.Version=Version1;PROJECT.Year=2011;PROJECT.P
eriod=Feb”);}
public static void ThrowException(String pMessage) throws Exception{
throw new Exception(pMessage);
}public static void InvokeODIScenario(String pAgentInfo,String pScenarioInfo,String pScenarioParams) throws Exception, InvocationException{
String[] arrAgentInfo = pAgentInfo.split(“;”);
if (arrAgentInfo.length < 3) ThrowException(“Please set Agent Info parameters (first parameter of function)”);String[] arrScenarioInfo = pScenarioInfo.split(“;”);
if (arrScenarioInfo.length < 5) ThrowException(“Please set Scenario Info parameters (second parameter of function)”);java.lang.String pScenName = arrScenarioInfo[0];
java.lang.String pScenVersion = arrScenarioInfo[1];String[] arrScenarioParams = pScenarioParams.split(“;”);
Map<String,String> mp=new HashMap<String, String>();
for(int i=0;i<arrScenarioParams.length;i++)
{
if (arrScenarioParams[i].length() == 0)
continue;
String[] arrScenarioParam = arrScenarioParams[i].split(“=”);
if (arrScenarioParam.length < 2) ThrowException(“Please set Scenario parameters corretly in ParamName1=ParamValue1;ParamName2=ParamValue2 maner(third parameter of function)”);mp.put(arrScenarioParam[0], arrScenarioParam[1]);
}StartupParams pVariables = new StartupParams(mp);
java.lang.String pKeywords = null;
java.lang.String pContextCode = arrScenarioInfo[2];
java.lang.Integer pLogLevel = Integer.parseInt(arrScenarioInfo[3]);
java.lang.String pSessionName = null;
boolean pSynchronous = false;
java.lang.String pWorkRepName = arrScenarioInfo[4];
RemoteRuntimeAgentInvoker invoker = new RemoteRuntimeAgentInvoker(arrAgentInfo[0],arrAgentInfo[1],arrAgentInfo[2]);
ExecutionInfo info = invoker.invokeStartScenario(pScenName,pScenVersion,pVariables,pKeywords,pContextCode,pLogLevel,pSessionN
ame,pSynchronous,pWorkRepName);}
}
Я компилировал с помощью apache ant. При компиляции и теcтировании понадобились следующие jar файлы ODI
set CLASSPATH=%CLASSPATH%C:\app\oracle\product\11.1.1.3\odihome_1\oracledi.sdk\lib\odi-core.jar;
set CLASSPATH=%CLASSPATH%C:\app\oracle\product\11.1.1.3\odihome_1\oracledi.sdk\lib\commons-httpclient-3.1.jar;
set CLASSPATH=%CLASSPATH%C:\app\oracle\product\11.1.1.3\odihome_1\oracledi.sdk\lib\spring-core.jar;
set CLASSPATH=%CLASSPATH%C:\app\oracle\product\11.1.1.3\odihome_1\oracledi.sdk\lib\commons-logging-1.1.1.jar;
set CLASSPATH=%CLASSPATH%C:\app\oracle\product\11.1.1.3\odihome_1\oracledi.sdk\lib\commons-codec-1.3.jar;
Полученный ODI.jar и вышеперечисленные jar файлы кладем в %HYPERION_HOME%\products\Essbase\EssbaseServer\java\udf.
например у меня файлы данных Essbase лежат на другом диске и я положил по другому пути (E:\ESSDATA\java\udf)
Поднявшись на каталог выше правим файл udf.policy, добавляем строки:
grant codeBase “file:${essbase.java.home}/udf/ODI.jar” {
permission java.security.AllPermission;
};grant codeBase “file:${essbase.java.home}/udf/commons-codec-1.3.jar” {
permission java.security.AllPermission;
};grant codeBase “file:${essbase.java.home}/udf/commons-httpclient-3.1.jar” {
permission java.security.AllPermission;
};grant codeBase “file:${essbase.java.home}/udf/commons-logging-1.1.1.jar” {
permission java.security.AllPermission;
};grant codeBase “file:${essbase.java.home}/udf/odi-core.jar” {
permission java.security.AllPermission;
};grant codeBase “file:${essbase.java.home}/udf/spring-core.jar” {
permission java.security.AllPermission;
};
После чего нам надо перегрузить Essbase.
Создаем файл RegisterODI.msh
set UserName = ‘admin’;
set Password = ‘password’;
set ServerName = ‘server’;LOGIN $UserName $Password ON $ServerName;
CREATE OR REPLACE FUNCTION ‘@JInvokeODIScenario’
AS ‘com.oracle.essbase.cdf.ODI.InvokeODIScenario(String,String,String)’
SPEC ‘@JInvokeODIScenario(pAgentInfo,pScenarioInfo,pScenarioParams)’
COMMENT ‘Execute ODI Scenario’
with property runtime;logout;
exit;
создаем RegisterODI.bat файл рядом
set ARBORPATH=E:\ESSDATA
set ESSBASEPATH=C:\Hyperion\products\Essbase\EssbaseServerC:\Hyperion\products\Essbase\EssbaseServer\bin\essmsh RegisterODI.msh
pause
Запускаем RegisterODI.bat, тут надо убедится что все функции зарегистрированны. Например из за того что у меня данные
лежат на другом диске у меня возникла проблема(essmsh не мог найти function registry, чтото типа того).
Я не стал разбираться какой файл есть function registry а просто перекопировал bin каталог в ARBORPATH из HYPERION_HOME\products\Essbase\EssbaseServer. После этого все зарегистрировалось. Возможно есть более “Прямой” способ это исправить:)
Пишем тестовое бизнес правило:
FIX(…)
“Actual”(@JInvokeODIScenario(“http://server:20910/oraclediagent;SUPERVISOR;12345678″,”IN_PLANS_PLAN1DATA_001;001;DEVELOPMENT;5;WORKREP1″,
@CONCATENATE(
@CONCATENATE(
@CONCATENATE(
@CONCATENATE(
@CONCATENATE(
@CONCATENATE(
@CONCATENATE(“PROJECT.Scenario=”, @NAME([AAScenario])), “;PROJECT.Version=”), @NAME([AAVersion])),
“;PROJECT.Year=”),@NAME([AAYear])),”;PROJECT.Period=”),@NAME([AAPeriod]))
);)
ENDFIX
В моем случае у @JInvokeODIScenario 3 параметра:
1 параметр адрес агента(http://server:20910/oraclediagent), логин(SUPERVISOR) и пароль(12345678) разделенные ;
2 параметр наименование сценария(IN_PLANS_PLAN1DATA_001), версия сценария (001), контекст(DEVELOPMENT), уровень логов(5),
имя рабочего репозитария(WORKREP1) разделенные ;
3 параметр это параметры сценария в формате ИМЯПАРАМЕТРА1=ЗНАЧЕНИЕ1;ИМЯПАРАМЕТРА2=ЗНАЧЕНИЕ2 итд. Можно указать пустое значение если нет параметра.
Бизнес правило можно подключить на форму Hyperion Planning (с помощью меню или просто на форме)
и дать возможность инициировать загрузку данных из различных источников конечным пользователям
(либо ограничить только определенным лицам стандартными механизмами безопасности).
Думаю все тоже самое можно сделать и с предыдущей версией ODI (Возможно другой набор API)
Удачи!