Java Durable Functions编排报null响应错误原因及解决方法
按照Azure Functions Java Durable Functions快速入门流程操作时,执行名为HelloCities的编排器函数过程中抛出如下异常:
2022-06-23T06:30:19.172Z] System.Private.CoreLib: Exception while executing function: Functions.HelloCities. Microsoft.Azure.WebJobs.Extensions.DurableTask: The function invocation resulted in a null response. This means that either the orchestrator function was implemented incorrectly, the Durable Task language SDK was implemented incorrectly, or that the destination language worker is not sending the function result back to the host.
当前本地使用的Azure Functions Core Tools版本信息如下:
Azure Functions Core Tools Core Tools Version: 3.0.3734 Commit hash: 61192bb28820be76916f85209916152801483456 (64-bit) Function Runtime Version: 3.1.4.0
这个报错是Durable Task扩展抛出的通用返回空错误,核心逻辑是:Functions主机在等待编排器函数执行完成、回传执行结果时,最终拿到的响应值为null,触发异常。报错提示中已经明确三类根因方向:
- 编排器函数本身的代码实现不符合Durable Functions的编写规范,没有返回有效结果
- 当前使用的Java语言Durable Task SDK存在已知实现缺陷,导致结果序列化/回传失败
- Java语言工作进程(worker)和Functions主机之间的通信异常,结果没有正常送达主机
- 首先检查编排器函数的代码逻辑:确认标注
@DurableOrchestrationTrigger的编排器方法返回值类型不是void,所有代码执行分支都有明确的非null返回值。HelloCities示例要求编排器最终返回三个城市Activity调用结果的聚合内容,若漏写return语句、或异常分支没有返回值,就会触发该错误。 - 核对依赖版本与运行时的匹配性:当前使用的是Azure Functions 3.x版本运行时,需确认Maven配置中引入的
azure-functions-java-library使用2.x稳定版本、durabletask-azure-functions使用1.x稳定版本,不要引入适配Functions 4.x运行时的高版本依赖,版本不兼容会导致Java worker序列化返回结果失败,给主机回传空值。 - 检查编排器内的Activity调用写法:编排器中调用Activity函数必须通过
context.callActivity()系列方法触发,不能直接通过Java原生方法调用的方式执行Activity逻辑;同时编排器内不能编写阻塞IO、获取系统当前时间、生成随机数这类非确定性逻辑,这类写法会导致编排器重放执行异常,最终返回空结果。 - 排查本地运行环境异常:如果代码和依赖都没有问题,可执行
func host start --verbose开启详细日志,先确认Java worker进程正常启动、没有类加载错误、没有端口占用冲突。如果存在类找不到、方法不存在这类类加载报错,先执行mvn clean package重新清理构建项目,确保输出的函数包完整无损坏。
内容的提问来源于stack exchange,提问作者Chris Gillum

