tocrhz / mqtt-spring-boot-starter

MQTT starter for Spring Boot, easier to use.
Apache License 2.0
93 stars 47 forks source link

怎么在定义topic的时候使用propertie里面设置的变量 #14

Closed shanjunmei closed 1 year ago

shanjunmei commented 2 years ago

启动顺序有问题吗,早过了spring 本身的变量注入?

tocrhz commented 2 years ago

客户端订阅的topic来源有两个: 一是处理方法上的注解,这里因为是注解的属性所以必须是常量,无法使用变量; 另外就是继承 MqttConfigurer 实现 beforeSubscribe 方法,这个方法可以在订阅前修改订阅的topic列表。

shanjunmei commented 2 years ago

这个是不是可以统一处理下,没有变量支持还是挺不方便的~,虽然按照你说的办法可以处理,但是感觉不够优雅,之前用 de.smartsquare:mqtt-starter 这个库,是可以的,只是它不支持 多个客户端的配置

tocrhz commented 2 years ago

只要处理消息,就得写对应的处理方法,这点儿绕不开,写处理方法的时候就可以顺便把注解里的 topic 和 clientId 给定了。 在配置文件中配置订阅的前提我想有两个:

  1. 了解客户端需要订阅哪些消息
  2. 了解程序能处理哪些消息

如果想做到这两点,那查看代码是必不可少的,那么在处理方法上就近查看订阅情况不是更好吗? 另外 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一个改改

shanjunmei commented 2 years ago

参考截图,我确定这个是可以正常工作的哦版本就是0.14.0 它里面确实没有对topic做任何特殊处理,说明spring 默认的变量注入机制已经替换了变量

shanjunmei commented 2 years ago

image

shanjunmei commented 2 years ago

我想问题在于,实现BeanPostProcessor 时候,究竟在postProcessBeforeInitialization还是postProcessAfterInitialization中处理注解的问题

tocrhz commented 2 years ago

为什么我用起来没有你那个效果? image image

tocrhz commented 2 years ago

你原来的程序,肯定是哪个地方处理了,放在postProcessAfterInitialization里没用,我实际用了下 de.smartsquare:mqtt-starter 这个库, 没有你说的效果

tocrhz commented 2 years ago

你可以新建一个项目引用 de.smartsquare:mqtt-starter 这个库试一下,并不能替换参数,所以肯定是你的程序有地方处理了