WebLogic主题是否保证通过队列进行交付?

时间:2017-06-16 10:03:22

标签: java-ee queue jms weblogic12c jms-topic

我们遇到在源和目标之间丢失的消息,这些消息通过队列传递。源应用程序和目标应用程序都部署在两个不同的WebLogic群集实例中。

我们也为消息持久性启用了文件存储,但我们仍然注意到某些消息未从目标队列中消耗掉。

建议的解决方案之一是创建一个主题并通过目标应用程序监听单个队列,假设有保证的消息传递。我不相信,因为我仍然看到丢失消息的可能性,除非它保证如果我们使用主题,配置的消费者至少会消息消息。

感谢您对启用有保证的邮件传递的想法。

2 个答案:

答案 0 :(得分:1)

首先要理解的是,“保证交付”既不是在JMS队列和主题之间进行选择的标准,也不是队列和主题之间的差异。由于负载平衡的原因,队列和主题之间存在许多其他标准和区别,就像您选择队列超过主题一样,发送到队列的消息将发送给队列的消费者,而发送给主题的消息将被发送对于该主题的所有消费者(除了分布式分区主题的情况),因此在队列的情况下,消息在多个队列消费者之间进行负载平衡。

现在,我在这里做一个基本假设,你明白你假设你有一个队列Q1,它有3个队列消费者 - QC1,QC2和QC3,现在当一条消息被发送到Q1然后这个消息将传递到对于消费者QC1或QC2或QC3,它不会被传递给超过1个队列消费者。所以,考虑到这一点,我再次假设,当你说你的消息丢失时,你并不是说QC1没有收到消息(因为它可能已按预期交付给QC2或QC3)。如果我的假设是错误的,那么这意味着你对JMS队列的理解是不正确的,因此你期望得到的行为。

现在,有了核心概念,如果现在,您希望获得的行为是正确的,那么使用JMS主题是正确的解决方案,因为在JMS主题的情况下,将向所有主题订阅者传递消息。因此,假设您有一个JMS主题T1,它有3个主题订阅者 - TS1,TS2和TS3,当消息发送到T1时,此消息将被传递给所有3个主题订阅者。

现在,如果你看到你的消息丢失了,那么你必须检查是否只发生了一些消息或所有消息,如果它包含所有消息,那么很可能你的代码不正确消费/订阅,如果只发生一些消息,那么你就会想到它是否会出现网络问题。

<小时/> 更新:根据OP的输入,显然OP的JMS设置工作正常并且迁移到主题无济于事,现在没有这样的解决方案而且它是关于调试问题,下面是我的想法:

  • 您必须从n / w角度调试消息是否在JMS生产者与JMS提供者或JMS提供者和JMS使用者之间丢失。我猜它在JMS生产者和JMS提供者之间迷失了,因为如果它在JMS提供者和JMS使用者之间丢失,那么JMS提供者将永远不会得到确认,因此会在队列中有消息。您可以检查这些消息是否仍在JMS提供程序队列中,因为您可以使用“队列浏览器”,如果消息不在队列中,则意味着它在JMS生成器和JMS提供程序之间丢失。
  • 这些消息有什么不同,可能是一些JMS标题或其他东西。

答案 1 :(得分:0)

我以前见过这个,但说实话:它绝不是JMS主题/队列设置的错误:假设系统连续运行(没有崩溃)并且JMS资源也运行正常(文件存储或数据库未满)如果一个消息处理程序正在选择它不处理的消息(忽略它们),则可以观察到此行为:

不确定您的消息处理程序是什么样的,但是如果它的概念是&#34;标识&#34;在switch-case中按类型传递消息或按类型委派它们,可能是它选择了它不知道的消息。这可能有两个基本原因:

1)你忘记了(一个!)处理程序,以便处理丢失的消息类型。主要检查一个相当无辜的处理程序: - )。

2)您的发件人/收件人代码不匹配,因此&#34; instanceof&#34;由于不一致而失败(我已经多次看到):检查你的代码是否在两端使用完全相同的类型。