自定义xml实现字协议字段转换

时隔十几天对上一篇的补充

消息通道中如何自定义拦截器
spring-integration 中 interface ChannelInterceptor, 注释为 interface for interceptors that are able to view and/or modify the Messages being sent-to and/or received-from a MessageChannel.
所以自定义只需要实现这个接口。然后添加到channel中。

public class SzdPermissionInterceptor implements ChannelInterceptor 

自定义xml

自定义xml流程
xsd文件以及例子xml文件在帖子末尾。

1.自定义xsd文件

在resource资源目录下定义xxx.xsd文件,模板例子

<xs:element name="field" type="fieldType">
    <xs:annotation>
        <xs:documentation>
            数据协议字段
        </xs:documentation>
    </xs:annotation>
</xs:element>

<xs:complexType name="fieldType">
    <xs:attribute name="name" type="xs:string" use="required" />
    <xs:attribute name="type" type="xs:string" use="required" />
    <xs:attribute name="length" type="xs:integer" use="optional" />
</xs:complexType>
2.spring上下文加载xsd文件

resource下创建META-INF文件夹,在文件夹下创建spring.hanlders与spring.schemas文件

spring.hanlders 定义解析器

http\://com.dahua/schema/accessData/protocol=com.dahua.paas.fdau.application.init.xml.AccessDataProtocolNamespaceHandler

AccessDataProtocolNamespaceHandler

public class AccessDataProtocolNamespaceHandler extends NamespaceHandlerSupport{
	@Override
	public void init() {
		// 注册接入数据协议映射解析器
		registerBeanDefinitionParser("protocol", new AccessDataProtocolMapperParser());
	}

}

spring.schemas定义xml文件位置

http\://com.dahua/schema/accessData/protocol/fdau-protocol.xsd=META-INF/fdau-protocol.xsd

NamespaceHandlerSupport类是一个实现了NamespaceHandler接口的抽象类,它提供了方便的方法来处理命名空间和元素的注册和解析。
命名空间和元素注册解析,划重点。
springboot自定义xml标签的时候都需要用到这个接口,写好xsd自定义文件,然后就是spring上下文加载进来xsd定义,以及自定义xml文件。通过NamespaceHandler的parse去处理解析自定义xml文件。其实实现NamespaceHandler的还有spring默认的读取xml,可以自行研究。

init()方法:在此方法中,你可以将命名空间与处理该命名空间的BeanDefinitionParser关联起来,并注册到Spring上下文中。

registerBeanDefinitionParser(String elementName, BeanDefinitionParser parser)方法:该方法用于将元素名与相应的BeanDefinitionParser关联起来。当Spring解析到指定的元素时,会使用相应的BeanDefinitionParser进行解析和创建BeanDefinition。
所以代码中解析的是xsd的protocol标签

还有个registerBeanDefinitionDecorator(String elementName, BeanDefinitionDecorator decorator), 这个没研究,从文档和实现看像是装饰器。

3.标签解析

integrationNamespaceUtils.setValueIfAttributeDefined(builder, element, “namespace”)是一个Spring Integration框架提供的辅助方法,用于根据XML元素的属性值设置BeanDefinitionBuilder对象的属性。

BeanDefinitionBuilder 是BeanDefinition的构造器,BeanDefinition描述Bean的各种元数据,包括Bean的类型、作用域、属性值等。它是Spring容器在进行Bean实例化和管理时使用的配置信息。
这个可以看看源码,实现BeanDefinition的抽象类AbstractBeanDefinition。

public class AccessDataProtocolMapperParser implements BeanDefinitionParser {
	@Override
    public BeanDefinition parse(Element element, ParserContext parserContext) {
		//逻辑 
		//elemeent就是自定义的
		    // 创建一个DefaultProtocolContext类的BeanDefinition
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(DefaultProtocol.class);
        // 获取协议的命名空间
        IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "namespace");
         // 获取协议的唯一标识
        IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "id");
        // 获取协议数据要发送的数据通道
        IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "channel");
        IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "primaryKey");
        // 协议版本
        IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "version");
        // 要发送的kafka主题
        IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "kafkaTopic");
        // 中台数据协议小类
        IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "dataSType");
        // 是否是实时数据
        IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "realTime");
        IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "descr", "description");
        String protocolId = FdauStringUtils.getProtocolId(element.getAttribute("id"), element.getAttribute(
                "namespace"), element.getAttribute("version"));
        String descr = element.getAttribute("descr");
        if (StringUtils.isNotBlank(descr)) {
            ProtocolNameMappingCache.put(protocolId, descr);
        } else {
            ProtocolNameMappingCache.put(protocolId, protocolId);
        }
        // 解析协议字段映射关系
        prepareProtocolMapping(element,builder);
        // 注册BeanDefinition
        parserContext.getRegistry().registerBeanDefinition(getBeanName(element), builder.getBeanDefinition());
        // 返回封装好的BeanDefinition
        return builder.getBeanDefinition();
	}
}

