1

我在服务器启动时加载了以下静态路由。它侦听端口上的 UDP 消息并将这些消息推送到下面路由中定义的 seda 队列。

from("mina:udp://hostipaddress:9998?sync=false").wireTap("seda:sometag?size=100&blockWhenFull=true&multipleConsumers=true");

现在我可以有多个想要接收/订阅这些消息的客户端。他们还希望动态选择他们需要的提要。每个客户端向服务器发送订阅请求 (REST)(使用 Spring-MVC、Jetty、Camel 实现)。一旦服务器收到请求,我就会创建一个新的 Camel 路由,如下所示:

        from("seda:sometag?multipleConsumers=true")
                .routeId(RouteIdCreator.createRouteId(toIP, toPort, "sometag"))
                .filter()
                .xpath(this.xpathFilter).unmarshal().jaxb("sometag").marshal()
                .json().wireTap("mina:udp://client_ip_address:20001?sync=false"); 

部署此路由后,它将开始向 client_ip_address: 20001 发送 UDP 消息(如上面的动态路由中指定的那样。)

客户端可以向服务器发送不同的过滤器。

如果此服务器接收到新过滤器,它会执行以下操作 1. 检查是否有路由正在运行(基于客户端 ip 和端口) 2. 如果有路由正在运行,它会停止该路由并使用旧过滤器删除该路由 3.然后它重新创建一个新路由,该路由与 xpathfilter 中的最后一个路由不同。

我的问题是第 2 步需要很长时间(停止并重新启动)

有没有办法解决这个问题?基本上我想在不停止/迁移路线的情况下更改路线中的 XPath 表达式。

PS:我也在Camel 官方邮件列表上发布了这个。

4

1 回答 1

2

当您收到新订阅时,您可以尝试将 xpath 过滤器存储在数据库中(基本上是一个带有 ip 和关联过滤器的简单表)。然后你可以从路由中的数据库中读取这个过滤器,并将其用作过滤器。

from("seda:sometag?multipleConsumers=true")
                .routeId(RouteIdCreator.createRouteId(toIP, toPort, "sometag"))
                .setHeader("ip").constant(client_ip_adresse)
                .filter().xpath(simple("${bean:xpathFilterComponent?methode=find}"))
                .unmarshal().jaxb("sometag").marshal()
                .json().wireTap("mina:udp://client_ip_address:20001?sync=false");

你的豆子应该看起来像

public class XpathFilterCompnent {

       public void save(String ip, String filter){
         //store a filter for an ip in database, when a subscription is received
       }

       public void find(@Header("ip") String ip){
         String filter = ... //retreive filter from database
         return filter;
       }
}
于 2012-07-29T16:28:47.987 回答