项目上需要发布ODI的webservice,供给siebel调用,使得siebel可手动触发ODI方案运行,达到实时传递数据的目的。
为实现该功能,做了以下尝试:
1)Tomcat5.x+Apache Axis2_1.2+odi-public-ws.aar发布webservice
前提:需要安装Tomcat5.x版本,JDK5.x版本,6.x以上版本会出现报错
Axis2需要1.2版本
Axis2部署到Tomcat后,登录Axis2应用http://xxx.xx.xx.xxx:7011/axis2,将odi-public-ws.aar上传,成功后可在Axis2的services里看到OdiInvoke的服务
外界可通过http://xxx.xx.xx.xxx:7011/OdiInvoke?wsdl中的invokeScenario方法触发方案运行,详细步骤不在此表述。
结论:wsdl正确发布,且所需参数都正确提供后,该方案可达到目的,可实现所需功能。
因客户方偏好问题,不赞成使用Tomcat作为发布容器,因此产生第二种尝试
2)WebLogic+Apache Axis2_1.2.war+odi-public-ws.aar发布webservice
前提:安装weblogic11g, Axis2需要1.2版本
Axis2的版本务必是1.2的,否则部署到weblogic时不成功。
Axis2安装成功后,登录http://xxx.xx.xx.xxx:7011/axis2,通过上传按钮,将odi-public-ws.aar上传到服务器,然后到AXIS2的services查看,发现没有OdiInvoke服务。
网上查找资料,找到解决方法如下:
在将Axis2.war文件上传之前,做如下操作
1> 将odi-public-ws.aar添加到axis2.warWEB-INF/services/目录下,同时,修改该目录下的services.list文件,文件内容如下:
version.aar
odi-public-ws.aar
2>将axis2.war发布到weblogic,发布成功后,可看到OdiInvoke服务,说明部署成功
点击OdiInvoke服务进入页面,页面前面部分的xml内容显示正常,但在后面却报错:
The XML page cannot be displayed
Cannot view XML input using XSL style sheet. Please correct the error and then click the Refresh button, or try again later.
--------------------------------------------------------------------------------
The operation completed successfully. Error processing resource 'http://172.19.1.32:7101/axis2/services/OdiInvoke?wsdl'. L...
</xs:schema></wsdl:types><wsdl:message name="listContextMessage"><wsdl:part name="part1" element="ns17:...
AN> type="xs:anyType" />
<xs:element name="outFaultFlow" nillable="true" type="xs:anyType" />
<xs:element name="outFaultPhases" nillable="true" type="xs:anyType" />
多方查找资料,未果。怀疑是weblogic的xml解析器问题造成的,本打算把weblogic的解析器替换掉,但担心引起其他潜在问题,此方案被否决,因此做第三个方案尝试。
3)odi-sdk-invocation.jar+java Class+webservice+weblogic
上述尝试失败后,决定将odi-public-ws.aar解压,将方案调用的Java Api:odi-sdk-invocation.jar取出来在java直接进行调用,java里面的调用测试代码如下:
public static void main(String[] args){
OdiCommandScenario ODIcmdScenario = new OdiCommandScenario();
ODIcmdScenario.setScenName("SNOWWOLF.ERP_SIEBEL_LOAD_DISTRIBUTOR_RS_DATA_CDC");
ODIcmdScenario.setScenVersion("001");
ODIcmdScenario.setContext("Global");
ODIcmdScenario.setLogLevel(5);
ODIcmdScenario.addVariable("SNOWWOLF.SIEBEL_IMPORT_STATUS", "未导入");//PROJECT NAME.VAR NAME
//set synchronous mode
ODIcmdScenario.setSyncMode(OdiCommandScenario.SYNC_MODE_SYNCHRONOUS);
//set connection details
OdiRepositoryConnection ODIConnection = new OdiRepositoryConnection();
ODIConnection.setJdbcDriver("oracle.jdbc.driver.OracleDriver");
ODIConnection.setJdbcUrl("jdbc:oracle:thin:@xxx.xx.x.xxx:1521:orcl");
ODIConnection.setJdbcUser("SOAM");
ODIConnection.setJdbcPassword("TMP");
ODIConnection.setOdiUser("ADMIN");
ODIConnection.setOdiPassword("TMP");
ODIConnection.setWorkRepositoryCode("SOAWDEV");
try
{
OdiInvocation ODIInvocation = new OdiInvocation("xxx.xx.x.xxx", 20913);//port:must be scheduler agent port
OdiInvocationResult ODIresult = ODIInvocation.invokeCommand(ODIcmdScenario, ODIConnection);
int status ;
if (ODIresult.isOk())
{
status = 1;
// logger.debug("Session " + ODIresult.getSessionNumber());
}
else
{
status = 0;
// logger.debug("Error in connecting to repository " + ODIresult.getErrorMessage());
}
ODIInvocation.close();
}
catch (Exception e)
{
e.printStackTrace();
// logger.debug("Exception " + io);
}
}
测试前,务必确保所用的scheduler agent是启动的,在JDeveloper运行该代码,测试成功。
后面可考虑将该代码发布成webservice的形式,如此即可结合weblogic一起使用。
使用JDeveloper发布webservice的过程,后期有时间会做详细的测试