java moquette,moquette改造笔记(一):整合到SpringBoot

本文介绍了如何在SpringBoot应用中集成和使用Moquette MQTT服务器,包括Moquette的简单介绍、配置加载、权限验证接口实现以及订阅发布拦截器的定制。通过自定义服务类,实现了Moquette的启动和关闭,并提供了授权和拦截器的示例代码。
摘要由CSDN通过智能技术生成

Moquette简介

Mqtt作为物联网比较流行的协议现在已经被大范围使用,其中也有很多开源的MQTT BROKEN。Moquette是用java基于netty实现的轻量级的MQTT BROKEN. Moquette基于Netty实现,性能问题至少前期可以不用考虑,在使用过程中还算稳定,没有出现过较大的问题。github地址:https://github.com/andsel/moq...。

整合到SpringBoot

本文更加注重代码实践,对于配置相关的知识会一笔带过,不做过多的详解。

假设已经搭建好SpringBoot环境,下载完Moquette。至于怎么引用Moquette,可以在原项目上修改,也可以达成Jar包添加到lib调用,也可以上传到Maven私服后通过配置pom引用。笔者是上传到Maven私服,然后通过maven导入。

自定义包装类,实现io.moquette.server.Server的自动注入

@Slf4j

@Service

public class MoquetteServer {

@Value("${mqtt-server.config-path}")

private String configFilePath;

@Autowired

private IAuthorizator authorizator;

/**

* Safety相关的拦截器,如果有其它业务,可以再去实现一个拦截器处理其它业务

*/

@Autowired

@Qualifier("safetyInterceptHandler")

private InterceptHandler safetyinterceptHandler;

private Server mqttServer;

public void startServer() throws IOException {

IResourceLoader configFileResourceLoader = new ClasspathResourceLoader(configFilePath);

final IConfig config = new ResourceLoaderConfig(configFileResourceLoader);

mqttServer = new Server();

/**添加处理Safety相关的拦截器,如果有其它业务,可以再去实现一个拦截器处理其它业务,然后也添加上即可*/

List interceptHandlers = Arrays.asList(safetyinterceptHandler);

/**

* Authenticator 不显示设置,Server会默认以password_file创建一个ResourceAuthenticator

* 如果需要更灵活的连接验证方案,可以继承IAuthenticator接口,自定义实现

*/

mqttServer.startServer(config, interceptHandlers, null, null, authorizator);

}

public void stop() {

mqttServer.stopServer();

}

}

解释:

(1)添加@Service

(2)configFilePath是Moquette需要的moquette.conf的配置文件路径,笔者将配置文件放到了resouces目录下,在application.xml配置的路径,因此通过@Value自动注入路径值。

(3)因为是将配置文件放在了resources目录下,所以用Moquette提供的ClasspathResourceLoader加载的配置文件

(4)IAuthorizator 是权限验证接口

(5)InterceptHandler是Moquette订阅、发布、建立连接等相关事件的拦截回调业务处理逻辑接口

2.实现IAuthorizator接口

@Component

public class PermitAllAuthorizator implements IAuthorizator {

@Override

public boolean canWrite(Topic topic, String user, String client) {

/**可以控制某个用户的client,是否具有发布某个主题的权限,目前默认任何Client可以发布任主题*/

return true;

}

@Override

public boolean canRead(Topic topic, String user, String client) {

/**可以控制某个用户的client,是否具有接收某个主题的权限,目前默认任何Client可以接收任何主题*/

return true;

}

}

解释:实现另一个很简单的授权接口,允许任何用户所有的读写请求

3.实现InterceptHandler接口

@Slf4j

@Component

public class SafetyInterceptHandler extends AbstractInterceptHandler{

@Override

public String getID() {

return SafetyInterceptHandler.class.getName();

}

@Override

public void onConnect(InterceptConnectMessage msg) {

}

@Override

public void onConnectionLost(InterceptConnectionLostMessage msg) {

}

@Override

public void onPublish(InterceptPublishMessage msg) {

}

@Override

public void onMessageAcknowledged(InterceptAcknowledgedMessage msg) {

}

}

解释:

1.简单实现InterceptHandler,继承自AbstractInterceptHandler,并重写了部分方法。可以根据业务需要实现不同的方法。InterceptHandler接口是Moquette预留给开发者根据不同事件处理业务逻辑的接口。

4.通过SpringBoot启动Moquette

@SpringBootApplication

public class MqttServiceApplication {

public static void main(String[] args) throws IOException {

SpringApplication application = new SpringApplication(MqttServiceApplication.class);

final ApplicationContext context = application.run(args);

MoquetteServer server = context.getBean(MoquetteServer.class);

server.startServer();

Runtime.getRuntime().addShutdownHook(new Thread() {

@Override

public void run() {

server.stop();

log.info("Moquette Server stopped");

}

});

}

}

如果发现MoquetteServer无法启动,是否是SpringBoot默认的包扫描机制的问题,可以通过@ComponentScan解决。

通过以上操作,就可以在任何想要使用MoquetteServer的地方,通过@Autowired自动注入。

当然在MoquetteServer中笔者只是简单实现了封装,并没有实现其它方法,读者完全可以根据自己的需要在MoquetteServer中实现自己需要的功能,但前提是你要对Moquette的源码熟悉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值