Queue 使用webservices对作业进行排队的框架

Queue 使用webservices对作业进行排队的框架,queue,jms,apache-camel,spring-integration,Queue,Jms,Apache Camel,Spring Integration,我正在寻找一个在Java中实现一个web服务(我们称之为a),它接受作业请求,然后将这些请求发送到另一个web服务(第三方服务,我们称之为B)。这里没什么复杂的。从B到A的响应是同步的(返回作业id),然后当作业完成时,B向A发送一条异步消息,通知A作业已完成(到B的作业可能需要X时间)。B一次只能接受20个工作,但是a应该能够接受来自多个客户的尽可能多的工作。所以A需要一个查询系统,只发送B不超过20个工作。当B完成一个作业并通知a时,a可以向B发送另一个作业 我可以用state NEW将进入

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


我可以用state NEW将进入数据库的作业保存到数据库中,然后每5分钟运行一个进程,收集新作业,如果您可以用Camel完美地完成它。对我来说,最简单的方法是:添加一个JMS队列,接受来自的调用并将它们添加到队列(路由1)。添加一个包含20个使用者的JMS侦听器,将任务发送到B(路由2),并将B的响应转发到后端

,因为您的任务非常具体,我不确定在任何框架中是否有现成的解决方案

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

作为“屏障”解决方案,我建议在发送作业时,最好使用一些
AtomicInteger
,如果“屏障”在限制范围内,则将其增量并将值发送到某个组件,该组件将停止消费者

作业完成后,如果“屏障”小于限制值,则减少
AtomicInteger
启动消费者


不确定,如果Camel允许启动/停止端点,但是Spring集成在这里依赖于消息传递端点的生命周期。

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

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

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

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