一
前言
最近帮用户解决了一个奇怪的PO问题
同一个接口,配置WEBSERVICE 发出能通过, 配置成 REST 发出系统报错
InterfaceDetermination did not yield any actual interface
本文主要介绍追踪这个报错并解决的过程
二
问题描述
同一个接口, 配置成WEBSERVICE 调用测试成功,配置成REST调用测试报错
开启详细日志之前. SOAPUI直接返回500错误及报错信息. 消息无法在消息监控其中查看, 但是可以在通道监控器中看到报错信息
Error while sending message to module processor: Sender Channel 'CCO_PMS_QMIS_P10061' (ID: c54145a5d6ab37c88091ad6f693b557c): Catching exception calling messaging system: InterfaceDetermination did not yield any actual interface
开启详细日志后(图一), SOAPUI返回202成功信息(图二)
图一
图二
消息进入消息监控器,看到报错信息
图三
三
问题解决过程
解决PO问题的大致过程
重新激活相关对象: Integrated Configuration / message mapping 等
通过INSPECT跟踪报错,获取详细报错信息
google/bing报错信息
根据报错信息查找NOTES
检查接口的所有配置对象,看看是否存在因为粗心而导致命名不规范的对象.
上述过程排名不分先后
01
查找NOTES
2628224 - Throwing com.sap.aii.adapter.xi.routing.RoutingException: InterfaceDetermination did not yield any actual interface
来自
https://launchpad.support.sap.com/#/notes/0002628224
notes的描述和报错信息很像,但并没有什么实际的用处.
02
监控端口
使用INSPECTOR的方式
详见链接无峰,公众号:ABAP 技巧与实战PO系列之 使用XPI_INSPECTOR跟踪PO报错
判断报错的信息是通道处理时报错,因此尝试通过INSPECTOR监控动态的处理
分析监视的报错信息, (无法获取接口对象),也看不出什么头绪.
03
重建对象
因为报错信息涉及到消息确认,所以初步怀疑是IC(Integrated Configuration)对象的问题.
删除IC,SOAP调用接口报错信息改变, 重新创建IC后, 恢复原来的报错信息.
重建或重新激活对象的目的是更新缓存. 之前碰到过很多因为缓存更新不及时或缓存失效而导致的报错.因此需要尝试一下该方式
04
问题解决
最后重新检查所有对象时发现:
发出的SERVICE INTERFACE 中的MESSAGE TYPE 用错了.
导致REST中的 ELEMENT NAME 和 SI 中的消息MESSAGE TYEP 不一样.
REST通道通过地址
/RESTAdapter/MTO_PMS_QMIS_P10061
查找 ENDPOINT (图四)找到通道, 通过通道中的ELEMENT NAME(图五)找到消息, 通过消息找到SEND SERVICE INTERFACE(SI).
Element name 中定义的消息名没有被SERVICE INTERFACE 使用, 导致系统报错
InterfaceDetermination did not yield any actual interface .
而WEBSERVICE中没有报错的原因很简单: SOAP的调用地址中指定了 SEND SI(图六) ,无需查找. (通过参数interface )指定了SI 对象
图四
图五
图六
四
总结
PO配置时会涉及到很多对象, 因此对象命名必须规范(最好每种对象的名称字符长度都能固定),不符合规范的命名对象可以很方便的被发现.
推荐使用WEBSERVICE方式定义接口, 因为相比REST接口, WEBSERVICE 定义的内容更少,减少了出错的概率.并且生成WSDL定义文件, 便于其它系统引入使用.
THE
END