Closed shanjunmei closed 1 year ago
客户端订阅的topic来源有两个: 一是处理方法上的注解,这里因为是注解的属性所以必须是常量,无法使用变量; 另外就是继承 MqttConfigurer 实现 beforeSubscribe 方法,这个方法可以在订阅前修改订阅的topic列表。
这个是不是可以统一处理下,没有变量支持还是挺不方便的~,虽然按照你说的办法可以处理,但是感觉不够优雅,之前用 de.smartsquare:mqtt-starter 这个库,是可以的,只是它不支持 多个客户端的配置
只要处理消息,就得写对应的处理方法,这点儿绕不开,写处理方法的时候就可以顺便把注解里的 topic 和 clientId 给定了。 在配置文件中配置订阅的前提我想有两个:
如果想做到这两点,那查看代码是必不可少的,那么在处理方法上就近查看订阅情况不是更好吗? 另外 de.smartsquare:mqtt-starter 这个库我看了下最新版 0.14.0 的配置,里面没有发现可以配置topic呀,只有一个group,看注释是订阅的统一前缀,这是不是你需要的? 继承 MqttConfigurer 实现 beforeSubscribe 方法就可以订阅前任意操作topic列表了,统一前缀只需要这里遍历加上就行了。
@Component
public class MyConfig extends MqttConfigurer {
@Value("${mqtt.topic-prefix:}")
private String prefix;
@Override
public void beforeSubscribe(String clientId, Set<TopicPair> topicPairs) {
Set<TopicPair> collect = topicPairs.stream()
.map(tp -> TopicPair.of(prefix + tp.getTopic(false), tp.getQos()))
.collect(Collectors.toSet());
topicPairs.clear();
topicPairs.addAll(collect);
}
}
就我个人而言不是很推荐这种把topic分段的操作,容易出现失误。如果实在需要的话,可以fork一个改改
参考截图,我确定这个是可以正常工作的哦版本就是0.14.0 它里面确实没有对topic做任何特殊处理,说明spring 默认的变量注入机制已经替换了变量
我想问题在于,实现BeanPostProcessor 时候,究竟在postProcessBeforeInitialization还是postProcessAfterInitialization中处理注解的问题
为什么我用起来没有你那个效果?
你原来的程序,肯定是哪个地方处理了,放在postProcessAfterInitialization里没用,我实际用了下 de.smartsquare:mqtt-starter 这个库, 没有你说的效果
你可以新建一个项目引用 de.smartsquare:mqtt-starter 这个库试一下,并不能替换参数,所以肯定是你的程序有地方处理了
启动顺序有问题吗,早过了spring 本身的变量注入?