我们有一个要求,我们将有3个不同的队列中的消息。
我需要编写代码,使来自队列A的消息具有比队列B更高的优先级,然后是队列C。
但是,我不能让任何队列等待太长时间,所以每个线程都应该有一些专用的接收器。
你能为我推荐任何现有的框架来做这件事吗?
一种可能的解决方案是增加队列A的专用接收器的数量,如果队列A中没有消息,则这些接收器也会查看B和C。
队列B的专用接收器的数量略少,如果B中没有消息,这些接收器也会查看A和C。
队列C的很少的专用接收器,如果C中没有消息,它们也会查看A和B。
有没有可能在JMS消费者/接收者级别实现这个解决方案,或者我需要为它编写自定义代码?
发布于 2016-02-03 14:33:19
JMS无法控制消息处理的优先级。我建议将每个消息转换为任务(在消息到达时立即转换),并将任务提交给优先执行程序。请参阅Java Executors: how can I set task priority?
发布于 2016-02-03 23:52:31
如果您控制队列(如中所示,编写代码可以具有您提供的队列引用),则可以放置一个PriorityBlockingQueue,并使用一个对A、B、C进行排序的比较器。
然而,您不能全速旋转,必须等待,所以我认为您应该在A队列上使用(超时),只要您的最小响应时间允许服务于B和C队列(如果A始终具有优先级,这将是很大的)。当然,只有在B和C队列为空的情况下才调用A.take() (但如果不知道队列实现,就不要依赖.size();只需信任您刚刚尝试的最后一个poll()结果)。
当然,您可以将3个线程简单地放入一个由您控制的优先级队列中。但这有点言过其实了。
发布于 2016-02-04 08:33:05
在JMS消息上使用JMSPriority属性,将消息转储到同一队列中,并让提供程序进行优先级排序工作。
https://stackoverflow.com/questions/35168486
复制相似问题