【问题标题】:how do i prioritize code to look at 3 different queue我如何优先考虑代码以查看 3 个不同的队列
【发布时间】:2016-05-12 03:28:06
【问题描述】:

我们有一个要求,我们将有消息进入 3 个不同的队列。

我需要编写代码,使来自队列 A 的消息的优先级高于队列 B,然后是队列 C。

但是我不能让任何队列等待太久,所以每个线程应该有一些专用的接收器。

您能否建议任何可以为我做到这一点的现有框架?

一个可能的解决方案是队列 A 的专用接收器数量更多,如果 A 中没有消息,它们也会查看 B 和 C。

队列 B 的专用接收器数量略少,如果 B 中没有消息,它们也会查看 A 和 C。

如果 C 中没有消息,队列 C 的极少数专用接收器也会查看 A 和 B。

是否可以在 JMS 消费者\接收者级别实施此解决方案,或者我是否需要为其编写自定义代码?

【问题讨论】:

    标签: multithreading jms spring-integration spring-jms


    【解决方案1】:

    JMS 无法控制消息处理的优先级。我建议转换任务中的每条消息(在它到达时立即)并将任务提交给优先的执行器。见Java Executors: how can I set task priority?

    【讨论】:

      【解决方案2】:

      如果您控制队列(例如,编写代码可以有您提供的队列引用),那么您将放置一个 PriorityBlockingQueue,并带有一个对 A、B、C 进行排序的比较器。

      如果您无法避免 3 个队列(因为您只能获取要读取的队列引用),那么很遗憾您必须轮询每个队列,而不是 take()。但是,您不能全速旋转并且必须等待,因此我认为您应该在 A 队列上占用(超时),只要您的最小响应时间允许为 B 和 C 队列提供服务(如果 A总是有优先权)。当然,如果 B 和 C 队列为空,则仅调用 A.take() (但如果您不知道队列实现,请不要依赖 .size() ;只需相信您刚刚尝试过的最后一个 poll() 结果)。

      当然,您可以旋转 3 个线程来简单地 take() 并将其放入您控制的单个优先级队列中。但这有点矫枉过正。

      【讨论】:

      • 因此,如果我理解正确,您的建议是我不断将来自 3 个不同队列的传入消息添加到一个公共 PriorityBlockingQueue 中,该队列使用比较器进行优先级排序并处理我的消息。我几乎没有什么顾虑 1)。由于采取和添加操作之间的所有同步,这不会减慢处理速度吗? 2) 如果每秒有数百条消息被添加到 PriorityBlockingQueue,我是否不会遇到 OutOFMemory 问题?
      • 1) 不明显。 2)阻塞队列的大小是可以设置的。这就是阻塞队列的意义所在。当队列已满时, q.put() 将通过等待 notfull 条件而阻塞,并且 q.offer() 将无法入队。在这里,您想使用 offer() 方法,以便您的 jsp 可以立即检测到它已满。计划这个大小是你的开发工作。一百个整数不算什么,一百个千兆像素图像是另一回事......
      【解决方案3】:

      在 JMS 消息上使用 JMSPriority 属性,将消息转储到同一队列中,并让提供者完成优先级的工作。

      【讨论】:

      • 谢谢,但是这种方法对于生产环境来说太慢了。队列管理器需要使用队列中已经存在的消息评估每条消息来确定优先级。其次,较低优先级的消息可能永远不会得到处理
      猜你喜欢
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      相关资源
      最近更新 更多