首先是设置protocol标签自定义的属性,然后就是要解析protocol标签下的子标签,将子标签的属性标签还有引用初始化好。

 private void prepareProtocolMapping(Element element,
                                                       BeanDefinitionBuilder protocolBuilder) {
        ManagedList<Object> list = new ManagedList<>();
        // 解析协议的所有字段
        List<Element> fieldElements = DomUtils.getChildElementsByTagName(element, "field");
        if (CollectionUtils.isNotEmpty(fieldElements)) {
            for (Element fieldElement : fieldElements) {
                BeanDefinition protocolFieldContext = prepareProtocolFieldContext(fieldElement);
                list.add(protocolFieldContext);
            }
            protocolBuilder.addPropertyValue("protocolFieldList", list);
        }

        List<Element> referenceElements = DomUtils.getChildElementsByTagName(element, "reference");
        if(CollectionUtils.isNotEmpty(referenceElements)){
            for (Element referenceElement : referenceElements) {
                BeanDefinition protocolFieldContext = prepareReferenceProtocol(referenceElement);
                list.add(protocolFieldContext);
            }
            protocolBuilder.addPropertyValue("refProtocolList", list);
        }
    }

这个子标签就涉及到xml中的如何在使用标签了,AccessDataProtocolMapperParser 这个类的parse就是在解析每一个自定义xml(含有protocol标签的,因为注入解析器时,传的标签名为protocol)。
下面解析protolcol下面filed子标签的代码过程

private BeanDefinition prepareProtocolFieldContext(Element fieldElement) {
        // 生成数据协议上下文BeanDefinition
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(ProtocolField.class);

        // 获取数据协议字段属性BeanDefinition
        BeanDefinition protocolFieldAttribute = mapFieldAttribute(fieldElement);
        // 准备字段策略
        List<Object> strategys = prepareStrategys(fieldElement, "strategys");

        builder.addPropertyValue("strategys", strategys);
        builder.addPropertyValue("protocolFieldAttribute", protocolFieldAttribute);
        return builder.getBeanDefinition();
    }
private BeanDefinition mapFieldAttribute(Element fieldElement) {
        // 获取协议字段属性的BeanDefinition
        BeanDefinitionBuilder builder =
                BeanDefinitionBuilder.genericBeanDefinition(ProtocolFieldAttribute.class);
        // field元素中所有的属性节点
        IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, fieldElement, "src","sourceField");
        IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, fieldElement, "dest","targetField");
        IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, fieldElement, "srcType","sourceType");
        IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, fieldElement, "destType","targetType");
        IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, fieldElement, "required");
        IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, fieldElement, "len", "length");
        IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, fieldElement, "default","defaultValue");
        IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, fieldElement, "requiredOnCondition");
        IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, fieldElement, "condition");
        return builder.getBeanDefinition();
    }

IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, fieldElement, “dest”, “targetField”)
这个方法是把xml的标签值映射成ProtocolFieldAttribute中的成员属性

@Data
public class ProtocolFieldAttribute implements Serializable, Cloneable {

    private static final long serialVersionUID = 8264557930205994292L;
    /**
     * 目标协议字段
     */
    private String targetField;
    /**
     * 源数据字段
     */
    private String sourceField;
    /**
     * 源数据类型
     */
    private String sourceType;
    /**
     * 目标数据类型
     */
    private String targetType;
    /**
     * 字段是否必填
     */
    private boolean required = false;
    /**
     * 字段长度
     */
    private Integer length;
    /**
     * 默认值
     */
    private Object defaultValue;

    /**
     * 必填条件
     */
    private String requiredOnCondition;

    /**
     * 字段转换的条件
     */
    private String condition;

    /**
     * 字段值
     */
    private Object value;
}

