我有一个全天都加载了高优先级JMS消息的队列,我想快速将它们推出门外。队列也会定期加载大批量较低优先级的消息。我在忙碌的日子看到的问题是,队列前面总是有足够的高优先级消息,在该卷下降之前,没有一个优先级较低的消息被选中。通常他们会坐在队列中,直到他们半夜。该应用程序分布在许多服务器上,但CPU甚至没有呼吸困难,JMS似乎是最重要的一点。
我的预感是实现某种老化算法,该算法可以提高队列中已有很长时间的消息的优先级,但当然,这就是中间件应该为我做的事情。我无法想象JMS提供程序(IBM WebsphereMQ)或应用程序服务器(TIBCO BusinessWorks)没有某种工具来应对这种情况。所以在我写一些代码之前,我想我会问,有没有办法让这些技术帮我解决这个问题?
正在读取队列的BusinessWorks活动是JMS SOAP事件源,但我可以将其转换为JMS队列接收器活动或其他任何内容。
欢迎所有关于如何解决这个问题的想法:-) TIA
答案 0 :(得分:1)
这就像把一只手绑在背后然后抱怨你不能正常游泳。 D'哦!首先,谁是明智的想法是混合消息。仅仅因为你可以做某事并不意味着你应该做。
该应用程序分布在多个服务器上,但CPU不是 即使是呼吸困难,JMS似乎也是最重要的一点。
那么,解决方案很简单。将高优先级消息放入队列“A”(现有队列),将低优先级消息放入新队列“B”。接下来,启动JMS应用程序的另一个实例以读取队列“B”之外的消息。
此外,JMS可能不是阻塞点。在JMS层获取花费很长时间的消息(即后端工作)之后,应用程序正在对消息数据进行操作。
最后,针对现有队列运行了多少个JMS应用程序实例?如果你只运行1个实例,为什么?如果您有大量CPU容量,那么为什么不运行10个JMS应用程序实例。做一些真正的并行处理消息。
答案 1 :(得分:1)
如果你真的想让你的邮件混合在同一个队列中并且首先处理高优先级的邮件,但是你的邮件量是这样的,以至于你有时无法在半夜之前完成所有的邮件,那么你根本没有足够的处理应用程序。 MQ是一个并行处理系统,它被设计为允许许多应用程序一次放入或从队列中获取。通过同时运行更多的获取应用程序来利用这一点。他们将更快地处理您的高优先级消息,然后返回处理优先级较低的消息。
答案 2 :(得分:0)
从您的描述中可以清楚地看到您希望首先处理高优先级消息。在这种情况下,较低优先级的消息必须等待。
如果消息长时间排队,MQ将不会增加消息的优先级。怎么会知道它必须改变消息的属性:)?您需要开发一个应用程序来实现这一目标。
我认为基于优先级隔离消息,例如,高优先级消息被放到一个队列中,而低优先级消息到另一个队列可能是你可以看到的一个选项。
第二个选项是查看将传送顺序(MSGDLVSQ)更改为FIFO。这使得消息按照它们到达队列的顺序传递给消费者。但请注意,这将忽略消息优先级,这意味着如果优先级较低的消息后跟较高优先级的消息,则优先级较高的消息将等待,直到发送优先级较低的消息。