XML文件的小众应用

伴随着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();

炫酷的外表往往依靠朴实无华的基础,基础不牢,炫酷的外表也只是绣花枕头。加强基础学习很重要。努力!努力!努力!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值