检验策略模式加载

    private ManagedList<Object> prepareStrategys(Element fieldElement, String elementName) {
        // 累积策略的集合
        ManagedList<Object> list = new ManagedList<>();
        // 设置默认的校验策略
        prepareDefaultVerificationStrategys(list);
        // 获取Strategy节点元素
        Element strategys = DomUtils.getChildElementByTagName(fieldElement, elementName);
        if (strategys == null) {
            return list;
        }
        // 获取additivity属性值
        String additivity = strategys.getAttribute("additivity");
        // 如果additivity没有配置或者为true 则增加默认的校验策略
        if (StringUtils.isNotBlank(additivity) && !Boolean.parseBoolean(additivity)) {
            list.clear();
        }

        // 查询节点下的所有策略
        List<Element> strategyList = DomUtils.getChildElementsByTagName(strategys, "strategy");
        if (CollectionUtils.isEmpty(strategyList)) {
            return list;
        }
        for (Element strategy : strategyList) {
            BeanDefinition definition = prepareStrategy(strategy);
            if (definition == null) {
                continue;
            }
            list.add(definition);
        }
        return list;
    }

到这基本上如何去加载的已经很清楚了,新增协议时就是新增xml配置,根据url映射不同的xml文件,一开始的时候是加载了命名空间和协议id的,后续integration通道集成也可以从映射协议中渠道kafkaTopic,根据前文,设置kafkaHeader,进行消息发送。

