我在服务器启动时加载了以下静态路由。它侦听端口上的 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 官方邮件列表上发布了这个。