Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 管理JMS消息到多个服务器的传递_Java_Spring_Jms_Tibco_Tibco Ems - Fatal编程技术网

Java 管理JMS消息到多个服务器的传递

Java 管理JMS消息到多个服务器的传递,java,spring,jms,tibco,tibco-ems,Java,Spring,Jms,Tibco,Tibco Ems,我们的应用程序在Tibco中使用Spring引导和JMS消息。我们有两台生产服务器同时运行和处理消息。服务器正在侦听同一个队列。每台服务器有10个并发侦听器。我不希望两台服务器同时处理同一条消息。没有什么可以阻止队列中出现重复消息,就像队列中可以有消息A的两个副本一样。如果队列中的消息是:A、A、B、C、D,那么如果第一个A被传递到server1,第二个A被传递到server2,并且两个服务器同时处理A,那么它们就有可能创建重复的实体。我想找到一种方法,将所有a消息只发送到一台服务器。我不能使用

我们的应用程序在Tibco中使用Spring引导和JMS消息。我们有两台生产服务器同时运行和处理消息。服务器正在侦听同一个队列。每台服务器有10个并发侦听器。我不希望两台服务器同时处理同一条消息。没有什么可以阻止队列中出现重复消息,就像队列中可以有消息A的两个副本一样。如果队列中的消息是:A、A、B、C、D,那么如果第一个A被传递到server1,第二个A被传递到server2,并且两个服务器同时处理A,那么它们就有可能创建重复的实体。我想找到一种方法,将所有a消息只发送到一台服务器。我不能使用消息选择器b/c我们在两台服务器上运行相同的代码库。这就是我正在考虑的:

根据消息,在标题中设置属性。消息传递到process()方法后,根据处理消息的服务器,可以放弃、返回消息,也可以处理消息并确认消息。这个解决方案的问题是,因为我们需要动态地找出哪个服务器正在处理消息,所以服务器名称需要硬编码,这意味着如果服务器移动,代码就会中断

另一个可能有效的解决方案是目标字段

目标,如ConnectionFactorys,是JMS管理的对象 可以在JNDI中存储和检索的。配置Spring时 应用程序上下文可以使用JNDI工厂类 jndObjectFactoryBean/用于执行依赖关系 注入对象对JMS目标的引用

这是我以前从未做过的事。无论如何,是否要配置它拾取消息路由到的正确服务器的目的地?也就是说,如果message1应该被传递到server1,那么它甚至不会被传递到server2,而是一直留在队列中,直到server1使用它

还有什么其他方法可以实现这一点

编辑:


我仍然不知道将某些消息只发送到一台服务器进行处理的最佳方式是什么,但是,我接受了使用数据库作为验证的响应,B/C,这是我们在处理数据时避免创建重复实体的原因。

< P>我认为使用JMS目的地的想法是非启动的,因为JMS规范中没有任何东西可以保证目的地和代理之间的任何类型的链接。目标只是特定于提供程序的队列/主题名称的封装

这里的底线是,您要么首先需要防止重复消息,要么需要有某种方法来协调消费者在将重复消息从队列中拉出后处理重复消息。我认为您可以使用外部系统(如数据库)来执行这两项操作,例如:

  • 生成消息时,请检查数据库是否有消息已发送的指示。如果未找到任何指示,则将记录写入数据库(需要使用主键以防止重复)并发送消息。否则不要发送消息
  • 在使用消息时,请检查数据库是否指示消息正在(或已)使用。如果未找到任何指示,则将记录写入数据库(需要使用主键以防止重复)并处理消息。否则,只需确认消息而不进行处理

我建议使用“后数据库同步”的替代方案

保持服务器和侦听器不变,并广播有关某个主题的所有已处理消息。对于刚启动的服务器,您可以使用“持久订户”来避免丢失任何消息

<>如果你为消息A、B、C等广播每个开始和结束,并考虑添加一个小停顿(毫里),你应该避免冲突。这当然是主要的风险

我不清楚您是否应该在消息处理的开始或结束时验证重复处理。。。这取决于你的需要


如果整个想法都不被接受,DB验证可能是唯一的选择,但正如上面的评论所述,我担心扩展。

听起来像是一项主题工作,而不是点对点队列。我不太理解这里的用例。是否涉及2个消息代理,或者只是2个客户端,其中多个并发使用者都连接到同一队列?如果是后者,我不明白为什么多个客户端同时使用同一条消息会出现问题。队列的全部要点是只有一个消费者获得消息。请澄清。不能按主题进行。一旦接收者收到消息,就需要确认消息。此外,发送方和接收方不一定同时处于活动状态。需要两台服务器来进行负载平衡。后者:两台具有多个并发使用者的客户端都连接到同一队列。没有什么可以阻止队列中出现重复消息,就像队列中可以有消息A的两个副本一样。如果队列中的消息是:A、A、B、C、D,那么如果第一个A被传递到server1,第二个A被传递到server2,并且两个服务器同时处理A,那么它们就有可能创建重复的实体。我想找到一种只向一台服务器发送所有a消息的方法。这正是我们对DB中所有表所做的,问题是PK不适用的表…就我个人所知,关于目的地,因为JmsTemplate有JNDIDestationResolver,它可以作为JNDI中包含的目的地的服务定位器,我们不能用这种方式查找应用程序服务器?我看不出
JndiDestinationResolver
对您有什么帮助,因为它只会给您一个javax.jms.Destination对象,正如前面提到的,它不绑定到代理。我不明白你的意思