伴随着spring.xml的没落、json的大行其道,mybaticPlus的流行。xml正在淡出开发人员的视野。但有时候这些基础技术还是能在一些小众应用场合继续发光发热的。可能会有意外的收获,让代码给人以高大上的感觉。看起来会耳目一新。从实际工作中,抽取出几个小众应用场景聊聊xml的应用。
一、自定义流程引擎,以activiti引擎能参照,手搓一个本地化的流程引擎,将其流程配置存储在xml里面。如下图:
<flow flowId="archive_passive_audit" flowName="xxx" isReplace="false">
<node nodeId="submitAuditSuggest" nodeName="xxx" isStart="true" >
<nextNode nextNodeId="prepareReceive"/>
<nextNode nextNodeId="saveDraft"/>
</node>
<node nodeId="saveDraft" nodeName="xxx">
<nextNode nextNodeId="prepareReceive"/>
</node>
<node nodeId="prepareReceive" nodeName="xxx" >
<nextNode nextNodeId="decideReceive"/>
<nextNode nextNodeId="getBackSuggest"/>
<nextNode nextNodeId="rejectSuggest"/>
<nextNode nextNodeId="publishSuggest"/>
</node>
<node nodeId="getBackSuggest" nodeName="xxx">
<nextNode nextNodeId="prepareReceive"/>
</node>
<node nodeId="rejectSuggest" nodeName="xxx" isEnd="true"/>
<node nodeId="decideReceive" nodeName="xxx">
<nextNode nextNodeId="publishSuggest"/>
</node>
<node nodeId="publishSuggest" processor="publishAuditArchivePassiveProcessor" nodeName="xxx">
<nextNode nextNodeId="committeeAudit"/>
</node>
<node nodeId="committeeAudit" processor="legislationPassiveOfficeNodeProcessor" nodeName="xxx">
<nextNode nextNodeId="handleAuditResult"/>
</node>
<node nodeId="handleAuditResult" nodeName="xxx" isAuto="true">
<nextNode nextNodeId="saveDocument"/>
<nextNode nextNodeId="cancelDocument"/>
<nextNode nextNodeId="completeAuditResult"/>
</node>
<node nodeId="saveDocument" nodeName="xxx" isEnd="true"/>
<node nodeId="cancelDocument" nodeName="xxx" isEnd="true" />
<node nodeId="completeAuditResult" nodeName="xxx">
<nextNode nextNodeId="submitReturnResult"/>
</node>
<node nodeId="submitReturnResult" nodeName="xxx" isEnd="true"/>
</flow>
约束文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT flow (node+)>
<!ATTLIST flow flowId CDATA #REQUIRED>
<!ATTLIST flow flowName CDATA #REQUIRED>
<!ATTLIST flow isReplace (true|false) false>
<!ELEMENT node (nextNode+)>
<!ATTLIST node nodeId #REQUIRED>
<!ATTLIST node nodeName CDATA #REQUIRED>
<!ATTLIST node processor CDATA #IMPLIED>
<!ATTLIST node isStart (true|false) false>
<!ATTLIST node isEnd (true|false) false>
<!ATTLIST node isAuto (true|false) false>
<!ATTLIST node isUsing (true|false) true>
<!ATTLIST node isOnlySteam (true|false) true>
<!ATTLIST node skipNextNodeCheck (true|false) false>
<!ATTLIST node roleKey CDATA #IMPLIED>
<!ELEMENT nextNode (#PCDATA)>
<!ATTLIST nextNode nextNodeId #REQUIRED>
这套组件让流程的定义很符合本地流程的口味。避开activiti24表结构,以及使用上面的笨重感。
二、逻辑层代码链式调用配置,产品基线需要将原属SpringMvc的service层代码链式化。以期达到良好的可伸缩弹性,可修改性、提高代码可读性(service类爆炸)。如下图:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE servers SYSTEM "logic.dtd">
<servers>
<!--新增通知公告表-->
<server serverName="addNotificationServer">
<logic logicName="addNotificationLogic" sort="10"/>
<logic logicName="notificationSetTopLogic" sort="20"/>
<logic logicName="notificationAuthorityRangeLogic" sort="30"/>
<logic logicName="notificationThemeLogic" sort="50"/>
<logic logicName="notificationReceiptLogic" sort="60"/>
<logic logicName="notificationMessageLogic" sort="70"/>
<logic logicName="notificationAreaRangeLogic" sort="80"/>
</server>
<!--编辑通知公告表-->
<server serverName="editNotificationServer">
<logic logicName="editNotificationLogic" sort="10"/>
<logic logicName="notificationSetTopLogic" sort="20"/>
<logic logicName="notificationAuthorityRangeLogic" sort="30"/>
<logic logicName="notificationThemeLogic" sort="50"/>
<logic logicName="notificationReceiptLogic" sort="60"/>
<logic logicName="notificationMessageLogic" sort="70"/>
<logic logicName="notificationAreaRangeLogic" sort="80"/>
</server>
<!--删除通知公告表-->
<server serverName="delNotificationServer">
<logic logicName="delNotificationLogic" sort="10"/>
<logic logicName="notificationAuthorityRangeLogic" sort="20"/>
<logic logicName="notificationThemeLogic" sort="40"/>
<logic logicName="notificationReceiptLogic" sort="50"/>
<logic logicName="notificationMessageLogic" sort="70"/>
<logic logicName="notificationAreaRangeLogic" sort="80"/>
</server>
<!--查找通知公告表-->
<server serverName="findNotificationServer">
<logic logicName="findNotificationLogic" sort="10"/>
</server>
<!--获取通知公告表-->
<server serverName="getNotificationServer">
<logic logicName="getNotificationLogic" sort="10"/>
<logic logicName="notificationAuthorityRangeLogic" sort="30"/>
<logic logicName="notificationThemeLogic" sort="50"/>
<logic logicName="notificationReceiptLogic" sort="60"/>
<logic logicName="notificationMessageLogic" sort="70"/>
<logic logicName="notificationAreaRangeLogic" sort="80"/>
</server>
<server serverName="editNotificationTopServer">
<logic logicName="editNotificationTopLogic" sort="10"/>
</server>
<server serverName="submitDraftNotificationServer">
<logic logicName="submitDraftNotificationLogic" sort="10"/>
</server>
<server serverName="locoyNotificationServer">
<logic logicName="locoyNotificationLogic" sort="10"/>
</server>
</servers>
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT servers (server+)>
<!ELEMENT server (logic+)>
<!ATTLIST server serverName #REQUIRED>
<!ELEMENT logic (#PCDATA)>
<!ATTLIST logic logicName #REQUIRED>
<!ATTLIST logic isUsing isUsing (true|false) true>
<!ATTLIST logic sort CDATA #IMPLIED>
所有service代码会根据sort属性组成一条调用链。二次开发项目可以移除链节点,添加链节点,替换链节点等。
三、全流程发送提醒消息配置,某些流程过种中,需要发送短信、本地消息盒子、待办等信息。通过实践,使用枚举将需要发送的模板、发送消息类型、接收人、占位符配置待元素组件起来效果相当不好。一是可读性级差,二是通用性不强、三是可维护性不佳。模板静态变量很多,加减字段很不方便,阅读代码不直观,如下图:
SUBMIT_ARCHIVE_FILE(ArchiveBusinessCode.SUBMIT_ARCHIVE_FILE, "xxxxxxxxxxxxxxxxxxxxxxxx", submitArchiveFile, text_pending, UserIdLoadName.INITIATIVE_ARCHIVE_OFFICE),
SUBMIT_ARCHIVE_FILE_VERIFY_RESULT(ArchiveBusinessCode.SUBMIT_ARCHIVE_FILE_VERIFY_RESULT, "xxxxxxxxxxxxxxxxxxxxxxxx", submitArchiveFileVerifyResult, text_pending, UserIdLoadName.INITIATIVE_ARCHIVE_OFFICE),
SUBMIT_ARCHIVE_FILE_FEEDBACK(ArchiveBusinessCode.SUBMIT_ARCHIVE_FILE_FEEDBACK, "xxxxxxxxxxxxxxxxxxxxxxxx", submitArchiveFileFeedback, text_box, UserIdLoadName.INITIATIVE_ARCHIVE_OFFICE),
RECEIVE_ARCHIVE_FILE(ArchiveBusinessCode.RECEIVE_ARCHIVE_FILE, "xxxxxxxxxxxxxxxxxxxxxxxx", receiveArchiveFile, text_box, UserIdLoadName.INITIATIVE_REPORT_OFFICE),
RETURN_ARCHIVE_FILE(ArchiveBusinessCode.RETURN_ARCHIVE_FILE, "xxxxxxxxxxxxxxxxxxxxxxxx", returnArchiveFile, text_pending, UserIdLoadName.INITIATIVE_REPORT_OFFICE),
PUBLISH_ARCHIVE_FILE(ArchiveBusinessCode.PUBLISH_ARCHIVE_FILE, xxxxxxxxxxxxxxxxxxxxxxxx", publishArchiveFile, text_pending, UserIdLoadName.INITIATIVE_PUBLISH_OFFICE),
ANSWER_ARCHIVE_REPORT_OFFICE(ArchiveBusinessCode.ANSWER_ARCHIVE_REPORT_OFFICE, "xxxxxxxxxxxxxxxxxxxxxxxx", answerArchiveReportOffice, text_pending, UserIdLoadName.INITIATIVE_REPORT_OFFICE),
RECEIVE_ARCHIVE_PAPER_FILE(ArchiveBusinessCode.RECEIVE_ARCHIVE_PAPER_FILE, "xxxxxxxxxxxxxxxxxxxxxxxx", receiveArchivePaperFile, box, UserIdLoadName.INITIATIVE_ARCHIVE_OFFICE),
CANCEL_ARCHIVE_PAPER_FILE(ArchiveBusinessCode.CANCEL_ARCHIVE_PAPER_FILE, "xxxxxxxxxxxxxxxxxxxxxxxx", cancelArchivePaperFile, text_box, UserIdLoadName.INITIATIVE_REPORT_OFFICE),
// 被动审查
PUBLISH_ARCHIVE_PASSIVE(ArchiveBusinessCode.PUBLISH_ARCHIVE_PASSIVE, "xxxxxxxxxxxxxxxxxxxxxxxx", publishArchivePassive, text_pending, UserIdLoadName.PASSIVE_PUBLISH_OFFICE),
SUBMIT_ARCHIVE_PASSIVE_SUGGEST(ArchiveBusinessCode.SUBMIT_ARCHIVE_PASSIVE_SUGGEST, "xxxxxxxxxxxxxxxxxxxxxxxx", submitArchivePassiveSuggest, text_pending, UserIdLoadName.PASSIVE_WORKER_ROLE),
RECEIVE_ARCHIVE_PASSIVE_SUGGEST(ArchiveBusinessCode.RECEIVE_ARCHIVE_PASSIVE_SUGGEST, "xxxxxxxxxxxxxxxxxxxxxxxx", receiveArchivePassiveSuggest, text_box, UserIdLoadName.PASSIVE_CREATE),
RETURN_ARCHIVE_PASSIVE_SUGGEST(ArchiveBusinessCode.RETURN_ARCHIVE_PASSIVE_SUGGEST, "xxxxxxxxxxxxxxxxxxxxxxxx", returnArchivePassiveSuggest, text_box, UserIdLoadName.PASSIVE_CREATE),
ANSWER_ARCHIVE_PASSIVE_PERSON_SUGGEST(ArchiveBusinessCode.ANSWER_ARCHIVE_PASSIVE_PERSON_SUGGEST, "xxxxxxxxxxxxxxxxxxxxxxxx", answerArchivePassivePersonSuggest, text_box, UserIdLoadName.PASSIVE_CREATE),
SUBMIT_ARCHIVE_PASSIVE_ASK(ArchiveBusinessCode.SUBMIT_ARCHIVE_PASSIVE_ASK, "xxxxxxxxxxxxxxxxxxxxxxxx", submitArchivePassiveAsk, text_pending, UserIdLoadName.PASSIVE_WORKER_ROLE),
RECEIVE_ARCHIVE_PASSIVE_ASK(ArchiveBusinessCode.RECEIVE_ARCHIVE_PASSIVE_ASK, "xxxxxxxxxxxxxxxxxxxxxxxx", receiveArchivePassiveAsk, text_box, UserIdLoadName.PASSIVE_CREATE),
RETURN_ARCHIVE_PASSIVE_ASK(ArchiveBusinessCode.RETURN_ARCHIVE_PASSIVE_ASK, "xxxxxxxxxxxxxxxxxxxxxxxx", returnArchivePassiveAsk, text_box, UserIdLoadName.PASSIVE_CREATE),
ANSWER_ARCHIVE_PASSIVE_PERSON_ASK(ArchiveBusinessCode.ANSWER_ARCHIVE_PASSIVE_PERSON_ASK, "xxxxxxxxxxxxxxxxxxxxxxxx", answerArchivePassivePersonAsk, text_box, UserIdLoadName.PASSIVE_CREATE),
ANSWER_ARCHIVE_PASSIVE_SUGGEST(ArchiveBusinessCode.ANSWER_ARCHIVE_PASSIVE_SUGGEST, "xxxxxxxxxxxxxxxxxxxxxxxx", answerArchivePassiveSuggest, text_pending, UserIdLoadName.PASSIVE_REPORT_OFFICE),
SUBMIT_ARCHIVE_PASSIVE_VERIFY_RESULT(ArchiveBusinessCode.SUBMIT_ARCHIVE_PASSIVE_VERIFY_RESULT, "xxxxxxxxxxxxxxxxxxxxxxxx", submitArchivePassiveVerifyResult, text_pending, UserIdLoadName.PASSIVE_WORKER_ROLE),
FEEDBACK_ARCHIVE_PASSIVE_OFFICE(ArchiveBusinessCode.FEEDBACK_ARCHIVE_PASSIVE_OFFICE, "xxxxxxxxxxxxxxxxxxxxxxxx", feedbackArchivePassiveOffice, text_box, UserIdLoadName.PASSIVE_WORKER_ROLE),
SUBMIT_ARCHIVE_SPECIAL_RESULT(ArchiveBusinessCode.SUBMIT_ARCHIVE_SPECIAL_RESULT, "xxxxxxxxxxxxxxxxxxxxxxxx", submitArchiveSpecialResult, text_pending, UserIdLoadName.SPECIAL_WORKER_ROLE),
ANSWER_ARCHIVE_SPECIAL_OFFICE(ArchiveBusinessCode.ANSWER_ARCHIVE_SPECIAL_OFFICE, "xxxxxxxxxxxxxxxxxxxxxxxx", answerArchiveSpecialOffice, text_pending, UserIdLoadName.SPECIAL_REPORT_OFFICE),
FEEDBACK_ARCHIVE_SPECIAL_OFFICE(ArchiveBusinessCode.FEEDBACK_ARCHIVE_SPECIAL_OFFICE, "xxxxxxxxxxxxxxxxxxxxxxxx", feedbackArchiveSpecialOffice, text_box, UserIdLoadName.SPECIAL_WORKER_ROLE);
针对以上情况,使用xml技术进行了改进,如下图:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE messasgeDefinition SYSTEM "message.dtd">
<messasgeDefinition>
<message businessCode="addSuggestionMessage" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,box</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="suggestionJoinSubmitUnOpen" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,box</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="suggestionJoinSubmitHasOpen" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,pending</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="suggestionContactVerify" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,box</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="suggestionHasVerify" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="suggestionSubmitSubmiter" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,box</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="suggestionSubmitOffice" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,box</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="suggestionBatchSubmitSubmiter" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,box</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="suggestionBatchSubmitOffice" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,box</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionCountVariableLoader</variableLoader>
</message>
<message businessCode="suggestionDelaySubmitHandler" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,pending</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="suggestionAdjustSubmitHandler" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,pending</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="noPassDelaySubmitHandler" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,box</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="passDelaySubmitHandler" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,box</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="noPassAdjustSubmitHandler" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,box</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="passAdjustSubmitHandler" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,box</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="passAdjustDeleteOffice" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,box</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="passAdjustAddOffice" businessName="xxxxxxxxxxxxxxxxxxxxx">
<templatexxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,box</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="answerSuggestionSubmiter" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,box</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="answerSuggestionUser" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,pending</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="satisfactionHopeHandle" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="noticeHandleOfficeLook" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionCountVariableLoader</variableLoader>
</message>
<message businessCode="noticeHandleOfficeAnswer" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionCountVariableLoader</variableLoader>
</message>
<message businessCode="reHandleSuggestion" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,box</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="applyTraceHandle" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,box</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="passTraceHandleApply" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,box</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="noPassTraceHandleApply" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,box</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
<message businessCode="suggestionOverNotice" businessName="xxxxxxxxxxxxxxxxxxxxx">
<template>xxxxxx{userName}xxxxxxxxxx{suggestionName}xxxxxxxxxxxxxx</template>
<type>text,box</type>
<receiveLoader>suggestionReceiveLoader</receiveLoader>
<variableLoader>suggestionVariableLoader</variableLoader>
</message>
</messasgeDefinition>
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT messasgeDefinition (message+)>
<!ELEMENT message (template,type,receiveLoader,variableLoader)>
<!ATTLIST message businessCode #REQUIRED>
<!ATTLIST message businessName CDATA #REQUIRED>
<!ELEMENT template (#PCDATA)>
<!ELEMENT type (#PCDATA)>
<!ELEMENT receiveLoader (#PCDATA)>
<!ELEMENT variableLoader (#PCDATA)>
配合构建模式的实际发消息代码效果:
// 提醒提交人
SuggestionSender
.of(suggestion)
.code(SuggestionMessageCode.addSuggestionMessage)
.send();
// 提醒审核委
SuggestionSender
.of(suggestion)
.code(SuggestionMessageCode.suggestionContactVerify)
.send();
炫酷的外表往往依靠朴实无华的基础,基础不牢,炫酷的外表也只是绣花枕头。加强基础学习很重要。努力!努力!努力!