自定义AssemblingActivity状态始终未变更,请求技术支持
我在操作过程中需要执行自定义Activity,于是创建了AssemblingCell和对应的AssemblingActivity。在UI中创建Cell实例并启动仅包含该Activity的工作计划后,Activity已创建但始终处于initial状态——尽管Cell已发送ReadyToWork,且通过<applicationUrl>/api/moryx/processes/running端点确认Cell与Activity已匹配,但状态仍未变更。
预期行为:匹配的资源发送ReadyToWork后,Activity状态应变为Ready,随后进入Running,同时Cell应收到ActivityStarted事件以开始工作。
自定义AssemblingCell代码
[ResourceRegistration] public class AssemblingCell : Cell { ... public override IEnumerable<Session> ControlSystemAttached() { yield return Session.StartSession(ActivityClassification.Production, ReadyToWorkType.Push); } public override void SequenceCompleted(SequenceCompleted completed) { var rtw = Session.StartSession(ActivityClassification.Production, ReadyToWorkType.Push); PublishReadyToWork(rtw); } ... }
自定义AssemblingActivity代码
[ActivityResults(typeof(DefaultActivityResult))] public class AssemblingActivity : Activity<AssemblingParameters> { public override ProcessRequirement ProcessRequirement => ProcessRequirement.Required; public override ICapabilities RequiredCapabilities => new AssemblingCapabilities(); protected override ActivityResult CreateResult(long resultNumber) { return ActivityResult.Create((DefaultActivityResult)resultNumber); } protected override ActivityResult CreateFailureResult() { return ActivityResult.Create(DefaultActivityResult.Failed); } }
可能的原因及解决步骤
检查Capabilities匹配逻辑
确保AssemblingCapabilities与AssemblingCell实际提供的Capabilities完全匹配:- 验证
AssemblingCell是否在ResourceRegistration特性中正确声明了AssemblingCapabilities - 检查
AssemblingCapabilities的Equals和GetHashCode实现是否正确,这是框架判断Capabilities匹配的核心依据
- 验证
明确Activity的分类匹配
你创建Session时使用了ActivityClassification.Production,需要给AssemblingActivity添加对应分类特性:[ActivityClassification(ActivityClassification.Production)] [ActivityResults(typeof(DefaultActivityResult))] public class AssemblingActivity : Activity<AssemblingParameters> { // ... 现有代码 }若未明确指定分类,框架默认分类可能与Session的分类不匹配,导致状态无法流转。
修正ReadyToWork的发布逻辑
- 在
ControlSystemAttached中返回的Session会由框架自动发布ReadyToWork,无需手动调用PublishReadyToWork - 在
SequenceCompleted中创建Session后,需确保Cell当前处于Available状态,否则发布的ReadyToWork会被框架忽略
- 在
验证Activity参数完整性
检查AssemblingParameters是否被正确初始化并传入Activity:- 若Activity依赖的关键参数缺失或未赋值,会卡在
initial状态无法推进 - 可通过
<applicationUrl>/api/moryx/processes/running端点查看Activity的参数详情,确认是否完整
- 若Activity依赖的关键参数缺失或未赋值,会卡在
查看框架日志定位问题
检查Moryx框架中Processes模块和Resources模块的日志,寻找以下类型的错误信息:- Capabilities匹配失败的日志
- Session无效或过期的提示
- Activity状态流转失败的堆栈信息
这些日志会直接指向问题的底层根源。
内容的提问来源于stack exchange,提问作者Mari