中台对消息主题的消息进行消费,入库,清洗以及数据分析。

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://com.dahua/schema/accessData/protocol" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://com.dahua/schema/accessData/protocol">

	<xsd:element name="protocol">
		<xsd:annotation>
			<xsd:documentation>
				数据协议字段映射关系顶层元素
			</xsd:documentation>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:choice>
				<xsd:element minOccurs="0" maxOccurs="unbounded" ref="reference"/>
				<xsd:element minOccurs="0" maxOccurs="unbounded" ref="field"/>
			</xsd:choice>
			<xsd:attribute name="namespace" type="xsd:string" >
				<xsd:annotation>
					<xsd:documentation>
						数据协议命名空间(协议大类)
					</xsd:documentation>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="id" type="xsd:string" use="required">
				<xsd:annotation>
					<xsd:documentation>
						数据协议名称(协议小类)
					</xsd:documentation>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="channel" type="xsd:string">
				<xsd:annotation>
					<xsd:documentation>
						数据发送通道
					</xsd:documentation>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="primaryKey" type="xsd:string">
				<xsd:annotation>
					<xsd:documentation>
						源数据平台数据唯一键
					</xsd:documentation>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="kafkaTopic" type="xsd:string">
				<xsd:annotation>
					<xsd:documentation>
						中台数据协议大类
					</xsd:documentation>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="dataSType" type="xsd:string">
				<xsd:annotation>
					<xsd:documentation>
						中台数据协议小类
					</xsd:documentation>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="realTime" type="xsd:boolean">
				<xsd:annotation>
					<xsd:documentation>
						实时数据
					</xsd:documentation>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="version" type="xsd:string">
				<xsd:annotation>
					<xsd:documentation>
						协议版本号
					</xsd:documentation>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="descr" type="xsd:string">
				<xsd:annotation>
					<xsd:documentation>
						数据协议名称中文描述
					</xsd:documentation>
				</xsd:annotation>
			</xsd:attribute>
		</xsd:complexType>
		
	</xsd:element>
	<xsd:element name="field" type="fieldType">
		<xsd:annotation>
			<xsd:documentation>
				数据协议字段
			</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	<xsd:element name="reference">
		<xsd:annotation>
			<xsd:documentation>
				数据协议引用
			</xsd:documentation>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:attributeGroup ref="refAttribute"/>
		</xsd:complexType>
	</xsd:element>
	<xsd:element name="strategys" type="strategysType">
		<xsd:annotation>
			<xsd:documentation>
				字段策略集合
			</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	<xsd:element name="strategy" type="strategyType">
		<xsd:annotation>
			<xsd:documentation>
				字段具体策略
			</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	<xsd:element name="minValue" type="xsd:integer">
		<xsd:annotation>
			<xsd:documentation>
				最大值
			</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	<xsd:element name="maxValue" type="xsd:integer" >
		<xsd:annotation>
			<xsd:documentation>
				最小值
			</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	<xsd:element name="pattern" type="xsd:string" >
		<xsd:annotation>
			<xsd:documentation>
				正则表达式
			</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	<xsd:element name="enums" type="xsd:anySimpleType" >
		<xsd:annotation>
			<xsd:documentation>
				枚举值
			</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	
	<xsd:element name="dicMapping">
		<xsd:annotation>
			<xsd:documentation>
				字典映射组
			</xsd:documentation>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="mapping" maxOccurs="unbounded"/>
			</xsd:sequence>
			<xsd:attribute name="id" type="xsd:string">
				<xsd:annotation>
					<xsd:documentation>
						字典映射组唯一标识
					</xsd:documentation>				
				</xsd:annotation>
			</xsd:attribute>
		</xsd:complexType>
	</xsd:element>
	
	<xsd:element name="mapping">
		<xsd:annotation>
			<xsd:documentation>
				字典值映射
			</xsd:documentation>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:attribute name="sourceValue" type="xsd:anySimpleType">
				<xsd:annotation>
					<xsd:documentation>
						源字典值
					</xsd:documentation>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="targetValue" type="xsd:anySimpleType">
				<xsd:annotation>
					<xsd:documentation>
						目标字典值
					</xsd:documentation>
				</xsd:annotation>
			</xsd:attribute>
		</xsd:complexType>
	</xsd:element>
	
	<xsd:complexType name="fieldType">
		<xsd:annotation>
			<xsd:documentation>
				数据协议映射结果集
			</xsd:documentation>
		</xsd:annotation>
		<xsd:sequence>
			<xsd:element ref="strategys" minOccurs="0"/>
		</xsd:sequence>
		<xsd:attributeGroup ref="fieldAttribute"/>
	</xsd:complexType>
	
	<xsd:attributeGroup name="fieldAttribute">
		<xsd:annotation>
			<xsd:documentation>
				字段元素的所有属性
				sourceField 源数据字段
				targetField 目标数据字段
				sourceType 源数据类型
				targetType 目标数据类型
				required 是否必填
				length 字段长度
				defaultValue 字段默认值
			</xsd:documentation>
		</xsd:annotation>
		<xsd:attribute name="src" type="xsd:string"/>
		<xsd:attribute name="dest" type="xsd:string"/>
		<xsd:attribute name="srcType" type="xsd:string"/>
		<xsd:attribute name="destType" type="xsd:string"/>
		<xsd:attribute name="required" type="xsd:boolean"/>
		<xsd:attribute name="len" type="xsd:integer"/>
		<xsd:attribute name="default" type="xsd:anySimpleType"/>
		<xsd:attribute name="condition" type="xsd:string"/>
		<xsd:attribute name="requiredOnCondition" type="xsd:string"/>
	</xsd:attributeGroup>	
	
	<xsd:complexType name="strategysType">
		<xsd:annotation>
			<xsd:documentation>
				字段内容提取/校验的策略配置
			</xsd:documentation>
		</xsd:annotation>
		<xsd:sequence>
			<xsd:element ref="strategy" minOccurs="1" maxOccurs="unbounded"/>
		</xsd:sequence>
		<xsd:attribute name="additivity" type="xsd:boolean">
			<xsd:annotation>
				<xsd:documentation>
					标识策略是否叠加
				</xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>
	</xsd:complexType>
	
	<xsd:complexType name="strategyType">
		<xsd:annotation>
			<xsd:documentation>
				策略子元素
			</xsd:documentation>
		</xsd:annotation>
		<xsd:sequence>
			<xsd:element ref="minValue" minOccurs="0">
				<xsd:annotation>
					<xsd:documentation>
						最大值
					</xsd:documentation>
				</xsd:annotation>
			</xsd:element>
			<xsd:element ref="maxValue" minOccurs="0">
				<xsd:annotation>
					<xsd:documentation>
						最小值
					</xsd:documentation>
				</xsd:annotation>
			</xsd:element>
			<xsd:element ref="pattern" minOccurs="0">
				<xsd:annotation>
					<xsd:documentation>
						正则表达式
					</xsd:documentation>
				</xsd:annotation>
			</xsd:element>
			<xsd:element ref="enums" minOccurs="0" maxOccurs="unbounded">
				<xsd:annotation>
					<xsd:documentation>
						枚举值
					</xsd:documentation>
				</xsd:annotation>
			</xsd:element>
		</xsd:sequence>
		<xsd:attribute name="class" type="xsd:string">
			<xsd:annotation>
				<xsd:documentation>
					策略类的全限定路径
				</xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>
		<xsd:attribute name="dicTypeCode" type="xsd:string">
			<xsd:annotation>
				<xsd:documentation>
					字典类型编码
				</xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>
		<xsd:attribute name="dicMapping" type="xsd:string">
			<xsd:annotation>
				<xsd:documentation>
					字典值映射
				</xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>
		<xsd:attribute name="relyField" type="xsd:string">
			<xsd:annotation>
				<xsd:documentation>
					关系主键映射
				</xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>
		<xsd:attribute name="relyValue" type="xsd:string">
			<xsd:annotation>
				<xsd:documentation>
					关系主键值映射
				</xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>
		<xsd:attribute name="preExtract" type="xsd:boolean">
			<xsd:annotation>
				<xsd:documentation>
					是否将执行策略前置到校验策略前执行
				</xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>
	</xsd:complexType>

	<xsd:attributeGroup name="refAttribute">
		<xsd:annotation>
			<xsd:documentation>
				id 协议id
				namespace 协议命名空间
				condition 引用条件
			</xsd:documentation>
		</xsd:annotation>
		<xsd:attribute name="id" type="xsd:string"/>
		<xsd:attribute name="namespace" type="xsd:string"/>
		<xsd:attribute name="condition" type="xsd:string"/>
	</xsd:attributeGroup>
	
