【问题标题】:WS2ESB: Store state between sequence invocationsWS2ESB:在序列调用之间存储状态
【发布时间】:2016-06-16 20:48:35
【问题描述】:

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

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

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

【问题讨论】:

    标签: wso2 wso2esb esb


    【解决方案1】:

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

    1. 按照您的建议使用 DBLookup/Report
    2. 使用 Carbon 注册表存储值(这再次在后端使用 DB)
    3. 使用自定义中介来保存状态并从/向属性读取/写入它

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

    但另一方面,前两个选项即使在服务器崩溃时也可以保持状态,如果这对您的用例来说是一个问题。

    【讨论】:

    • 谢谢一百万。虽然我想我应该确保状态的线程安全。我想如果状态只是一个字符串,它可以正常工作,但一般来说,如果状态更复杂,一些同步可能是有序的。或者框架是否保证中介方法不会被多个线程并行执行?
    【解决方案2】:

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

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

    【讨论】:

    • 我查看了此文档,但不知道如何在注册表中保留属性...甚至在该页面中找不到“注册表”一词。您可以在答案中添加示例吗?
    • 这里相同,在该文档中找不到有关注册表的信息。据我所知,属性调解器仅适用于消息上下文,因此它设置的任何属性只能在响应发送回客户端之前有效(或者甚至更少,具体取决于所选范围)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    相关资源
    最近更新 更多