如何使用Apache Camel SMPP向多个收件人发送短信及问题排查
解决Apache Camel SMPP向多个收件人发送短信的问题
错误原因
你的代码中用recipientList.toString()给CamelSmppDestAddr设值,会生成类似[0512345678, 0512345679]的字符串,Camel SMPP组件会把这个整体当成一个收件人号码,导致号码长度超过SMPP协议限制(要求小于21位),触发PDUStringException。
解决方案
通过Camel的split处理器拆分收件人列表,为每个收件人创建独立的Exchange发送短信,这是最可靠的方式(多数SMPP网关不支持一次性提交多个收件人)。修改后的路由代码如下:
@Component public class SMSRoute extends RouteBuilder{ List<String> recipientList = Arrays.asList("0512345678","0512345679"); @Override public void configure() throws Exception { from("timer://myTimer?period=1000") .split(constant(recipientList)) // 拆分收件人列表,每个号码生成一个Exchange .setHeader("CamelSmppDestAddr", simple("${body}")) // 将当前号码设为目标地址 .setBody(simple("Hello World Camel fired at ${header.firedTime}")) .to("smpp://smppclient@{{host}}:{{port}}?password={{password}}&systemId={{systemId}}&" + "transactionTimer=5000&systemType=70015" + "&sourceAddr=JAVA&dataCoding=8&encoding=UTF-16BE&alphabet=8"); } }
代码说明
split(constant(recipientList)):遍历收件人列表,为每个号码创建单独的消息交换(Exchange)。setHeader("CamelSmppDestAddr", simple("${body}")):将拆分后的单个号码设置为短信目标地址,避免多个号码被识别为一个的问题。- 每个号码都会独立发送一条短信,符合SMPP协议单条短信对应单收件人的规范。
内容的提问来源于stack exchange,提问作者dilip
相关产品推荐
相关产品推荐

