如何在Apache Camel中创建路由到消费端点的REST服务并解决XMPP路由问题
问题根因
- 两个XMPP端点使用完全相同的URI导致连接冲突:同一个JID无法在两个XMPP端点同时建立会话,重复登录会被服务端踢下线
- 消费者端的XMPP URI错误配置了
participant参数:该参数仅用于生产者端指定消息接收方,消费者端添加该参数会导致消息监听逻辑异常 - 第二条XMPP消费路由本身是独立运行的监听逻辑,不需要REST路由触发,你之前的判断有误
可行解决方案
步骤1:调整XMPP端点的URI配置
消费者端URI删除participant参数,仅保留基础连接参数,避免和生产者端冲突:
// 生产者端URI(发消息用,保留participant指定收件人) "xmpp://[服务地址]:[端口]?username=你的登录JID&password=OneTeam2020&participant=收件人JID" // 消费者端URI(收消息用,不需要participant) "xmpp://[服务地址]:[端口]?username=你的登录JID&password=OneTeam2020"
注意:如果你的XMPP服务需要指定serviceName,额外添加serviceName=你的服务名参数即可
步骤2:修复消费路由的逻辑
你当前的消费路由直接用setBody(constant(...))覆盖了接收到的XMPP消息,调整为先打印收到的消息验证监听生效,同时将发消息逻辑抽为公共路由避免重复配置连接:
rest("/xmppchat") .get() .to("direct:jennychat"); // 发消息公共路由 from("direct:jennychat") .process(new Processor() { public void process(Exchange exchange) throws Exception { exchange.getIn().setBody("hi maro"); } }) .to("xmpp://[服务地址]:[端口]?username=你的登录JID&password=OneTeam2020&participant=收件人JID"); // 修复后的消息监听路由 from("xmpp://[服务地址]:[端口]?username=你的登录JID&password=OneTeam2020") .log("收到XMPP消息:${body}") // 打印收到的原始消息验证监听生效 .setBody(constant("I will win!\n Your Superman.")) .log("自动回复内容:${body}");
步骤3:验证路由启动
启动服务后不需要调用REST接口,只要XMPP消费路由连接成功,给你的登录JID发一条测试消息,就能在日志里看到打印的接收内容。
内容的提问来源于stack exchange,提问作者Jenny
相关产品推荐
相关产品推荐

