PHP Stomp订阅ActiveMQ时selector前缀convert_string_expressions如何修复
PHP基于Stomp协议订阅ActiveMQ主题selector自动加convert_string_expressions前缀修复
复现场景
使用如下PHP代码订阅ActiveMQ主题时,selector表达式可正常传入,但会被自动添加convert_string_expressions前缀,导致规则匹配不符合预期:
$topic = '/topic/orders'; $selector = "orders IN ('1233', '345', '22222')"; $username = 'username'; $pass = 'pass'; $connection = new Connection($brokerUri); $client = new Client($connection); $client->setLogin($username, $pass); $stomp = new StatefulStomp($client); $stomp->subscribe($topic,$selector);
异常表现截图:
根因说明
该前缀是ActiveMQ Stomp协议的默认兼容逻辑触发的:ActiveMQ默认开启convertStringExpressions配置,会自动给Stomp客户端提交的selector加此前缀,用来兼容旧版Stomp客户端的字符串属性识别逻辑,在当前使用的客户端版本下该处理会干扰selector正常匹配。
修复方法
两种方案二选一即可:
- 服务端配置修改:
编辑ActiveMQ配置文件activemq.xml,找到Stomp协议的传输连接器配置,新增transport.convertStringExpressions=false参数,示例配置:
保存配置后重启ActiveMQ服务生效,所有后续连接的Stomp客户端都不会再被自动添加前缀。<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?transport.convertStringExpressions=false"/> - 客户端连接参数修改(无需改动服务端):
初始化连接使用的$brokerUri时,直接在URI末尾拼接?convertStringExpressions=false参数,原有订阅逻辑无需改动即可修复问题,示例:// 普通TCP连接示例 $brokerUri = 'tcp://your-activemq-ip:61613?convertStringExpressions=false'; // SSL连接同理,直接拼接参数即可 // $brokerUri = 'ssl://your-activemq-ip:61614?convertStringExpressions=false'; $connection = new Connection($brokerUri);
内容的提问来源于stack exchange,提问作者Chandra Shekhar Pandey
相关产品推荐
相关产品推荐

