使用Apache Camel 3.11.1 Milo调用OPCUA方法无法获取outputArguments求助
Camel Milo调用OPC UA方法无法获取输出参数解决方案
问题根因
你使用的Apache Camel 3.11.1版本中,camel-milo组件的方法调用逻辑存在设计疏漏:底层Milo SDK已经正确接收到OPC UA服务端返回的输出参数,但组件层没有将输出参数写入请求响应的Body中,仅将输出参数存入了消息Header,因此直接调用requestBody获取返回值会得到null。
解决方案
方案1:低版本兼容方案(无需升级Camel版本)
直接从消息Header中读取输出参数,老版本camel-milo会将方法返回的输出参数以Variant[]类型存入名为CamelMiloMethodOutputArguments的Header中,修改后代码如下:
public void test() throws Exception { System.out.println("START CAMEL-MILO TEST"); SpringCamelContext camelContext = applicationContext.getBean(SpringCamelContext.class); if (camelContext != null) { ProducerTemplate producerTemplate = camelContext.createProducerTemplate(); if (producerTemplate != null) { String endpointUri = "milo-client:opc.tcp://milo.digitalpetri.com:62541/milo?node=RAW(ns=2;s=Methods)&method=RAW(ns=2;s=Methods/sqrt(x))&defaultAwaitWrites=true"; Double value = 25.0; // 发送请求获取完整Exchange对象 Exchange exchange = producerTemplate.request(endpointUri, ex -> ex.getIn().setBody(new Variant(value))); // 从Header中读取输出参数 Variant[] outputArgs = exchange.getIn().getHeader("CamelMiloMethodOutputArguments", Variant[].class); if (outputArgs != null && outputArgs.length > 0) { Double outputArguments = outputArgs[0].getValue(); System.out.println("RESULT: " + outputArguments); } else { System.out.println("ERROR: outputArguments is null"); } } else { System.out.println("ERROR: ProducerTemplate unavailable"); } } else { System.out.println("ERROR: SpringCamelContext unavailable"); } }
方案2:版本升级方案
将Apache Camel版本升级到3.14.0及以上,该版本已经修复了camel-milo方法调用返回值的透出问题,方法调用成功后:
- 单输出参数的方法会直接将参数值写入响应Body,你原有代码不需要修改即可正常获取返回值
- 多输出参数的方法会将所有参数封装为
List写入响应Body
补充注意事项
如果调用的方法存在多个输入参数,不要直接传入单个Variant对象,需要传入Variant[]数组,按顺序对应方法的输入参数列表。
内容的提问来源于stack exchange,提问作者marcello cappelli
相关产品推荐
相关产品推荐

