优化消息日志
This commit is contained in:
parent
3bfb1219d8
commit
db541ce3bf
|
|
@ -27,7 +27,7 @@ public enum DeviceLogType implements EnumDict<String> {
|
||||||
other("其它");
|
other("其它");
|
||||||
|
|
||||||
@JSONField(serialize = false)
|
@JSONField(serialize = false)
|
||||||
private String text;
|
private final String text;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getValue() {
|
public String getValue() {
|
||||||
|
|
@ -48,6 +48,10 @@ public enum DeviceLogType implements EnumDict<String> {
|
||||||
return childReply;
|
return childReply;
|
||||||
case REPORT_PROPERTY:
|
case REPORT_PROPERTY:
|
||||||
return reportProperty;
|
return reportProperty;
|
||||||
|
case INVOKE_FUNCTION:
|
||||||
|
return functionInvoke;
|
||||||
|
case WRITE_PROPERTY:
|
||||||
|
return writeProperty;
|
||||||
case INVOKE_FUNCTION_REPLY:
|
case INVOKE_FUNCTION_REPLY:
|
||||||
return functionReply;
|
return functionReply;
|
||||||
case READ_PROPERTY_REPLY:
|
case READ_PROPERTY_REPLY:
|
||||||
|
|
@ -61,6 +65,7 @@ public enum DeviceLogType implements EnumDict<String> {
|
||||||
default:
|
default:
|
||||||
return other;
|
return other;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ public class DeviceMessageConnector
|
||||||
private FluxSink<TopicMessage> sink = messageProcessor.sink();
|
private FluxSink<TopicMessage> sink = messageProcessor.sink();
|
||||||
|
|
||||||
//将设备注册中心到配置追加到消息header中,下游订阅者可直接使用.
|
//将设备注册中心到配置追加到消息header中,下游订阅者可直接使用.
|
||||||
private String[] appendConfigHeader = { "orgId", "productId","deviceName"};
|
private String[] appendConfigHeader = {"orgId", "productId", "deviceName"};
|
||||||
//设备注册中心
|
//设备注册中心
|
||||||
private final DeviceRegistry registry;
|
private final DeviceRegistry registry;
|
||||||
|
|
||||||
|
|
@ -122,7 +122,7 @@ public class DeviceMessageConnector
|
||||||
return Mono.just("/device/unknown/message/unknown");
|
return Mono.just("/device/unknown/message/unknown");
|
||||||
}
|
}
|
||||||
|
|
||||||
public String createDeviceMessageTopic(Message message) {
|
public static String createDeviceMessageTopic(Message message) {
|
||||||
if (message instanceof EventMessage) { //事件
|
if (message instanceof EventMessage) { //事件
|
||||||
EventMessage event = ((EventMessage) message);
|
EventMessage event = ((EventMessage) message);
|
||||||
return "/message/event/".concat(event.getEvent());
|
return "/message/event/".concat(event.getEvent());
|
||||||
|
|
@ -145,11 +145,11 @@ public class DeviceMessageConnector
|
||||||
}
|
}
|
||||||
return "/message/children/reply/".concat(createDeviceMessageTopic(message));
|
return "/message/children/reply/".concat(createDeviceMessageTopic(message));
|
||||||
} else if (message instanceof ReadPropertyMessage) { //读取属性
|
} else if (message instanceof ReadPropertyMessage) { //读取属性
|
||||||
return "/message/property/read";
|
return "/message/send/property/read";
|
||||||
} else if (message instanceof WritePropertyMessage) { //修改属性
|
} else if (message instanceof WritePropertyMessage) { //修改属性
|
||||||
return "/message/property/write";
|
return "/message/send/property/write";
|
||||||
} else if (message instanceof FunctionInvokeMessage) { //调用功能
|
} else if (message instanceof FunctionInvokeMessage) { //调用功能
|
||||||
return "/message/function/reply";
|
return "/message/send/function";
|
||||||
} else if (message instanceof ReadPropertyMessageReply) { //读取属性回复
|
} else if (message instanceof ReadPropertyMessageReply) { //读取属性回复
|
||||||
return "/message/property/read/reply";
|
return "/message/property/read/reply";
|
||||||
} else if (message instanceof WritePropertyMessageReply) { //修改属性回复
|
} else if (message instanceof WritePropertyMessageReply) { //修改属性回复
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
package org.jetlinks.community.device.message;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.hswebframework.web.logger.ReactiveLogger;
|
||||||
|
import org.jetlinks.core.device.DeviceOperator;
|
||||||
|
import org.jetlinks.core.device.DeviceRegistry;
|
||||||
|
import org.jetlinks.core.message.ChildDeviceMessage;
|
||||||
|
import org.jetlinks.core.message.DeviceMessage;
|
||||||
|
import org.jetlinks.core.message.interceptor.DeviceMessageSenderInterceptor;
|
||||||
|
import org.jetlinks.community.gateway.MessageGateway;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import reactor.core.publisher.Mono;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送设备指令的时候,将消息推送到网关中.
|
||||||
|
*
|
||||||
|
* @author zhouhao
|
||||||
|
* @since 1.1
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@Slf4j(topic = "system.device.message.sender")
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class DeviceMessageSendLogInterceptor implements DeviceMessageSenderInterceptor {
|
||||||
|
|
||||||
|
private final MessageGateway messageGateway;
|
||||||
|
|
||||||
|
private final DeviceRegistry registry;
|
||||||
|
|
||||||
|
public Mono<Void> doPublish(Mono<DeviceOperator> device, DeviceMessage message) {
|
||||||
|
return device
|
||||||
|
.zipWhen(DeviceOperator::getProduct)
|
||||||
|
.doOnNext(tp2 -> message.addHeader("productId", tp2.getT2().getId()))
|
||||||
|
.flatMap(tp2 -> {
|
||||||
|
String topic = DeviceMessageConnector.createDeviceMessageTopic(message);
|
||||||
|
Mono<Void> publisher = messageGateway
|
||||||
|
.publish("/device/" + tp2.getT2().getId() + "/" + tp2.getT1().getDeviceId() + topic, message)
|
||||||
|
.then();
|
||||||
|
if (message instanceof ChildDeviceMessage) {
|
||||||
|
DeviceMessage msg = (DeviceMessage) ((ChildDeviceMessage) message).getChildDeviceMessage();
|
||||||
|
publisher = publisher.then(doPublish(registry.getDevice(msg.getDeviceId()), msg));
|
||||||
|
}
|
||||||
|
return publisher;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Mono<DeviceMessage> preSend(DeviceOperator device, DeviceMessage message) {
|
||||||
|
return doPublish(Mono.just(device), message)
|
||||||
|
.thenReturn(message)
|
||||||
|
.doOnEach(ReactiveLogger.onComplete(() -> {
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("发送指令到设备[{}]:{}", message.getDeviceId(), message.toString());
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -11,15 +11,7 @@ import java.util.Optional;
|
||||||
public class DeviceMessageUtils {
|
public class DeviceMessageUtils {
|
||||||
|
|
||||||
public static Optional<DeviceMessage> convert(TopicMessage message){
|
public static Optional<DeviceMessage> convert(TopicMessage message){
|
||||||
if (message.getMessage() instanceof EncodableMessage) {
|
return org.jetlinks.community.gateway.DeviceMessageUtils.convert(message);
|
||||||
Object nativeMessage = ((EncodableMessage) message.getMessage()).getNativePayload();
|
|
||||||
if (nativeMessage instanceof DeviceMessage) {
|
|
||||||
return Optional.of((DeviceMessage)nativeMessage);
|
|
||||||
} else if (nativeMessage instanceof Map) {
|
|
||||||
return MessageType.convertMessage(((Map<String, Object>) nativeMessage));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Optional.empty();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ import org.jetlinks.core.device.DeviceRegistry;
|
||||||
import org.jetlinks.core.device.StandaloneDeviceMessageBroker;
|
import org.jetlinks.core.device.StandaloneDeviceMessageBroker;
|
||||||
import org.jetlinks.core.message.DeviceOfflineMessage;
|
import org.jetlinks.core.message.DeviceOfflineMessage;
|
||||||
import org.jetlinks.core.message.DeviceOnlineMessage;
|
import org.jetlinks.core.message.DeviceOnlineMessage;
|
||||||
|
import org.jetlinks.core.message.interceptor.DeviceMessageSenderInterceptor;
|
||||||
import org.jetlinks.core.server.MessageHandler;
|
import org.jetlinks.core.server.MessageHandler;
|
||||||
import org.jetlinks.core.server.monitor.GatewayServerMetrics;
|
import org.jetlinks.core.server.monitor.GatewayServerMetrics;
|
||||||
import org.jetlinks.core.server.monitor.GatewayServerMonitor;
|
import org.jetlinks.core.server.monitor.GatewayServerMonitor;
|
||||||
|
|
@ -36,7 +37,9 @@ import org.jetlinks.supports.server.DefaultClientMessageHandler;
|
||||||
import org.jetlinks.supports.server.DefaultDecodedClientMessageHandler;
|
import org.jetlinks.supports.server.DefaultDecodedClientMessageHandler;
|
||||||
import org.jetlinks.supports.server.DefaultSendToDeviceMessageHandler;
|
import org.jetlinks.supports.server.DefaultSendToDeviceMessageHandler;
|
||||||
import org.jetlinks.supports.server.monitor.MicrometerGatewayServerMetrics;
|
import org.jetlinks.supports.server.monitor.MicrometerGatewayServerMetrics;
|
||||||
|
import org.springframework.beans.BeansException;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.config.BeanPostProcessor;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
|
|
@ -91,10 +94,25 @@ public class JetLinksConfiguration {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public DeviceRegistry deviceRegistry(ProtocolSupports supports, ClusterManager manager, DeviceOperationBroker handler) {
|
public ClusterDeviceRegistry deviceRegistry(ProtocolSupports supports,
|
||||||
|
ClusterManager manager,
|
||||||
|
DeviceOperationBroker handler) {
|
||||||
return new ClusterDeviceRegistry(supports, manager, handler);
|
return new ClusterDeviceRegistry(supports, manager, handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public BeanPostProcessor interceptorRegister(ClusterDeviceRegistry registry){
|
||||||
|
return new BeanPostProcessor() {
|
||||||
|
@Override
|
||||||
|
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
|
||||||
|
if(bean instanceof DeviceMessageSenderInterceptor){
|
||||||
|
registry.addInterceptor(((DeviceMessageSenderInterceptor) bean));
|
||||||
|
}
|
||||||
|
return bean;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@Bean(initMethod = "startup", destroyMethod = "shutdown")
|
@Bean(initMethod = "startup", destroyMethod = "shutdown")
|
||||||
public DefaultMessageGateway defaultMessageGateway(@Autowired(required = false) List<MessageConnector> connectors) {
|
public DefaultMessageGateway defaultMessageGateway(@Autowired(required = false) List<MessageConnector> connectors) {
|
||||||
DefaultMessageGateway gateway = new DefaultMessageGateway("default", "系统默认", new LocalClientSessionManager());
|
DefaultMessageGateway gateway = new DefaultMessageGateway("default", "系统默认", new LocalClientSessionManager());
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue