【问题标题】:framework for queuing jobs with webservices使用 Web 服务对作业进行排队的框架
【发布时间】:2014-03-03 03:46:20
【问题描述】:

我正在寻找一个在 Java 中实现 Web 服务(我们称之为 A),它接受作业请求,然后将这些请求发送到另一个 Web 服务(第三方服务,我们称之为 B)。这里没有什么复杂的。从 B 到 A 的响应是同步的(返回作业 ID),然后当作业完成时,B 向 A 发送一条异步消息,通知它作业已完成(到 B 的作业可能需要 X 时间)。 B 一次只能接受 20 个工作,但是 A 应该能够接受来自多个客户的尽可能多的工作。因此,A 需要一个排队系统来只向 B 发送不超过 20 个工作。当 B 完成一项工作并通知 A 时,A 可以向 B 发送另一个工作。

我可以将进入 A 的作业保存在状态为 NEW 的数据库中,然后每 5 分钟运行一个进程,收集新作业,如果 B 处理的作业

我可以使用 JMS 或像 Camel 这样的路由引擎来做到这一点,或者是否有人可以提供另一个框架来提供帮助。我找不到任何维护队列并且只发送最多 X 个作业的东西。 A 队列可能有数百个作业等待处理,但只有在 B 完成另一个作业时才会向 B 发送另一个作业。

【问题讨论】:

    标签: queue jms apache-camel spring-integration


    【解决方案1】:

    除非您需要持久化尚未提交处理的作业,否则我认为您只需要两个blocking queues

    1. 传入作业队列(“大”容量)
    2. 等待完成队列的作业(最大容量为 20)

    您的网络线程用新作业填充“传入作业队列”。单个工作线程一次从该队列中获取作业。然后尝试将令牌元素放入“作业待定完成队列”。如果该队列中的条目少于 20 个,它将立即成功并随后将作业提交给您的服务 B。

    从 B 接收异步回调的线程随后将从“作业待处理完成队列”中删除令牌元素。 如果队列中已经有 20 个条目,则尝试提交新作业的线程将被阻塞,直到回调线程删除令牌元素。

    【讨论】:

    • 可能需要持久性才能查看已处理的作业历史记录,如果服务器关闭,它需要恢复以前排队的任何作业,这就是我认为 JMS 将是最佳选择的原因。我可能需要能够从队列中删除作业(取消未处理的作业)。我会试试你的建议
    【解决方案2】:

    就您的任务如此具体而言,我不确定在任何框架中是否存在“开箱即用”的解决方案。

    你是对的:队列是给你的。我不确定在这种情况下并发消费者是否可以,因为您需要有“障碍”。

    作为“障碍”解决方案,我建议有一些 AtomicInteger,当您发送作业时,增加它并将值发送到某个组件,该组件停止您的消费者,如果“障碍”是限时。

    当工作完成时,你减少 AtomicInteger启动消费者,如果“障碍”小于限制。

    不确定,如果 Camel 允许启动/停止端点,但 Spring Integration 在这里依赖于消息传递端点的Lifecycle

    【讨论】:

      【解决方案3】:

      你可以用骆驼完美地做到这一点。对我来说最简单的方法是:添加一个 JMS 队列,接受来自 A 的调用并将它们添加到队列中(路由 1)。添加一个有 20 个消费者的 JMS 侦听器,将任务发送到 B(路由 2)并将 B 的响应转发给 A

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-09
        • 2012-06-03
        • 2012-06-16
        • 1970-01-01
        • 1970-01-01
        • 2022-01-27
        • 1970-01-01
        相关资源
        最近更新 更多