通过webservice调用ODI方案的实现方式

项目上需要发布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的过程,后期有时间会做详细的测试

 

 

 

              

 

 

 

 

     

展开阅读全文

没有更多推荐了,返回首页