如何使用Java API在Oracle ODI 11g中运行接口模拟并捕获日志?
问题描述
我希望使用Java SDK与Oracle Data Integrator 11g进行交互,目前已成功连接ODI实例,但不知道如何从选中的接口运行模拟并捕获日志。以下是我已编写的代码:
<performing connection> // Allocate an odisinstance of the name final OdiInstance odiInstance = odiInstanceHandle.getOdiInstance(); try { TransactionTemplate tx = new TransactionTemplate(odiInstance.getTransactionManager()); tx.execute(new TransactionCallbackWithoutResult() { protected void doInTransactionWithoutResult(ITransactionStatus pStatus) { // Retrieve the interface you want to simulate IOdiInterfaceFinder ifaceFinder = (IOdiInterfaceFinder) odiInstance.getTransactionalEntityManager().getFinder(OdiInterface.class); OdiInterface iface = ifaceFinder.findByQualifiedName("your_interface_name");
我想执行模拟并捕获所选接口的日志,是否可以通过Java API实现?我尝试过创建Scenario,但在网上只找到ODI 12的相关指南。
解决方案
在ODI 11g中可以通过Java API直接运行接口模拟并捕获日志,无需依赖Scenario。以下是基于你现有代码的完整实现:
核心思路
- 使用
OdiInterfaceExecutionService执行接口的模拟模式(对应ODI中的静态控制,仅做数据校验不写入目标表) - 通过
OdiSession跟踪执行状态,再通过OdiSessionStepLog提取详细执行日志
完整代码示例
<performing connection> // Allocate an odisinstance of the name final OdiInstance odiInstance = odiInstanceHandle.getOdiInstance(); try { TransactionTemplate tx = new TransactionTemplate(odiInstance.getTransactionManager()); tx.execute(new TransactionCallbackWithoutResult() { protected void doInTransactionWithoutResult(ITransactionStatus pStatus) { // Retrieve the interface you want to simulate IOdiInterfaceFinder ifaceFinder = (IOdiInterfaceFinder) odiInstance.getTransactionalEntityManager().getFinder(OdiInterface.class); OdiInterface iface = ifaceFinder.findByQualifiedName("your_interface_name"); // 获取接口执行服务 OdiInterfaceExecutionService executionService = odiInstance.getService(OdiInterfaceExecutionService.class); // 配置执行参数:指定为模拟模式 OdiInterfaceExecutionParams executionParams = new OdiInterfaceExecutionParams(); executionParams.setExecutionMode(OdiInterfaceExecutionService.ExecutionMode.STATIC_CONTROL); executionParams.setOdiInterface(iface); // 设置执行上下文(可替换为你需要的上下文) executionParams.setContext(odiInstance.getContextManager().getDefaultContext()); // 执行模拟 OdiSession session = executionService.execute(executionParams); // 等待执行完成,定期刷新会话状态 while (session.getSessionStatus() != OdiSession.Status.DONE && session.getSessionStatus() != OdiSession.Status.ERROR) { Thread.sleep(1000); session = (OdiSession) odiInstance.getTransactionalEntityManager().refresh(session); } // 捕获并处理日志 if (session.getSessionStatus() == OdiSession.Status.DONE) { // 查询该会话下的所有步骤日志 IOdiSessionStepLogFinder stepLogFinder = (IOdiSessionStepLogFinder) odiInstance.getTransactionalEntityManager().getFinder(OdiSessionStepLog.class); List<OdiSessionStepLog> stepLogs = stepLogFinder.findBySession(session); // 遍历输出日志内容 for (OdiSessionStepLog stepLog : stepLogs) { System.out.println("步骤名称: " + stepLog.getStepName()); System.out.println("执行状态: " + stepLog.getStatus()); System.out.println("日志详情: " + stepLog.getMessage()); System.out.println("---------------------------"); } } else { // 处理执行失败场景 System.err.println("模拟执行失败,错误信息: " + session.getReturnMessage()); } } }); } catch (Exception e) { e.printStackTrace(); }
关键说明
ExecutionMode.STATIC_CONTROL:ODI 11g中专门用于接口模拟的执行模式,仅完成数据校验逻辑,不会修改目标数据OdiSession:执行接口后返回的会话对象,用于跟踪执行状态、获取执行结果- 日志查询:通过
OdiSessionStepLog可以获取每个执行步骤的详细日志,包括成功信息、警告或错误提示
内容的提问来源于stack exchange,提问作者mai_sicuel
相关产品推荐
相关产品推荐