</xsd:schema>

协议例子


<?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:fdau="http://com.dahua/schema/accessData/protocol"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	 http://com.dahua/schema/accessData/protocol http://com.dahua/schema/accessData/protocol/fdau-protocol.xsd">

	<fdau:protocol id="deviceState" descr="设备/部件运行状态" namespace="SZD">
		<fdau:reference id="mainframeState" namespace="SZD"
						condition="T(java.lang.String).valueOf(['device_category']) == '1'"/>
		<fdau:reference id="detectorState" namespace="SZD"
						condition="T(java.lang.String).valueOf(['device_category']) == '2'"/>
	</fdau:protocol>

	<fdau:protocol id="mainframeState" descr="设备运行状态" namespace="SZD" primaryKey="event_id"
				   kafkaTopic="collIotDevice" dataSType="mainframeRunStatus">
		<!--1.3.1-->
		<fdau:field src="mainframeCode" destType="String" dest="mainframeCode"  len="128"/>
		<fdau:field src="mainframeRunBigStatus" destType="String" dest="mainframeRunBigStatus" len="32">
			<fdau:strategys additivity="true">
				<fdau:strategy class="com.dahua.paas.fdau.common.strategy.DictionaryCheckStrategy" dicTypeCode="6088"/>
			</fdau:strategys>
		</fdau:field>
		<fdau:field src="mainframeRunSmallStatus" destType="String" dest="mainframeRunSmallStatus" len="32">
			<fdau:strategys additivity="true">
				<fdau:strategy class="com.dahua.paas.fdau.common.strategy.DictionaryCheckStrategy" dicTypeCode="6127"/>
			</fdau:strategys>
		</fdau:field>
		<fdau:field src="controlRoomId" destType="String" dest="controlRoomId"  len="64"/>
		<fdau:field src="controlRoomCode" destType="String" dest="controlRoomCode"  len="128"/>
		<!--1.3.1-->

		<fdau:field src="event_id" dest="recordId" destType="String" len="32" required="true"/>
		<fdau:field src="device_category" dest="device_category" destType="Integer" len="3" required="true">
			<fdau:strategys additivity="true">
				<fdau:strategy class="com.dahua.paas.fdau.common.strategy.EnumValueCheckStrategy">
					<fdau:enums>1</fdau:enums>
					<fdau:enums>2</fdau:enums>
					<fdau:enums>999</fdau:enums>
				</fdau:strategy>
			</fdau:strategys>
		</fdau:field>
		<fdau:field src="device_id" dest="mainframeId" destType="String" len="32" required="true"/>
		<fdau:field src="online_status" dest="onlineStatus" destType="String" len="3" required="true">
			<fdau:strategys additivity="true">
				<fdau:strategy class="com.dahua.paas.fdau.common.strategy.EnumValueCheckStrategy">
					<fdau:enums>0</fdau:enums>
					<fdau:enums>1</fdau:enums>
				</fdau:strategy>
			</fdau:strategys>
		</fdau:field>
		<fdau:field src="work_status" dest="runningStatus" destType="String" len="3" required="true">
			<fdau:strategys additivity="true">
				<fdau:strategy class="com.dahua.paas.fdau.common.strategy.EnumValueCheckStrategy">
					<fdau:enums>0</fdau:enums>
					<fdau:enums>1</fdau:enums>
				</fdau:strategy>
			</fdau:strategys>
		</fdau:field>
		<fdau:field src="event_time" dest="happenTime" destType="String" len="20" required="true">
            <fdau:strategys additivity="true">
                <fdau:strategy class="com.dahua.paas.fdau.common.strategy.DateFormatCheckStrategy"/>
            </fdau:strategys>
        </fdau:field>
		<fdau:field src="parent_id" destType="String" dest="operationServiceOrgId" len="32" required="true"/>
		<fdau:field src="platformCode" dest="platformCode" destType="String" len="8" required="true"/>
		<fdau:field src="recordUpdateTime" destType="String" dest="recordUpdateTime" len="64"
					default="T(com.dahua.paas.fdau.common.util.DateUtils).formateDate(new java.util.Date())"/>
	</fdau:protocol>

	<fdau:protocol id="detectorState" descr="部件运行状态" namespace="SZD" primaryKey="event_id"
				   kafkaTopic="collIotDevice" dataSType="detectorRunStatus">
		<!--1.3.1-->
		<fdau:field src="detectorCode" destType="String" dest="detectorCode"  len="128"/>
		<fdau:field src="detectorRunBigStatus" destType="String" dest="detectorRunBigStatus" len="8">
			<fdau:strategys additivity="true">
				<fdau:strategy class="com.dahua.paas.fdau.common.strategy.DictionaryCheckStrategy" dicTypeCode="6091"/>
				<fdau:strategy class="com.dahua.paas.fdau.common.strategy.DictionaryExtractStrategy" dicMapping="detectorRunBigStatusRefMapping"/>
			</fdau:strategys>
		</fdau:field>
		<fdau:field src="detectorRunSmallStatus" destType="String" dest="detectorRunSmallStatus" len="8">
			<fdau:strategys additivity="true">
				<fdau:strategy class="com.dahua.paas.fdau.common.strategy.DictionaryCheckStrategy" dicTypeCode="6126"/>
			</fdau:strategys>
		</fdau:field>
		<fdau:field src="controlRoomId" destType="String" dest="controlRoomId"  len="64"/>
		<fdau:field src="controlRoomCode" destType="String" dest="controlRoomCode"  len="128"/>
		<fdau:field src="remark" destType="String" dest="memo"  len="256"/>
		<fdau:field src="chargerNum" destType="Integer" dest="chargerNum"  default="-1"/>
		<!--1.3.1-->

		<fdau:field src="event_id" dest="recordId" destType="String" len="32" required="true"/>
		<fdau:field src="device_category" dest="device_category" destType="Integer" len="3" required="true">
			<fdau:strategys additivity="true">
				<fdau:strategy class="com.dahua.paas.fdau.common.strategy.EnumValueCheckStrategy">
					<fdau:enums>1</fdau:enums>
					<fdau:enums>2</fdau:enums>
				</fdau:strategy>
			</fdau:strategys>
		</fdau:field>
		<fdau:field src="device_id" dest="detectorId" destType="String" len="32" required="true"/>
		<fdau:field src="online_status" dest="onlineStatus" destType="String" len="3" required="true">
			<fdau:strategys additivity="true">
				<fdau:strategy class="com.dahua.paas.fdau.common.strategy.EnumValueCheckStrategy">
					<fdau:enums>0</fdau:enums>
					<fdau:enums>1</fdau:enums>
				</fdau:strategy>
			</fdau:strategys>
		</fdau:field>
		<fdau:field src="work_status" dest="runningStatus" destType="String" len="3" required="true">
			<fdau:strategys additivity="true">
				<fdau:strategy class="com.dahua.paas.fdau.common.strategy.EnumValueCheckStrategy">
					<fdau:enums>0</fdau:enums>
					<fdau:enums>1</fdau:enums>
				</fdau:strategy>
			</fdau:strategys>
		</fdau:field>
		<fdau:field src="event_time" dest="happenTime" destType="String" len="20" required="true">
            <fdau:strategys additivity="true">
                <fdau:strategy class="com.dahua.paas.fdau.common.strategy.DateFormatCheckStrategy"/>
            </fdau:strategys>
        </fdau:field>
		<fdau:field src="parent_id" destType="String" dest="operationServiceOrgId" len="32" required="true"/>
		<fdau:field src="platformCode" dest="platformCode" destType="String" len="8" required="true"/>
	</fdau:protocol>
	
</beans>
  • 33
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值