通过删除 BizTalk Orchestration 中消耗的消息来释放内存?

Release memory by removing consumed messages in BizTalk Orchestration?

我构建了一个带有循环的编排以从 REST Web 服务检索分页数据。根据页面大小和偏移量,我可以为数据的“下一页”调用该服务。然后我对其进行分批处理,将其映射为内部格式并进一步处理。处理完一页后,我从 REST Web 服务请求下一页。

事实证明,主机运行编排和发送端口导致内存在处理所有数据的过程中不断增长,最终达到节流模式。

为什么一页循环结束后内存没有释放?是存储在构建内存的编排中的“消费”消息吗?是否可以从这些“消耗的”消息中清除编排,以释放使用的内存? (编排或发送端口上没有活动的消息跟踪。)

是的,你需要做的是有范围,并且消息在范围内初始化(下面的绿色突出显示)而不是顶层(黄色),这意味着它们也将被处理掉在范围的末尾。注意:这意味着这些消息不能在范围之外使用。

但是,如果您只是在循环中重复使用相同的消息,那么我不认为它会增加内存使用量。所以可能还有其他事情正在发生。我怀疑您必须将每个页面都添加到一条消息中,这就是增长的原因

显然,没有办法禁止 BizTalk Orchestrations 在 Orchestration 中建立消息列表,包括 used/processed/consumed 消息。把东西放在范围内并不能禁止这种行为。

因此,对于长时间的 运行 编排,可能会累积大量消息。特别是对于单例 Orchestrations,处理这个问题的一般解决方案是确保 Orchestration 偶尔关闭一次(例如,空闲时)。

我的解决方案是将 Orchestration 一分为二,让初始 Orchestration 使用 Start Orchestration 启动第二个 Orchestration,后者依次递归调用第二个 Orchestration,依此类推上,直到收到最后一页并且最后一个编排结束。