在ODI中通过OdiInvokeWebService执行方案invokeScenario中,遇到了几个错误,总的来说可能由于以下几个方面设置报错造成的:
1、用户名密码设置问题
不管是JdbcPassword还是OdiPassword,都无需加密,直接输入该密码,注意大小写
2、端口设置错误
invokeScenario方法调用时,需要输入Agent的端口。该端口应为Scheduler对应的端口,通常容易滥用其他端口,如ListenerAgent对应的端口。端口不正确可能会产生类似以下错误:
Agent didn't prepare this command: Error during Session Preparation : Driver must be specified
3、方案的名称无需指定工程,直接写方案名即可
4、Agent部分对应的Host应为ODI服务器主资料库所在的主机名或者是IP地址
5、连接部分的jdbcURL应为ODI主资料库对应的url信息。
6、执行超时,是否调用方案不成功问题
直接运行的方案本身就需要执行很长时间时,在 invokeScenario方法的调用下,如果设置SyncMode模式为1,time out时间为默认,则会报以下错误:
com.sunopsis.wsinvocation.SnpsWSInvocationException: java.net.SocketTimeoutException: Read timed out at com.sunopsis.wsinvocation.client.a.a.d.requestReply(d.java)
原因是:SyncMode为1意味着同步执行,需等待方案执行完毕后才能返回消息,这就面临着超时的可能,因此在数据量很大的时候,可以设置SyncMode为2.但上述报错,本身没有影响方案调用的结果,方案还是被执行的。
完整的参数信息如下所示:
<invokeScenarioRequest>
<invokeScenarioRequest>
<RepositoryConnection>
<JdbcDriver>oracle.jdbc.driver.OracleDriver</JdbcDriver>
<JdbcUrl>jdbc:oracle:thin:@xxx.xx.xx.xxx:1521:orcl</JdbcUrl>
<JdbcUser>SOAM</JdbcUser>
<JdbcPassword>TEMP</JdbcPassword>
<OdiUser>ADMIN</OdiUser>
<OdiPassword>TEMP</OdiPassword>
</RepositoryConnection>
<Command>
<ScenName>ERP_SIEBEL_LOAD_DISTRIBUTOR_RS_DATA_CDC</ScenName>
<ScenVersion>001</ScenVersion>
<Context>Global</Context>
<LogLevel>5</LogLevel>
<SyncMode>1</SyncMode>
</Command>
<Agent>
<Host>xxx.xx.xx.xxx</Host>
<Port>20913</Port>
</Agent>
</invokeScenarioRequest>
</invokeScenarioRequest>