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

时间:2016-05-06 14:25:30

标签: wso2 wso2esb esb

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

更确切地说,我希望从现有服务中获得一个新的SMS消息列表,确切地说是Twilio。但是,Twilio只允许我在选定日期收到消息,即我没有办法说只给我新消息(因为我上次检查/比某些消息ID更新)。因此,我想创建一个计划任务,该任务将查询Twilio并通过REST调用将仅新消息传递给我的服务。为了做到这一点,我的序列需要查询Twilio,然后浏览返回的消息列表,并丢弃在上一次调用中已经报告的消息。现在,要做到这一点,我需要在不同的任务/序列调用之间存储一些状态,即在序列的最后我需要在当前批处理中存储最新消息的ID。然后,可以在后续调用中使用此ID,以确定在上一次调用中已报告了哪些消息。

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

2 个答案:

答案 0 :(得分:1)

我们可以在这里考虑3个选项。

  1. 正如您所建议的那样使用DBLookup / Report
  2. 使用Carbon注册表存储值(这会再次使用后端的DB)
  3. 使用自定义中介来保存状态并从/向属性读取/写入
  4. 在这三个中,显然第三个将提供最佳性能,因为一切都将在内存中。它实现起来也很简单,有时我做了类似的事情wrote a blog post here

    但另一方面,前两个选项可以保持状态,即使服务器崩溃,如果它是您的用例的关注。

答案 1 :(得分:0)

从esb 490开始,您可以使用属性中介来持久化并从注册表中读取属性。

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