一、入门知识
1什么是Activemq
MQ是消息中间件,是一种在分布式系统中应用程序借以传递消息的媒介,常用的有ActiveMQ,RabbitMQ,kafka。ActiveMQ是Apache下的开源项目,完全支持JMS1.1和J2EE1.4规范的JMS Provider实现。ActiveMQ支持MQTT协议,并将在JMS / NMS和MQTT客户端之间自动映射。MQTT是机器对机器(M2M)的发布/订阅消息传递。
2 Activemq特点
1、支持多种语言编写客户端
2、对spring的支持,很容易和spring整合
3、支持多种传输协议:TCP,SSL,NIO,UDP等
4、支持AJAX
3 消息形式
1、点对点(queue)
2、一对多(topic)
4 MQTT
MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个***消息中间件*** 。
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
5.发送策略
Mqtt有三种策略:至多一次、至少一次、只有一次。
这里着重讲解实际使用:
1.如果选择至多一次的话,消息只会发送一次,无论对方是否接受成功;
mqtt.defaultQos=0
2.如果选择至少一次,则一定是消息送达,消息没送达则会一直重复。
mqtt.defaultQos=1
这个重复是无限时间重复还是规定时间重复可以通过Demo中jdbc.properties配置:
a.无限重复
// 不清空session消息
mqtt.cleanSession=false
b.指定时间重复
// 不清空session消息
mqtt.cleanSession=true
// 保持链接时间设置为指定时间,链接中断后即清空消息,不再重复发送消息
mqtt.keepAliveInterval=300000
设置300000毫秒则代表5分钟后清空session消息,不再重复
3.只有一次
订阅和发送端多次链接,确保一次成功
mqtt.defaultQos=2
二、demo
1.pom.xml
<!-- mqtt开始 -->
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-core</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-mqtt</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.0</version>
</dependency>
<!-- mqtt结束 -->
2.web.xml
<!-- 加载spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- springmvc前段控制器 -->
<servlet>
<servlet-name>springMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!-- 在tomcat启动的时候就加载这个Servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>setEncoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>setEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.spring-mqtt.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:int="http://www.springframework.org/schema/integration"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:int-mqtt="http://www.springframework.org/schema/integration/mqtt"
xsi:schemaLocation="
http://www.springframework.org/schema/integration
http://www.springframework.org/schema/integration/spring-integration-4.1.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/integration/mqtt
http://www.springframework.org/schema/integration/mqtt/spring-integration-mqtt-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd ">
<!-- 引入配置文件- -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties" />
</bean>
<bean id="clientFactory"
class="org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory">
<property name="userName" value="${mqtt.username}" />
<property name="password" value="${mqtt.password}" />
<property name="serverURIs">
<array>
<value>${mqtt.serverURI1}</value>
</array>
</property>
</bean>
<bean id="mqttHandler" class="org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler">
<constructor-arg name="clientId" value="${mqtt.clientId}"></constructor-arg>
<constructor-arg name="clientFactory" ref="clientFactory"></constructor-arg>
<property name="async" value="${mqtt.async}" />
<property name="defaultQos" value="${mqtt.defaultQos}" />
<property name="completionTimeout" value="${mqtt.completionTimeout}" />
</bean>
<!-- 消息适配器 -->
<int-mqtt:message-driven-channel-adapter
id="mqttInbound" client-id="CID_20190617" url="${mqtt.serverURI1}"
topics="${mqtt.topic}" qos="${mqtt.defaultQos}" client-factory="clientFactory" auto-startup="true"
send-timeout="${mqtt.completionTimeout}" channel="startCase" />
<int:channel id="startCase" />
<!-- 消息处理类 -->
<int:service-activator id="startCaseService"
input-channel="startCase" ref="mqttCaseService" method="startCase" />
<bean id="mqttCaseService" class="com.jz.mqtt.service.ReceiveMqttMessageService" />
</beans>
4.SendMqttMessageController
/**
*
*/
package com.jz.controller;
import javax.annotation.Resource;
import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler;
import org.springframework.integration.mqtt.support.MqttHeaders;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @author liurui
* @date 2020年4月8日
*/
@Controller
@RequestMapping("/mqtt")
public class SendMqttMessageController {
@Resource
private MqttPahoMessageHandler mqttHandler;
@RequestMapping(value="/sendMessage",method=RequestMethod.POST)
@ResponseBody
public String sendMessage(String message) {
System.out.println("发送消息:"+message);
// 构建消息
Message<String> messages = MessageBuilder.withPayload(message)
.setHeader(MqttHeaders.TOPIC, "RECEIVE_DATA")
.build();
// 发送消息
mqttHandler.handleMessage(messages);
return "Send message is Success!";
}
}
5.ReceiveMqttMessageService
/**
*
*/
package com.jz.mqtt.service;
/**
* @author liurui
* @date 2020年4月8日
*/
public class ReceiveMqttMessageService {
public void startCase(String message){
System.out.println("收到Mqtt消息:" + message);
}
}
6.运行效果
源码下载:
https://download.csdn.net/download/liurui50/12314375
没积分发我邮箱2414931908@qq.com
附上链接