WS2ESB:在序列调用之间存储状态

WS2ESB: Store state between sequence invocations

我想知道在 WSO2ESB 中存储序列调用之间状态的正确方法。换句话说,如果我有一个调用序列 S 的计划任务,在迭代 0 结束时我想存储一些字符串变量(我们称之为 ID),然后我想在开始时(或在迭代 1 的中间),依此类推。

更准确地说,我想从现有服务(准确地说是 Twilio)中获取新 SMS 消息的列表。但是,Twilio 只允许我收到选定日期的消息,即我无法说只给我新消息(自从我上次检查/比某些消息 ID 更新)。因此,我想创建一个计划任务,它将查询 Twilio 并通过 REST 调用向我的服务传递仅新消息。为此,我的序列需要查询 Twilio,然后遍历返回的消息列表,并丢弃先前调用中已报告的消息。现在,为此,我需要在不同的 task/sequence 调用之间存储一些状态,即在序列末尾,我需要存储当前批次中最新消息的 ID。然后可以在后续调用中使用此 ID 来确定哪些消息已在先前调用中报告。

我可以使用 DBLookup 和 DB Report 调解器,但这似乎有点矫枉过正(使用数据库存储单个字符串)并且对性能不太友好。另一方面,据我所知 Class 调解器被实例化为单例,因此我可以创建一个自定义 Class 调解器来管理此状态并过滤要发送到我的消息列表服务。我很确定这会奏效,但我想知道这是否是可行的方法,或者可能有一个我错过的更优雅的解决方案。

这里我们可以想到3个选项。

  1. 按照您的建议使用 DBLookup/Report
  2. 使用 Carbon 注册表存储值(这再次在后端使用数据库)
  3. 使用自定义中介来保存状态和read/write它的from/to属性

在这三个中,显然第三个会提供最好的性能,因为所有内容都将在内存中。实现起来也很简单,以前我也做过类似的事情 wrote a blog post here

但另一方面,如果您的用例担心,前两个选项即使在服务器崩溃时也可以保持状态。

从 esb 490 开始,您可以使用 属性 调解器从注册表中保存和读取属性。

https://docs.wso2.com/display/ESB490/Property+Mediator