You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:24:09