Full Code of TaXueWWL/shield-ratelimter for AI

master 117fc7f269cc cached
29 files
154.4 KB
43.5k tokens
12 symbols
1 requests
Download .txt
Repository: TaXueWWL/shield-ratelimter
Branch: master
Commit: 117fc7f269cc
Files: 29
Total size: 154.4 KB

Directory structure:
gitextract_xsb3h930/

├── .gitignore
├── .idea/
│   ├── .name
│   ├── codeStyles/
│   │   └── codeStyleConfig.xml
│   ├── compiler.xml
│   ├── dataSources.local.xml
│   ├── dataSources.xml
│   ├── encodings.xml
│   ├── inspectionProfiles/
│   │   └── Project_Default.xml
│   ├── misc.xml
│   ├── vcs.xml
│   └── workspace.xml
├── CHANGELOG
├── LICENSE
├── README.md
├── pom.xml
├── shield-ratelimiter-core/
│   ├── pom.xml
│   ├── src/
│   │   └── main/
│   │       ├── java/
│   │       │   └── com/
│   │       │       └── snowalker/
│   │       │           └── shield/
│   │       │               └── ratelimiter/
│   │       │                   └── core/
│   │       │                       ├── annotation/
│   │       │                       │   └── RateLimiter.java
│   │       │                       ├── handler/
│   │       │                       │   └── RateLimterHandler.java
│   │       │                       └── redis/
│   │       │                           └── RedisCacheConfig.java
│   │       └── resources/
│   │           ├── application.properties
│   │           └── rateLimter.lua
│   └── target/
│       └── classes/
│           ├── application.properties
│           └── rateLimter.lua
├── shield-ratelimiter.iml
└── shleld-ratelimter-demo/
    ├── pom.xml
    ├── src/
    │   └── main/
    │       ├── java/
    │       │   └── com/
    │       │       └── snowalker/
    │       │           └── ratelimiter/
    │       │               └── demo/
    │       │                   ├── Application.java
    │       │                   └── controller/
    │       │                       └── TestController.java
    │       └── resources/
    │           └── application.properties
    └── target/
        └── classes/
            └── application.properties

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# Compiled class file
*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*


================================================
FILE: .idea/.name
================================================
shieldratelimiter

================================================
FILE: .idea/codeStyles/codeStyleConfig.xml
================================================
<component name="ProjectCodeStyleConfiguration">
  <state>
    <option name="USE_PER_PROJECT_SETTINGS" value="true" />
  </state>
</component>

================================================
FILE: .idea/compiler.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="CompilerConfiguration">
    <annotationProcessing>
      <profile name="Maven default annotation processors profile" enabled="true">
        <sourceOutputDir name="target/generated-sources/annotations" />
        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
        <outputRelativeToContentRoot value="true" />
        <module name="aliyun-acm-util" />
        <module name="customer-api-service" />
        <module name="maccbasecore-facade" />
        <module name="maccbasecore-service" />
        <module name="mfbizcore-facade" />
        <module name="mfbizcore-service" />
        <module name="mopmweb-facade" />
        <module name="mopmweb-service" />
        <module name="mprodbasecore-facade" />
        <module name="mprodbasecore-service" />
        <module name="msg-protocol" />
        <module name="rctmq-spring" />
        <module name="rctmq-spring-demo" />
        <module name="sheild-conf-client-core" />
        <module name="shield-config-manage-ui" />
        <module name="shield-demo-project-single" />
        <module name="shield-message-transaction" />
        <module name="shield-notification-transaction" />
        <module name="shield-ratelimiter-core" />
        <module name="shield-tcc-transaction" />
        <module name="shleld-ratelimter-demo" />
      </profile>
    </annotationProcessing>
    <bytecodeTargetLevel>
      <module name="permission" target="1.5" />
    </bytecodeTargetLevel>
  </component>
</project>

================================================
FILE: .idea/dataSources.local.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="dataSourceStorageLocal">
    <data-source name="zdz-测试" uuid="40715297-6a53-4c3c-85d1-a0c9fb7ddb38">
      <database-info product="" version="" jdbc-version="" driver-name="" driver-version="" family="MYSQL" exact-version="0.0" />
      <secret-storage>master_key</secret-storage>
      <first-sync>true</first-sync>
      <user-name>marketing</user-name>
    </data-source>
  </component>
</project>

================================================
FILE: .idea/dataSources.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="DataSourceManagerImpl" format="xml" multifile-model="true">
    <data-source source="LOCAL" name="zdz-测试" uuid="40715297-6a53-4c3c-85d1-a0c9fb7ddb38">
      <driver-ref>mysql</driver-ref>
      <synchronize>true</synchronize>
      <jdbc-driver>com.mysql.jdbc.Driver</jdbc-driver>
      <jdbc-url>jdbc:mysql://172.30.61.15:3306</jdbc-url>
      <driver-properties>
        <property name="autoReconnect" value="true" />
        <property name="zeroDateTimeBehavior" value="convertToNull" />
        <property name="tinyInt1isBit" value="false" />
        <property name="characterEncoding" value="utf8" />
        <property name="characterSetResults" value="utf8" />
        <property name="yearIsDateType" value="false" />
      </driver-properties>
    </data-source>
  </component>
</project>

================================================
FILE: .idea/encodings.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="Encoding" defaultCharsetForPropertiesFiles="UTF-8">
    <file url="file://$PROJECT_DIR$/../rmqtool-protocol-lib" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/../rmqtool-protocol-lib/aliyun-acm-util" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/../rmqtool-protocol-lib/msg-protocol" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/../rmqtool-protocol-lib/rctmq-spring" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/../rmqtool-protocol-lib/rctmq-spring-demo" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/../sheild-conf-single/sheild-conf-client-core" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/../sheild-conf-single/shield-config-manage-ui" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/../sheild-conf-single/shield-demo-project-single" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/shleld-ratelimter-demo" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/../shield-transaction" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/../shield-transaction/shield-message-transaction" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/../shield-transaction/shield-notification-transaction" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/../shield-transaction/shield-tcc-transaction" charset="UTF-8" />
    <file url="file://D:/snowalker-workspace/0mkt-workspace/customerapiservice" charset="UTF-8" />
    <file url="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore" charset="UTF-8" />
    <file url="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade" charset="UTF-8" />
    <file url="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service" charset="UTF-8" />
    <file url="file://D:/snowalker-workspace/0mkt-workspace/mfbizcore" charset="UTF-8" />
    <file url="file://D:/snowalker-workspace/0mkt-workspace/mfbizcore/mfbizcore-facade" charset="UTF-8" />
    <file url="file://D:/snowalker-workspace/0mkt-workspace/mfbizcore/mfbizcore-service" charset="UTF-8" />
    <file url="file://D:/snowalker-workspace/0mkt-workspace/mopmweb" charset="UTF-8" />
    <file url="file://D:/snowalker-workspace/0mkt-workspace/mopmweb/mopmweb-facade" charset="UTF-8" />
    <file url="file://D:/snowalker-workspace/0mkt-workspace/mopmweb/mopmweb-service" charset="UTF-8" />
    <file url="file://D:/snowalker-workspace/0mkt-workspace/mprodbasecore" charset="UTF-8" />
    <file url="file://D:/snowalker-workspace/0mkt-workspace/mprodbasecore/mprodbasecore-facade" charset="UTF-8" />
    <file url="file://D:/snowalker-workspace/0mkt-workspace/mprodbasecore/mprodbasecore-service" charset="UTF-8" />
  </component>
</project>

================================================
FILE: .idea/inspectionProfiles/Project_Default.xml
================================================
<component name="InspectionProjectProfileManager">
  <profile version="1.0">
    <option name="myName" value="Project Default" />
    <inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
      <option name="TOP_LEVEL_CLASS_OPTIONS">
        <value>
          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
          <option name="REQUIRED_TAGS" value="" />
        </value>
      </option>
      <option name="INNER_CLASS_OPTIONS">
        <value>
          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
          <option name="REQUIRED_TAGS" value="" />
        </value>
      </option>
      <option name="METHOD_OPTIONS">
        <value>
          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
          <option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
        </value>
      </option>
      <option name="FIELD_OPTIONS">
        <value>
          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
          <option name="REQUIRED_TAGS" value="" />
        </value>
      </option>
      <option name="IGNORE_DEPRECATED" value="false" />
      <option name="IGNORE_JAVADOC_PERIOD" value="true" />
      <option name="IGNORE_DUPLICATED_THROWS" value="false" />
      <option name="IGNORE_POINT_TO_ITSELF" value="false" />
      <option name="myAdditionalJavadocTags" value="date" />
    </inspection_tool>
    <inspection_tool class="SerializableHasSerialVersionUIDField" enabled="true" level="WARNING" enabled_by_default="true">
      <option name="ignoreAnonymousInnerClasses" value="false" />
      <option name="superClassString" value="java.awt.Component" />
    </inspection_tool>
  </profile>
</component>

================================================
FILE: .idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ExternalStorageConfigurationManager" enabled="true" />
  <component name="FrameworkDetectionExcludesConfiguration">
    <file type="web" url="file://$USER_HOME$/Documents/Tencent Files/1210812591/FileRecv/Desktop/permission" />
  </component>
  <component name="MavenProjectsManager">
    <option name="originalFiles">
      <list>
        <option value="$PROJECT_DIR$/pom.xml" />
        <option value="$PROJECT_DIR$/../rmqtool-protocol-lib/pom.xml" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/pom.xml" />
        <option value="$USER_HOME$/Downloads/mfbizcore-master-396c4c4b8fa04332ac9c212a1c4220c8b0c3aeaa/pom.xml" />
        <option value="D:/snowalker-workspace/0mkt-workspace/mfbizcore/pom.xml" />
        <option value="D:/snowalker-workspace/0mkt-workspace/mprodbasecore/pom.xml" />
        <option value="D:/snowalker-workspace/0mkt-workspace/mopmweb/pom.xml" />
        <option value="D:/snowalker-workspace/0mkt-workspace/customerapiservice/pom.xml" />
        <option value="$PROJECT_DIR$/../shield-transaction/pom.xml" />
        <option value="$PROJECT_DIR$/../sheild-conf-single/pom.xml" />
      </list>
    </option>
  </component>
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/out" />
  </component>
</project>

================================================
FILE: .idea/vcs.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="VcsDirectoryMappings">
    <mapping directory="$PROJECT_DIR$/../rmqtool-protocol-lib" vcs="Git" />
    <mapping directory="$PROJECT_DIR$/../sheild-conf-single" vcs="Git" />
    <mapping directory="$PROJECT_DIR$" vcs="Git" />
    <mapping directory="D:/snowalker-workspace/0mkt-workspace/customerapiservice" vcs="Git" />
    <mapping directory="D:/snowalker-workspace/0mkt-workspace/maccbasecore" vcs="Git" />
    <mapping directory="D:/snowalker-workspace/0mkt-workspace/mfbizcore" vcs="Git" />
    <mapping directory="D:/snowalker-workspace/0mkt-workspace/mopmweb" vcs="Git" />
    <mapping directory="D:/snowalker-workspace/0mkt-workspace/mprodbasecore" vcs="Git" />
  </component>
</project>

================================================
FILE: .idea/workspace.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="AnalysisUIOptions">
    <option name="GROUP_BY_SEVERITY" value="true" />
  </component>
  <component name="ChangeListManager">
    <list default="true" id="477cdd79-b834-4d18-9f54-0db75fc1fde8" name="Default Changelist" comment="snowalker--添加特殊记账逻辑">
      <change afterPath="$PROJECT_DIR$/.idea/codeStyles/codeStyleConfig.xml" afterDir="false" />
      <change afterPath="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/doc/K8S基础设施搭建.md" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/../sheild-conf-single/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/../sheild-conf-single/pom.xml" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/../sheild-conf-single/shield-conf-single.iml" beforeDir="false" />
      <change beforePath="$PROJECT_DIR$/../sheild-conf-single/shield-config-manage-ui/shield-config-manage-ui.iml" beforeDir="false" />
      <change beforePath="$PROJECT_DIR$/../sheild-conf-single/shield-config-manage-ui/target/classes/templates/shield-conf-auth.html" beforeDir="false" afterPath="$PROJECT_DIR$/../sheild-conf-single/shield-config-manage-ui/target/classes/templates/shield-conf-auth.html" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/../sheild-conf-single/shield-config-manage-ui/target/classes/templates/update-sysconfig.html" beforeDir="false" afterPath="$PROJECT_DIR$/../sheild-conf-single/shield-config-manage-ui/target/classes/templates/update-sysconfig.html" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/../sheild-conf-single/shield-demo-project-single/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/../sheild-conf-single/shield-demo-project-single/pom.xml" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/../sheild-conf-single/shield-demo-project-single/shield-demo-project-single.iml" beforeDir="false" />
      <change beforePath="$PROJECT_DIR$/../sheild-conf-single/shield-demo-project-single/src/main/java/com/conf/test/App.java" beforeDir="false" afterPath="$PROJECT_DIR$/../sheild-conf-single/shield-demo-project-single/src/main/java/com/conf/test/App.java" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/../sheild-conf-single/shield-demo-project-single/src/main/resources/application.properties" beforeDir="false" afterPath="$PROJECT_DIR$/../sheild-conf-single/shield-demo-project-single/src/main/resources/application.properties" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/../sheild-conf-single/shield-demo-project-single/target/classes/application.properties" beforeDir="false" afterPath="$PROJECT_DIR$/../sheild-conf-single/shield-demo-project-single/target/classes/application.properties" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/.idea/compiler.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/compiler.xml" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/.idea/encodings.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/encodings.xml" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/.idea/vcs.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/shield-ratelimiter-core/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/shield-ratelimiter-core/pom.xml" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/shleld-ratelimter-demo/src/main/java/com/snowalker/ratelimiter/demo/controller/TestController.java" beforeDir="false" afterPath="$PROJECT_DIR$/shleld-ratelimter-demo/src/main/java/com/snowalker/ratelimiter/demo/controller/TestController.java" afterDir="false" />
      <change beforePath="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/biz/service/AccountBizServiceFacadeImpl.java" beforeDir="false" afterPath="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/biz/service/AccountBizServiceFacadeImpl.java" afterDir="false" />
      <change beforePath="D:/snowalker-workspace/0mkt-workspace/mopmweb/mopmweb-service/src/main/java/com/gaoyang/marketing/mopmweb/util/EncryptUtil.java" beforeDir="false" afterPath="D:/snowalker-workspace/0mkt-workspace/mopmweb/mopmweb-service/src/main/java/com/gaoyang/marketing/mopmweb/util/EncryptUtil.java" afterDir="false" />
    </list>
    <ignored path="$PROJECT_DIR$/out/" />
    <ignored path="$PROJECT_DIR$/target/" />
    <ignored path="$PROJECT_DIR$/../rmqtool-protocol-lib/target/" />
    <ignored path="$PROJECT_DIR$/../rmqtool-protocol-lib/aliyun-acm-util/target/" />
    <ignored path="D:/snowalker-workspace/0mkt-workspace/maccbasecore/target/" />
    <ignored path="$PROJECT_DIR$/../rmqtool-protocol-lib/msg-protocol/target/" />
    <ignored path="$PROJECT_DIR$/../rmqtool-protocol-lib/rctmq-spring/target/" />
    <ignored path="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/target/" />
    <ignored path="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/target/" />
    <ignored path="$PROJECT_DIR$/../rmqtool-protocol-lib/rctmq-spring-demo/target/" />
    <ignored path="$PROJECT_DIR$/shield-ratelimiter-core/target/" />
    <ignored path="$PROJECT_DIR$/shleld-ratelimter-demo/target/" />
    <ignored path="$USER_HOME$/Downloads/mfbizcore-master-396c4c4b8fa04332ac9c212a1c4220c8b0c3aeaa/mfbizcore-service/target/" />
    <ignored path="$USER_HOME$/Downloads/mfbizcore-master-396c4c4b8fa04332ac9c212a1c4220c8b0c3aeaa/mfbizcore-facade/target/" />
    <ignored path="$USER_HOME$/Downloads/mfbizcore-master-396c4c4b8fa04332ac9c212a1c4220c8b0c3aeaa/target/" />
    <ignored path="D:/snowalker-workspace/0mkt-workspace/mfbizcore/target/" />
    <ignored path="D:/snowalker-workspace/0mkt-workspace/mfbizcore/mfbizcore-service/target/" />
    <ignored path="D:/snowalker-workspace/0mkt-workspace/mfbizcore/mfbizcore-facade/target/" />
    <ignored path="D:/snowalker-workspace/0mkt-workspace/mprodbasecore/mprodbasecore-facade/target/" />
    <ignored path="D:/snowalker-workspace/0mkt-workspace/mprodbasecore/target/" />
    <ignored path="D:/snowalker-workspace/0mkt-workspace/mprodbasecore/mprodbasecore-service/target/" />
    <ignored path="D:/snowalker-workspace/0mkt-workspace/mopmweb/target/" />
    <ignored path="D:/snowalker-workspace/0mkt-workspace/mopmweb/mopmweb-facade/target/" />
    <ignored path="D:/snowalker-workspace/0mkt-workspace/mopmweb/mopmweb-service/target/" />
    <ignored path="D:/snowalker-workspace/0mkt-workspace/customerapiservice/target/" />
    <ignored path="$PROJECT_DIR$/../shield-transaction/shield-notification-transaction/target/" />
    <ignored path="$PROJECT_DIR$/../shield-transaction/shield-message-transaction/target/" />
    <ignored path="$PROJECT_DIR$/../shield-transaction/shield-tcc-transaction/target/" />
    <ignored path="$PROJECT_DIR$/../shield-transaction/target/" />
    <ignored path="$PROJECT_DIR$/../sheild-conf-single/target/" />
    <ignored path="$PROJECT_DIR$/../sheild-conf-single/sheild-conf-client-core/target/" />
    <ignored path="$PROJECT_DIR$/../sheild-conf-single/shield-config-manage-ui/target/" />
    <ignored path="$PROJECT_DIR$/../sheild-conf-single/shield-demo-project-single/target/" />
    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
    <option name="SHOW_DIALOG" value="false" />
    <option name="HIGHLIGHT_CONFLICTS" value="true" />
    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
    <option name="LAST_RESOLUTION" value="IGNORE" />
  </component>
  <component name="CodeInsightWorkspaceSettings">
    <option name="optimizeImportsOnTheFly" value="true" />
  </component>
  <component name="CompilerWorkspaceConfiguration">
    <option name="MAKE_PROJECT_ON_SAVE" value="true" />
  </component>
  <component name="CoverageDataManager">
    <SUITE FILE_PATH="coverage/shieldratelimiter$MAccBalanceTests_testAlipayQueryBalance.ic" NAME="MAccBalanceTests.testAlipayQueryBalance Coverage Results" MODIFIED="1543370283268" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="idea" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false">
      <FILTER>com.gaoyang.marketing.maccbasecore.*</FILTER>
    </SUITE>
  </component>
  <component name="DatabaseView">
    <option name="SHOW_INTERMEDIATE" value="true" />
    <option name="GROUP_DATA_SOURCES" value="true" />
    <option name="GROUP_SCHEMA" value="true" />
    <option name="GROUP_CONTENTS" value="false" />
    <option name="SORT_POSITIONED" value="false" />
    <option name="SHOW_EMPTY_GROUPS" value="false" />
    <option name="AUTO_SCROLL_FROM_SOURCE" value="false" />
    <option name="HIDDEN_KINDS">
      <set />
    </option>
    <expand />
    <select />
  </component>
  <component name="FUSProjectUsageTrigger">
    <session id="-709546611">
      <usages-collector id="statistics.lifecycle.project">
        <counts>
          <entry key="project.closed" value="27" />
          <entry key="project.open.time.118" value="1" />
          <entry key="project.open.time.12" value="4" />
          <entry key="project.open.time.13" value="6" />
          <entry key="project.open.time.14" value="7" />
          <entry key="project.open.time.15" value="8" />
          <entry key="project.open.time.16" value="5" />
          <entry key="project.open.time.17" value="7" />
          <entry key="project.open.time.18" value="5" />
          <entry key="project.open.time.19" value="3" />
          <entry key="project.open.time.22" value="1" />
          <entry key="project.open.time.23" value="1" />
          <entry key="project.open.time.24" value="2" />
          <entry key="project.open.time.4" value="1" />
          <entry key="project.open.time.6" value="1" />
          <entry key="project.open.time.9" value="4" />
          <entry key="project.opened" value="56" />
        </counts>
      </usages-collector>
      <usages-collector id="statistics.file.extensions.edit">
        <counts>
          <entry key="CHANGELOG" value="416" />
          <entry key="Dockerfile" value="14" />
          <entry key="IntelliJ Default" value="11" />
          <entry key="gitignore" value="2" />
          <entry key="java" value="30756" />
          <entry key="lua" value="26" />
          <entry key="md" value="4094" />
          <entry key="properties" value="1495" />
          <entry key="sh" value="33" />
          <entry key="sql" value="66" />
          <entry key="txt" value="51" />
          <entry key="xml" value="1206" />
        </counts>
      </usages-collector>
      <usages-collector id="statistics.file.types.edit">
        <counts>
          <entry key="JAVA" value="30756" />
          <entry key="Markdown" value="4094" />
          <entry key="PLAIN_TEXT" value="542" />
          <entry key="Properties" value="1495" />
          <entry key="SQL" value="86" />
          <entry key="Scratch" value="66" />
          <entry key="VTL" value="11" />
          <entry key="XML" value="1120" />
        </counts>
      </usages-collector>
      <usages-collector id="statistics.file.extensions.open">
        <counts>
          <entry key="0-SNAPSHOT" value="1" />
          <entry key="111" value="1" />
          <entry key="15" value="1" />
          <entry key="2" value="1" />
          <entry key="6" value="1" />
          <entry key="8" value="2" />
          <entry key="CHANGELOG" value="4" />
          <entry key="Dockerfile" value="10" />
          <entry key="class" value="32" />
          <entry key="gitignore" value="12" />
          <entry key="java" value="1295" />
          <entry key="lua" value="6" />
          <entry key="md" value="45" />
          <entry key="properties" value="125" />
          <entry key="sh" value="10" />
          <entry key="springboot添加业务探针" value="1" />
          <entry key="sql" value="2" />
          <entry key="xml" value="251" />
          <entry key="xsd" value="1" />
          <entry key="设置gitignore去除多余文件" value="1" />
        </counts>
      </usages-collector>
      <usages-collector id="statistics.file.types.open">
        <counts>
          <entry key="CLASS" value="32" />
          <entry key="JAVA" value="1295" />
          <entry key="Markdown" value="43" />
          <entry key="PLAIN_TEXT" value="47" />
          <entry key="Properties" value="125" />
          <entry key="Scratch" value="2" />
          <entry key="UML" value="6" />
          <entry key="XML" value="252" />
        </counts>
      </usages-collector>
    </session>
  </component>
  <component name="FavoritesManager">
    <favorites_list name="shieldratelimiter" />
  </component>
  <component name="FileEditorManager">
    <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
      <file pinned="false" current-in-tab="false">
        <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/biz/service/AccountBizServiceFacadeImpl.java">
          <provider selected="true" editor-type-id="text-editor">
            <state relative-caret-position="6935">
              <caret line="473" column="34" selection-start-line="473" selection-start-column="34" selection-end-line="473" selection-end-column="34" />
              <folding>
                <element signature="imports" expanded="true" />
              </folding>
            </state>
          </provider>
        </entry>
      </file>
      <file pinned="false" current-in-tab="true">
        <entry file="file://$PROJECT_DIR$/shleld-ratelimter-demo/src/main/java/com/snowalker/ratelimiter/demo/controller/TestController.java">
          <provider selected="true" editor-type-id="text-editor">
            <state relative-caret-position="169">
              <caret line="26" column="63" selection-start-line="26" selection-start-column="63" selection-end-line="26" selection-end-column="63" />
            </state>
          </provider>
        </entry>
      </file>
      <file pinned="false" current-in-tab="false">
        <entry file="file://$PROJECT_DIR$/shleld-ratelimter-demo/src/main/java/com/snowalker/ratelimiter/demo/Application.java">
          <provider selected="true" editor-type-id="text-editor">
            <state relative-caret-position="269">
              <caret line="24" lean-forward="true" selection-start-line="24" selection-end-line="24" />
            </state>
          </provider>
        </entry>
      </file>
      <file pinned="false" current-in-tab="false">
        <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/biz/service/AccountBalanceBizServiceFacadeImpl.java">
          <provider selected="true" editor-type-id="text-editor">
            <state relative-caret-position="171">
              <caret line="34" column="68" selection-start-line="34" selection-start-column="68" selection-end-line="34" selection-end-column="68" />
            </state>
          </provider>
        </entry>
      </file>
      <file pinned="false" current-in-tab="false">
        <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/src/main/java/com/gaoyang/marketing/maccbasecore/facade/AccountBalanceBizServiceFacade.java">
          <provider selected="true" editor-type-id="text-editor">
            <state relative-caret-position="171">
              <caret line="40" column="77" selection-start-line="40" selection-start-column="77" selection-end-line="40" selection-end-column="77" />
            </state>
          </provider>
        </entry>
      </file>
      <file pinned="false" current-in-tab="false">
        <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/src/main/java/com/gaoyang/marketing/maccbasecore/facade/model/request/QueryAccountBalanceData.java">
          <provider selected="true" editor-type-id="text-editor">
            <state relative-caret-position="304">
              <caret line="16" column="17" selection-start-line="16" selection-start-column="17" selection-end-line="16" selection-end-column="17" />
            </state>
          </provider>
        </entry>
      </file>
    </leaf>
  </component>
  <component name="FileTemplateManagerImpl">
    <option name="RECENT_TEMPLATES">
      <list>
        <option value="AnnotationType" />
        <option value="package-info" />
        <option value="Interface" />
        <option value="Class" />
      </list>
    </option>
  </component>
  <component name="FindInProjectRecents">
    <findStrings>
      <find>用户账户信息查询失败</find>
      <find>queryWebNoticeCrouselBannerList</find>
      <find>queryWebNoticePopupBoxesList</find>
      <find>QueryNoticeInfoListDO</find>
      <find>queryNoticeInfoList</find>
      <find>insertPrizeInfo</find>
      <find>queryPrizeInfoList</find>
      <find>balanceCurTotal</find>
      <find>queryChargedAccBalanceRecord</find>
      <find>e.printStackTrace()</find>
      <find>createNoticeInfo</find>
      <find>addChargeAccountBalance</find>
      <find>accCurrBalance</find>
      <find>updateSpecialChargeAccount</find>
      <find>冲正</find>
      <find>needRollbackTradeAmount</find>
      <find>balanceLast</find>
      <find>tradeAmountReal</find>
      <find>ProductTypeInfoModel</find>
      <find>ProductInfoBizServiceImpl</find>
      <find>queryAllBalanceRecordList</find>
      <find>清零</find>
      <find>version</find>
      <find>chargeAccountData.getExtMsg()</find>
      <find>extMsg</find>
      <find>queryAccountBalanceListData</find>
      <find>ChargeNotifyLocalModel</find>
      <find>SpecialChargeLocalModel</find>
      <find>rulerChargeUtils</find>
      <find>chargeExtMsg</find>
    </findStrings>
    <replaceStrings>
      <replace>isBlank</replace>
      <replace>queryNoticeInfoListData</replace>
      <replace>OutQueryNoticeInfoModel</replace>
      <replace>CreateNoticeInfoData</replace>
      <replace>UpdateNoticeInfoData</replace>
      <replace>OutCreateNoticeInfoModel</replace>
      <replace>OutUpdateNoticeInfoModel</replace>
      <replace>CreateNoticeInfoDO</replace>
      <replace>CreateNoticeInfoDobj</replace>
      <replace>QueryNoticeInfoListDO</replace>
      <replace>QueryNoticeInfoDobj</replace>
      <replace>getNextValueByAscLong</replace>
      <replace>ChargeNotifyAcmConfig</replace>
      <replace>SpecialChargeAcmConfig</replace>
    </replaceStrings>
    <dirStrings>
      <dir>D:\snowalker-workspace\0mkt-workspace\maccbasecore\maccbasecore-service</dir>
      <dir>D:\snowalker-workspace\0mkt-workspace\mfbizcore</dir>
      <dir>D:\snowalker-workspace\0mkt-workspace\maccbasecore</dir>
    </dirStrings>
  </component>
  <component name="Git.Settings">
    <option name="ROOT_SYNC" value="DONT_SYNC" />
    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
  </component>
  <component name="HighlightingSettingsPerFile">
    <setting file="file://D:/snowalker-workspace/0mkt-workspace/mprodbasecore/mprodbasecore-service/src/test/java/com/gaoyang/marketing/mprodbasecore/ZhouzhouLingTests.java" root0="FORCE_HIGHLIGHTING" />
    <setting file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/src/main/java/com/gaoyang/marketing/maccbasecore/facade/AccountBalanceBizServiceFacade.java" root0="FORCE_HIGHLIGHTING" />
  </component>
  <component name="IdeDocumentHistory">
    <option name="CHANGED_PATHS">
      <list>
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/core/service/AccBalanceBizService.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/dal/impl/AccountBalanceDaoImpl.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/dal/AccountBalanceDao.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/src/main/java/com/gaoyang/marketing/maccbasecore/facade/enums/AlipayAccBalanceEnum.java" />
        <option value="$APPLICATION_CONFIG_DIR$/consoles/db/40715297-6a53-4c3c-85d1-a0c9fb7ddb38/console.sql" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/enumutil/AlipayAccBalanceEnum.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/dal/dobj/AccountBalanceQueryDobj.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/resources/com/gaoyang/marketing/maccbasecore/common/dal/dobj/xml/AccountBalanceInfoMapping.xml" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/src/main/java/com/gaoyang/marketing/maccbasecore/facade/constant/AccBalanceConst.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/resources/maccbasecore/common-config.properties" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/resources/META-INF/maccbasecore/applicationContext-dubbo-service.xml" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/src/main/java/com/gaoyang/marketing/maccbasecore/facade/AccountBizServiceFacade.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/doc/高阳Kubernates部署简介.md" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/util/notify/bean/AccChargeConfigModel.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/util/notify/bean/AccSpecialChargeConfigModel.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/util/notify/bean/AccExtBean.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/util/notify/bean/AccExtEntity.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/util/notify/bean/ChargeNotifyLocalModel.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/util/notify/bean/SpecialChargeLocalModel.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/util/notify/bean/SpecialChargeAcmConfig.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/util/notify/bean/ChargeNotifyAcmConfig.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/util/notify/MessageServer.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/util/notify/AccNotifySender.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/core/service/impl/AccBalanceBizServiceImpl.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/CHANGELOG" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/resources/application-dev.properties" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/resources/application-prod.properties" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/util/config/RulerChargeUtils.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/pom.xml" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/src/main/java/com/gaoyang/marketing/maccbasecore/facade/model/response/OutAlipayAccBalanceModel.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/src/main/java/com/gaoyang/marketing/maccbasecore/facade/model/response/OutAccountBalanceModel.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/src/main/java/com/gaoyang/marketing/maccbasecore/facade/model/request/QueryAccBalanceData.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/src/main/java/com/gaoyang/marketing/maccbasecore/facade/AccountBalanceBizServiceFacade.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/src/main/java/com/gaoyang/marketing/maccbasecore/facade/model/request/QueryAccountBalanceData.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/biz/service/AccountBalanceBizServiceFacadeImpl.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/test/java/com/gaoyang/marketing/maccbasecore/MAccBalanceTests.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/README.md" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/pom.xml" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/src/main/java/com/gaoyang/marketing/maccbasecore/facade/model/AccExtEntity.java" />
        <option value="$PROJECT_DIR$/../rmqtool-protocol-lib/rctmq-spring-demo/src/main/java/com/snowalker/executor/rmqtest/MQSenderController.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/test/java/com/gaoyang/marketing/maccbasecore/MAccBaseCoreAppTests.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/src/main/java/com/gaoyang/marketing/maccbasecore/facade/constant/AccountConst.java" />
        <option value="D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/biz/service/AccountBizServiceFacadeImpl.java" />
        <option value="$PROJECT_DIR$/../rmqtool-protocol-lib/msg-protocol/src/main/java/com/gaoyang/marketing/constant/MsgProtocolConst.java" />
        <option value="$PROJECT_DIR$/../rmqtool-protocol-lib/msg-protocol/src/main/java/com/gaoyang/marketing/constant/MsgEnvConst.java" />
        <option value="$PROJECT_DIR$/../rmqtool-protocol-lib/msg-protocol/src/main/java/com/gaoyang/marketing/protocol/ExchangeVoucherProtocol.java" />
        <option value="$PROJECT_DIR$/../rmqtool-protocol-lib/msg-protocol/src/main/java/com/gaoyang/marketing/MsgProtocolFactory.java" />
        <option value="$PROJECT_DIR$/../rmqtool-protocol-lib/msg-protocol/src/test/java/com/gaoyang/marketing/protocol/TestAccPaymentSuccProtocol.java" />
        <option value="$PROJECT_DIR$/../rmqtool-protocol-lib/msg-protocol/pom.xml" />
        <option value="$PROJECT_DIR$/shield-ratelimiter-core/pom.xml" />
        <option value="$PROJECT_DIR$/shleld-ratelimter-demo/src/main/java/com/snowalker/ratelimiter/demo/controller/TestController.java" />
      </list>
    </option>
  </component>
  <component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
  <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
  <component name="JsGulpfileManager">
    <detection-done>true</detection-done>
    <sorting>DEFINITION_ORDER</sorting>
  </component>
  <component name="MavenImportPreferences">
    <option name="importingSettings">
      <MavenImportingSettings>
        <option name="importAutomatically" value="true" />
      </MavenImportingSettings>
    </option>
  </component>
  <component name="MavenProjectNavigator">
    <treeState>
      <expand>
        <path>
          <item name="" type="16c1761:MavenProjectsStructure$RootNode" />
          <item name="maccbasecore-facade" type="9519ce18:MavenProjectsStructure$ProjectNode" />
        </path>
        <path>
          <item name="" type="16c1761:MavenProjectsStructure$RootNode" />
          <item name="maccbasecore-facade" type="9519ce18:MavenProjectsStructure$ProjectNode" />
          <item name="Lifecycle" type="58874e2:MavenProjectsStructure$LifecycleNode" />
        </path>
        <path>
          <item name="" type="16c1761:MavenProjectsStructure$RootNode" />
          <item name="maccbasecore-parent" type="9519ce18:MavenProjectsStructure$ProjectNode" />
        </path>
        <path>
          <item name="" type="16c1761:MavenProjectsStructure$RootNode" />
          <item name="maccbasecore-parent" type="9519ce18:MavenProjectsStructure$ProjectNode" />
          <item name="Lifecycle" type="58874e2:MavenProjectsStructure$LifecycleNode" />
        </path>
        <path>
          <item name="" type="16c1761:MavenProjectsStructure$RootNode" />
          <item name="msg-protocol" type="9519ce18:MavenProjectsStructure$ProjectNode" />
        </path>
        <path>
          <item name="" type="16c1761:MavenProjectsStructure$RootNode" />
          <item name="msg-protocol" type="9519ce18:MavenProjectsStructure$ProjectNode" />
          <item name="Lifecycle" type="58874e2:MavenProjectsStructure$LifecycleNode" />
        </path>
      </expand>
      <select />
    </treeState>
  </component>
  <component name="ProjectFrameBounds" extendedState="6">
    <option name="x" value="415" />
    <option name="y" value="-10" />
    <option name="width" value="760" />
    <option name="height" value="1325" />
  </component>
  <component name="ProjectInspectionProfilesVisibleTreeState">
    <entry key="Project Default">
      <profile-state>
        <expanded-state>
          <State />
          <State>
            <id>Abstraction issuesJava</id>
          </State>
          <State>
            <id>Ali-Check</id>
          </State>
          <State>
            <id>Android</id>
          </State>
          <State>
            <id>Code style issuesJava</id>
          </State>
          <State>
            <id>Compiler issuesJava</id>
          </State>
          <State>
            <id>CorrectnessLintAndroid</id>
          </State>
          <State>
            <id>FinalizationJava</id>
          </State>
          <State>
            <id>GeneralJavaScript</id>
          </State>
          <State>
            <id>Google Web Toolkit</id>
          </State>
          <State>
            <id>Groovy</id>
          </State>
          <State>
            <id>IconsUsabilityLintAndroid</id>
          </State>
          <State>
            <id>Inheritance issuesJava</id>
          </State>
          <State>
            <id>Internationalization</id>
          </State>
          <State>
            <id>InternationalizationJava</id>
          </State>
          <State>
            <id>InternationalizationLintAndroid</id>
          </State>
          <State>
            <id>J2ME issuesJava</id>
          </State>
          <State>
            <id>JSP</id>
          </State>
          <State>
            <id>Java</id>
          </State>
          <State>
            <id>Java 5Java language level migration aidsJava</id>
          </State>
          <State>
            <id>Java 9Java language level migration aidsJava</id>
          </State>
          <State>
            <id>Java interop issuesKotlin</id>
          </State>
          <State>
            <id>Java language level migration aidsJava</id>
          </State>
          <State>
            <id>JavaBeans issuesJava</id>
          </State>
          <State>
            <id>JavaScript</id>
          </State>
          <State>
            <id>Kotlin</id>
          </State>
          <State>
            <id>LintAndroid</id>
          </State>
          <State>
            <id>Numeric issuesJava</id>
          </State>
          <State>
            <id>OtherGroovy</id>
          </State>
          <State>
            <id>PerformanceJava</id>
          </State>
          <State>
            <id>PerformanceLintAndroid</id>
          </State>
          <State>
            <id>Probable bugsJava</id>
          </State>
          <State>
            <id>Probable bugsKotlin</id>
          </State>
          <State>
            <id>SecurityJava</id>
          </State>
          <State>
            <id>SecurityLintAndroid</id>
          </State>
          <State>
            <id>Serialization issuesJava</id>
          </State>
          <State>
            <id>UsabilityLintAndroid</id>
          </State>
          <State>
            <id>Verbose or redundant code constructsJava</id>
          </State>
          <State>
            <id>WebSocket</id>
          </State>
        </expanded-state>
        <selected-state>
          <State>
            <id>JSP</id>
          </State>
        </selected-state>
      </profile-state>
    </entry>
  </component>
  <component name="ProjectLevelVcsManager" settingsEditedManually="true" />
  <component name="ProjectView">
    <navigator proportions="" version="1">
      <foldersAlwaysOnTop value="true" />
    </navigator>
    <panes>
      <pane id="PackagesPane" />
      <pane id="ProjectPane">
        <subPane>
          <expand>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="service" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="common" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="common" type="462c0819:PsiDirectoryNode" />
              <item name="mq" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="common" type="462c0819:PsiDirectoryNode" />
              <item name="mq" type="462c0819:PsiDirectoryNode" />
              <item name="acccharge" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="common" type="462c0819:PsiDirectoryNode" />
              <item name="util" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="common" type="462c0819:PsiDirectoryNode" />
              <item name="util" type="462c0819:PsiDirectoryNode" />
              <item name="notify" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="common" type="462c0819:PsiDirectoryNode" />
              <item name="util" type="462c0819:PsiDirectoryNode" />
              <item name="notify" type="462c0819:PsiDirectoryNode" />
              <item name="bean" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="core" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="core" type="462c0819:PsiDirectoryNode" />
              <item name="service" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="core" type="462c0819:PsiDirectoryNode" />
              <item name="service" type="462c0819:PsiDirectoryNode" />
              <item name="impl" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="model" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="resources" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="resources" type="462c0819:PsiDirectoryNode" />
              <item name="xml" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="resources" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="test" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="test" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore-service" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="test" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
              <item name="maccbasecore" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="shield-ratelimiter" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="shield-ratelimiter" type="462c0819:PsiDirectoryNode" />
              <item name="shield-ratelimiter-core" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="shield-ratelimiter" type="462c0819:PsiDirectoryNode" />
              <item name="shield-ratelimiter-core" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="shield-ratelimiter" type="462c0819:PsiDirectoryNode" />
              <item name="shield-ratelimiter-core" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="shield-ratelimiter" type="462c0819:PsiDirectoryNode" />
              <item name="shield-ratelimiter-core" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="shield-ratelimiter" type="462c0819:PsiDirectoryNode" />
              <item name="shield-ratelimiter-core" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
              <item name="core" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="shield-ratelimiter" type="462c0819:PsiDirectoryNode" />
              <item name="shield-ratelimiter-core" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="resources" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="shield-ratelimiter" type="462c0819:PsiDirectoryNode" />
              <item name="shleld-ratelimter-demo" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="shield-ratelimiter" type="462c0819:PsiDirectoryNode" />
              <item name="shleld-ratelimter-demo" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="shield-ratelimiter" type="462c0819:PsiDirectoryNode" />
              <item name="shleld-ratelimter-demo" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="shield-ratelimiter" type="462c0819:PsiDirectoryNode" />
              <item name="shleld-ratelimter-demo" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="shield-ratelimiter" type="462c0819:PsiDirectoryNode" />
              <item name="shleld-ratelimter-demo" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
              <item name="demo" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="shield-ratelimiter" type="462c0819:PsiDirectoryNode" />
              <item name="shleld-ratelimter-demo" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
              <item name="demo" type="462c0819:PsiDirectoryNode" />
              <item name="controller" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="shield-ratelimiter" type="462c0819:PsiDirectoryNode" />
              <item name="shleld-ratelimter-demo" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="resources" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="shield-transaction" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="shieldratelimiter" type="b2602c69:ProjectViewProjectNode" />
              <item name="shield-transaction" type="462c0819:PsiDirectoryNode" />
              <item name="shield-message-transaction" type="462c0819:PsiDirectoryNode" />
            </path>
          </expand>
          <select />
        </subPane>
      </pane>
      <pane id="Scope" />
    </panes>
  </component>
  <component name="PropertiesComponent">
    <property name="DatabaseDriversLRU" value="mysql" />
    <property name="RequestMappingsPanelOrder0" value="0" />
    <property name="RequestMappingsPanelOrder1" value="1" />
    <property name="RequestMappingsPanelOrder2" value="2" />
    <property name="RequestMappingsPanelWidth0" value="75" />
    <property name="RequestMappingsPanelWidth1" value="75" />
    <property name="RequestMappingsPanelWidth2" value="75" />
    <property name="SearchEverywhereHistoryKey" value="&#9;FILE&#9;file://D:/snowalker-workspace/0mkt-workspace/mprodbasecore/mprodbasecore-facade/src/main/java/com/gaoyang/marketing/mbasecore/model/request/UpdateNoticeInfoData.java&#10;isEmpty&#9;PSI&#9;JAVA://com.alipay.sofa.common.profile.ArrayUtil#isEmpty" />
    <property name="WebServerToolWindowFactoryState" value="false" />
    <property name="aspect.path.notification.shown" value="true" />
    <property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1543988937784" />
    <property name="database.console.LAST_STATE" value="false" />
    <property name="extract.method.default.visibility" value="private" />
    <property name="last_opened_file_path" value="$PROJECT_DIR$/../sheild-conf-single/pom.xml" />
    <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
    <property name="nodejs_npm_path_reset_for_default_project" value="true" />
    <property name="project.structure.last.edited" value="Problems" />
    <property name="project.structure.proportion" value="0.0" />
    <property name="project.structure.side.proportion" value="0.2" />
    <property name="settings.editor.selected.configurable" value="editing.templates" />
  </component>
  <component name="RecentsManager">
    <key name="MoveClassesOrPackagesDialog.RECENTS_KEY">
      <recent name="com.gaoyang.marketing.mprodbasecore.common.dal.dobj" />
      <recent name="com.gaoyang.marketing.maccbasecore.biz.service" />
    </key>
    <key name="CopyFile.RECENT_KEYS">
      <recent name="D:\snowalker-workspace\0mkt-workspace\maccbasecore\maccbasecore-service\doc" />
      <recent name="D:\snowalker-workspace\0mkt-workspace\customerapiservice" />
      <recent name="D:\snowalker-workspace\0mkt-workspace\customerapiservice\src\main" />
      <recent name="D:\snowalker-workspace\0mkt-workspace\mprodbasecore\mprodbasecore-service\src\main\resources\META-INF\mprodbasecore" />
      <recent name="D:\snowalker-workspace\0mkt-workspace\mprodbasecore\mprodbasecore-service\src\main\resources\com\gaoyang\marketing\mprodbasecore\common\dal\dobj\xml" />
    </key>
    <key name="CopyClassDialog.RECENTS_KEY">
      <recent name="com.gaoyang.marketing.maccbasecore.facade.model" />
      <recent name="com.gaoyang.marketing.maccbasecore.facade.enums" />
      <recent name="com.gaoyang.marketing.maccbasecore.facade.model.request" />
      <recent name="com.gaoyang.marketing.maccbasecore.facade.model.response" />
      <recent name="com.gaoyang.marketing.mprodbasecore" />
    </key>
    <key name="MoveFile.RECENT_KEYS">
      <recent name="D:\snowalker-workspace\0mkt-workspace\mprodbasecore\mprodbasecore-service\src\main\resources\com\gaoyang\marketing\mprodbasecore\common\dal\dobj\xml" />
      <recent name="D:\snowalker-workspace\0mkt-workspace\mprodbasecore\mprodbasecore-service\src\main\resources\com.gaoyang.marketing.mprodbasecore.common.dal.dobj.noticeinfo.xml" />
    </key>
  </component>
  <component name="RunDashboard">
    <option name="configurationTypes">
      <set>
        <option value="SpringBootApplicationConfigurationType" />
      </set>
    </option>
    <option name="ruleStates">
      <list>
        <RuleState>
          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
        </RuleState>
        <RuleState>
          <option name="name" value="StatusDashboardGroupingRule" />
        </RuleState>
      </list>
    </option>
    <option name="contentProportion" value="0.10382514" />
  </component>
  <component name="RunManager" selected="Spring Boot.Application (1)">
    <configuration name="MAccBaseCoreAppTests.testAccBalanceCheckHandler" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
      <module name="maccbasecore-service" />
      <extension name="coverage">
        <pattern>
          <option name="PATTERN" value="com.gaoyang.marketing.maccbasecore.*" />
          <option name="ENABLED" value="true" />
        </pattern>
      </extension>
      <option name="PACKAGE_NAME" value="com.gaoyang.marketing.maccbasecore" />
      <option name="MAIN_CLASS_NAME" value="com.gaoyang.marketing.maccbasecore.MAccBaseCoreAppTests" />
      <option name="METHOD_NAME" value="testAccBalanceCheckHandler" />
      <option name="TEST_OBJECT" value="method" />
      <method v="2">
        <option name="Make" enabled="true" />
      </method>
    </configuration>
    <configuration name="TestAccPaymentSuccProtocol.testMsgProtocolFactory" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
      <module name="msg-protocol" />
      <extension name="coverage">
        <pattern>
          <option name="PATTERN" value="com.gaoyang.marketing.protocol.*" />
          <option name="ENABLED" value="true" />
        </pattern>
      </extension>
      <option name="PACKAGE_NAME" value="com.gaoyang.marketing.protocol" />
      <option name="MAIN_CLASS_NAME" value="com.gaoyang.marketing.protocol.TestAccPaymentSuccProtocol" />
      <option name="METHOD_NAME" value="testMsgProtocolFactory" />
      <option name="TEST_OBJECT" value="method" />
      <method v="2">
        <option name="Make" enabled="true" />
      </method>
    </configuration>
    <configuration name="TestAccPaymentSuccProtocol.testVoucherExchange" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
      <module name="msg-protocol" />
      <extension name="coverage">
        <pattern>
          <option name="PATTERN" value="com.gaoyang.marketing.protocol.*" />
          <option name="ENABLED" value="true" />
        </pattern>
      </extension>
      <option name="PACKAGE_NAME" value="com.gaoyang.marketing.protocol" />
      <option name="MAIN_CLASS_NAME" value="com.gaoyang.marketing.protocol.TestAccPaymentSuccProtocol" />
      <option name="METHOD_NAME" value="testVoucherExchange" />
      <option name="TEST_OBJECT" value="method" />
      <method v="2">
        <option name="Make" enabled="true" />
      </method>
    </configuration>
    <configuration name="App (1)" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
      <module name="mfbizcore-service" />
      <option name="SPRING_BOOT_MAIN_CLASS" value="com.gaoyang.marketing.mfbizcore.App" />
      <method v="2">
        <option name="Make" enabled="true" />
      </method>
    </configuration>
    <configuration name="App (2)" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
      <module name="mprodbasecore-service" />
      <option name="SPRING_BOOT_MAIN_CLASS" value="com.gaoyang.marketing.mprodbasecore.App" />
      <method v="2">
        <option name="Make" enabled="true" />
      </method>
    </configuration>
    <configuration name="App (3)" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
      <module name="shield-demo-project-single" />
      <option name="SPRING_BOOT_MAIN_CLASS" value="com.conf.test.App" />
      <method v="2">
        <option name="Make" enabled="true" />
      </method>
    </configuration>
    <configuration name="App (4)" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
      <module name="customer-api-service" />
      <option name="SPRING_BOOT_MAIN_CLASS" value="com.gaoyang.marketing.customer.App" />
      <method v="2">
        <option name="Make" enabled="true" />
      </method>
    </configuration>
    <configuration name="App" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
      <module name="maccbasecore-service" />
      <option name="SPRING_BOOT_MAIN_CLASS" value="com.gaoyang.marketing.maccbasecore.App" />
      <method v="2">
        <option name="Make" enabled="true" />
      </method>
    </configuration>
    <configuration name="Application (1)" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" temporary="true" nameIsGenerated="true">
      <module name="shleld-ratelimter-demo" />
      <extension name="coverage">
        <pattern>
          <option name="PATTERN" value="com.snowalker.ratelimiter.demo.*" />
          <option name="ENABLED" value="true" />
        </pattern>
      </extension>
      <option name="SPRING_BOOT_MAIN_CLASS" value="com.snowalker.ratelimiter.demo.Application" />
      <method v="2">
        <option name="Make" enabled="true" />
      </method>
    </configuration>
    <configuration name="Application" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" temporary="true" nameIsGenerated="true">
      <module name="rctmq-spring-demo" />
      <extension name="coverage">
        <pattern>
          <option name="PATTERN" value="com.snowalker.*" />
          <option name="ENABLED" value="true" />
        </pattern>
      </extension>
      <option name="SPRING_BOOT_MAIN_CLASS" value="com.snowalker.Application" />
      <additionalParameters>
        <param>
          <option name="enabled" value="true" />
          <option name="name" value="" />
          <option name="value" value="" />
        </param>
        <param>
          <option name="enabled" value="true" />
          <option name="name" value="" />
          <option name="value" value="" />
        </param>
        <param>
          <option name="enabled" value="true" />
          <option name="name" value="" />
          <option name="value" value="" />
        </param>
      </additionalParameters>
      <method v="2">
        <option name="Make" enabled="true" />
      </method>
    </configuration>
    <configuration name="MopmwebServiceApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
      <module name="mopmweb-service" />
      <option name="SPRING_BOOT_MAIN_CLASS" value="com.gaoyang.marketing.mopmweb.MopmwebServiceApplication" />
      <method v="2">
        <option name="Make" enabled="true" />
      </method>
    </configuration>
    <list>
      <item itemvalue="Spring Boot.App" />
      <item itemvalue="Spring Boot.App (1)" />
      <item itemvalue="Spring Boot.App (2)" />
      <item itemvalue="Spring Boot.MopmwebServiceApplication" />
      <item itemvalue="Spring Boot.App (3)" />
      <item itemvalue="Spring Boot.App (4)" />
      <item itemvalue="JUnit.MAccBaseCoreAppTests.testAccBalanceCheckHandler" />
      <item itemvalue="Spring Boot.Application" />
      <item itemvalue="JUnit.TestAccPaymentSuccProtocol.testVoucherExchange" />
      <item itemvalue="JUnit.TestAccPaymentSuccProtocol.testMsgProtocolFactory" />
      <item itemvalue="Spring Boot.Application (1)" />
    </list>
    <recent_temporary>
      <list>
        <item itemvalue="Spring Boot.Application (1)" />
        <item itemvalue="JUnit.TestAccPaymentSuccProtocol.testVoucherExchange" />
        <item itemvalue="JUnit.TestAccPaymentSuccProtocol.testMsgProtocolFactory" />
        <item itemvalue="Spring Boot.Application" />
        <item itemvalue="JUnit.MAccBaseCoreAppTests.testAccBalanceCheckHandler" />
      </list>
    </recent_temporary>
  </component>
  <component name="SpringBeansView">
    <option name="beanDetailsProportion" value="0.3" />
  </component>
  <component name="SvnConfiguration">
    <configuration />
  </component>
  <component name="TaskManager">
    <task active="true" id="Default" summary="Default task">
      <changelist id="477cdd79-b834-4d18-9f54-0db75fc1fde8" name="Default Changelist" comment="" />
      <created>1540572346057</created>
      <option name="number" value="Default" />
      <option name="presentableId" value="Default" />
      <updated>1540572346057</updated>
      <workItem from="1540572350027" duration="7000" />
      <workItem from="1540572387775" duration="8923000" />
      <workItem from="1540610034057" duration="240000" />
      <workItem from="1540652614548" duration="3995000" />
      <workItem from="1540726404590" duration="1170000" />
      <workItem from="1540729484048" duration="64000" />
      <workItem from="1540776698240" duration="4554000" />
      <workItem from="1540785158094" duration="16434000" />
      <workItem from="1540861164306" duration="14150000" />
      <workItem from="1540888647283" duration="393000" />
      <workItem from="1540889065891" duration="9786000" />
      <workItem from="1540947680924" duration="18338000" />
      <workItem from="1541036970551" duration="14106000" />
      <workItem from="1541120966800" duration="16208000" />
      <workItem from="1541225355711" duration="2401000" />
      <workItem from="1541396328808" duration="3901000" />
      <workItem from="1541404660555" duration="4879000" />
      <workItem from="1541466441635" duration="5458000" />
      <workItem from="1541503182652" duration="1754000" />
      <workItem from="1541554818827" duration="19375000" />
      <workItem from="1541602000529" duration="1894000" />
      <workItem from="1541639157191" duration="32967000" />
      <workItem from="1541740352023" duration="30152000" />
      <workItem from="1541833389028" duration="5352000" />
      <workItem from="1541920873260" duration="2555000" />
      <workItem from="1541984386752" duration="16580000" />
      <workItem from="1542024011021" duration="867000" />
      <workItem from="1542073724056" duration="1000000" />
      <workItem from="1542075042578" duration="12469000" />
      <workItem from="1542113737498" duration="5063000" />
      <workItem from="1542252871317" duration="17324000" />
      <workItem from="1542330774066" duration="2339000" />
      <workItem from="1542594467180" duration="9585000" />
      <workItem from="1542676191851" duration="12346000" />
      <workItem from="1542770423568" duration="4296000" />
      <workItem from="1542781697336" duration="129000" />
      <workItem from="1542781876867" duration="13995000" />
      <workItem from="1542848190290" duration="15230000" />
      <workItem from="1542893582079" duration="427000" />
      <workItem from="1542934655451" duration="6452000" />
      <workItem from="1542958380747" duration="5699000" />
      <workItem from="1543028892169" duration="10871000" />
      <workItem from="1543194351072" duration="19449000" />
      <workItem from="1543281042816" duration="18358000" />
      <workItem from="1543316959384" duration="490000" />
      <workItem from="1543370221970" duration="14034000" />
      <workItem from="1543453719039" duration="18820000" />
      <workItem from="1543539108140" duration="9565000" />
      <workItem from="1543677936090" duration="271000" />
      <workItem from="1543737667911" duration="3846000" />
      <workItem from="1543761882006" duration="140000" />
      <workItem from="1543762059901" duration="27000" />
      <workItem from="1543799653349" duration="14163000" />
      <workItem from="1543890955370" duration="9069000" />
      <workItem from="1543971987771" duration="1849000" />
      <workItem from="1543975534312" duration="6317000" />
    </task>
    <task id="LOCAL-00001" summary="snowalker--添加特殊记账逻辑">
      <created>1540814643793</created>
      <option name="number" value="00001" />
      <option name="presentableId" value="LOCAL-00001" />
      <option name="project" value="LOCAL" />
      <updated>1540814643793</updated>
    </task>
    <task id="LOCAL-00002" summary="snowalker--删除多余常量">
      <created>1541988161997</created>
      <option name="number" value="00002" />
      <option name="presentableId" value="LOCAL-00002" />
      <option name="project" value="LOCAL" />
      <updated>1541988161997</updated>
    </task>
    <option name="localTasksCounter" value="3" />
    <servers />
  </component>
  <component name="TestHistory">
    <history-entry file="MAccBaseCoreAppTests_testAccBalanceCheckHandler - 2018.12.03 at 10h 35m 03s.xml">
      <configuration name="MAccBaseCoreAppTests.testAccBalanceCheckHandler" configurationId="JUnit" />
    </history-entry>
    <history-entry file="TestAccPaymentSuccProtocol_testVoucherExchange - 2018.12.05 at 10h 44m 39s.xml">
      <configuration name="TestAccPaymentSuccProtocol.testVoucherExchange" configurationId="JUnit" />
    </history-entry>
    <history-entry file="TestAccPaymentSuccProtocol_testMsgProtocolFactory - 2018.12.05 at 10h 45m 10s.xml">
      <configuration name="TestAccPaymentSuccProtocol.testMsgProtocolFactory" configurationId="JUnit" />
    </history-entry>
    <history-entry file="TestAccPaymentSuccProtocol_testVoucherExchange - 2018.12.05 at 10h 46m 24s.xml">
      <configuration name="TestAccPaymentSuccProtocol.testVoucherExchange" configurationId="JUnit" />
    </history-entry>
    <history-entry file="TestAccPaymentSuccProtocol_testVoucherExchange - 2018.12.05 at 10h 46m 42s.xml">
      <configuration name="TestAccPaymentSuccProtocol.testVoucherExchange" configurationId="JUnit" />
    </history-entry>
    <history-entry file="TestAccPaymentSuccProtocol_testVoucherExchange - 2018.12.05 at 10h 47m 10s.xml">
      <configuration name="TestAccPaymentSuccProtocol.testVoucherExchange" configurationId="JUnit" />
    </history-entry>
    <history-entry file="TestAccPaymentSuccProtocol_testVoucherExchange - 2018.12.05 at 10h 47m 16s.xml">
      <configuration name="TestAccPaymentSuccProtocol.testVoucherExchange" configurationId="JUnit" />
    </history-entry>
    <history-entry file="TestAccPaymentSuccProtocol_testVoucherExchange - 2018.12.05 at 10h 47m 36s.xml">
      <configuration name="TestAccPaymentSuccProtocol.testVoucherExchange" configurationId="JUnit" />
    </history-entry>
    <history-entry file="TestAccPaymentSuccProtocol_testVoucherExchange - 2018.12.05 at 10h 48m 00s.xml">
      <configuration name="TestAccPaymentSuccProtocol.testVoucherExchange" configurationId="JUnit" />
    </history-entry>
    <history-entry file="TestAccPaymentSuccProtocol_testVoucherExchange - 2018.12.05 at 10h 48m 13s.xml">
      <configuration name="TestAccPaymentSuccProtocol.testVoucherExchange" configurationId="JUnit" />
    </history-entry>
  </component>
  <component name="TimeTrackingManager">
    <option name="totallyTimeSpent" value="470126000" />
  </component>
  <component name="TodoView">
    <todo-panel id="selected-file">
      <is-autoscroll-to-source value="true" />
    </todo-panel>
    <todo-panel id="all">
      <are-packages-shown value="true" />
      <is-autoscroll-to-source value="true" />
    </todo-panel>
  </component>
  <component name="ToolWindowManager">
    <frame x="-7" y="-7" width="1550" height="848" extended-state="6" />
    <editor active="true" />
    <layout>
      <window_info content_ui="combo" id="Project" order="0" sideWeight="0.4964706" visible="true" weight="0.24932976" />
      <window_info id="Structure" order="1" sideWeight="0.5035294" side_tool="true" weight="0.28619304" />
      <window_info id="Designer" order="2" />
      <window_info id="Image Layers" order="3" />
      <window_info id="UI Designer" order="4" />
      <window_info id="Capture Tool" order="5" />
      <window_info id="Favorites" order="6" sideWeight="0.5035294" side_tool="true" weight="0.28619304" />
      <window_info id="Web" order="7" side_tool="true" />
      <window_info anchor="bottom" id="Docker" show_stripe_button="false" />
      <window_info anchor="bottom" id="Message" order="0" />
      <window_info anchor="bottom" id="Find" order="1" weight="0.32867134" />
      <window_info active="true" anchor="bottom" id="Run Dashboard" order="2" sideWeight="0.49865952" visible="true" weight="0.6055944" />
      <window_info anchor="bottom" id="Run" order="3" sideWeight="0.49865952" weight="0.4055944" />
      <window_info anchor="bottom" id="Debug" order="4" weight="0.36363637" />
      <window_info anchor="bottom" id="Cvs" order="5" weight="0.25" />
      <window_info anchor="bottom" id="Inspection" order="6" weight="0.4" />
      <window_info anchor="bottom" id="Version Control" order="7" show_stripe_button="false" />
      <window_info anchor="bottom" id="Database Changes" order="8" />
      <window_info anchor="bottom" id="TODO" order="9" weight="0.36923078" />
      <window_info anchor="bottom" id="Statistic" order="10" />
      <window_info anchor="bottom" id="Event Log" order="11" sideWeight="0.5013405" side_tool="true" weight="0.42097902" />
      <window_info anchor="bottom" id="Terminal" order="12" sideWeight="0.49865952" weight="0.3846154" />
      <window_info anchor="bottom" id="Spring" order="13" weight="0.61958045" />
      <window_info anchor="bottom" id="Java Enterprise" order="14" weight="0.32867134" />
      <window_info anchor="bottom" id="Messages" order="15" weight="0.32867134" />
      <window_info anchor="bottom" id="Database Console" order="16" weight="0.5916084" />
      <window_info anchor="bottom" id="Problems" order="17" />
      <window_info anchor="right" id="Bean Validation" order="0" weight="0.3297587" />
      <window_info anchor="right" id="Commander" internal_type="SLIDING" order="1" type="SLIDING" weight="0.4" />
      <window_info anchor="right" id="Maven Projects" order="2" sideWeight="0.4964706" weight="0.14812332" />
      <window_info anchor="right" id="Ant Build" order="3" weight="0.25" />
      <window_info anchor="right" content_ui="combo" id="Hierarchy" order="4" weight="0.25" />
      <window_info anchor="right" id="Palette" order="5" />
      <window_info anchor="right" id="Capture Analysis" order="6" />
      <window_info anchor="right" id="Theme Preview" order="7" />
      <window_info anchor="right" id="Palette&#9;" order="8" />
      <window_info anchor="right" id="Database" order="9" weight="0.3297587" />
      <window_info anchor="right" id="Coverage" order="10" side_tool="true" weight="0.3297587" />
      <window_info anchor="right" x="0" y="0" width="337" height="648" id="Documentation" order="11" sideWeight="0.5035294" side_tool="true" weight="0.14812332" />
    </layout>
    <layout-to-restore>
      <window_info content_ui="combo" id="Project" order="0" sideWeight="0.4964706" visible="true" weight="0.24932976" />
      <window_info id="Structure" order="1" sideWeight="0.5035294" side_tool="true" weight="0.28619304" />
      <window_info id="Designer" order="2" />
      <window_info id="Image Layers" order="3" />
      <window_info id="UI Designer" order="4" />
      <window_info id="Capture Tool" order="5" />
      <window_info id="Favorites" order="6" sideWeight="0.5035294" side_tool="true" weight="0.28619304" />
      <window_info id="Web" order="7" side_tool="true" />
      <window_info anchor="bottom" id="Docker" order="0" show_stripe_button="false" />
      <window_info anchor="bottom" id="Message" order="1" />
      <window_info anchor="bottom" id="Find" order="2" weight="0.32867134" />
      <window_info anchor="bottom" id="Run Dashboard" order="3" sideWeight="0.49865952" weight="0.6685315" />
      <window_info active="true" anchor="bottom" id="Run" order="4" sideWeight="0.49865952" visible="true" weight="0.4055944" />
      <window_info anchor="bottom" id="Debug" order="5" weight="0.36363637" />
      <window_info anchor="bottom" id="Cvs" order="6" weight="0.25" />
      <window_info anchor="bottom" id="Inspection" order="7" weight="0.4" />
      <window_info anchor="bottom" id="Version Control" order="8" show_stripe_button="false" />
      <window_info anchor="bottom" id="Database Changes" order="9" />
      <window_info anchor="bottom" id="TODO" order="10" weight="0.36923078" />
      <window_info anchor="bottom" id="Statistic" order="11" />
      <window_info anchor="bottom" id="Event Log" order="12" sideWeight="0.5013405" side_tool="true" weight="0.42097902" />
      <window_info anchor="bottom" id="Terminal" order="13" sideWeight="0.49865952" weight="0.3846154" />
      <window_info anchor="bottom" id="Spring" order="14" weight="0.61958045" />
      <window_info anchor="bottom" id="Java Enterprise" order="15" weight="0.32867134" />
      <window_info anchor="bottom" id="Messages" order="16" weight="0.32867134" />
      <window_info anchor="bottom" id="Database Console" order="17" weight="0.5916084" />
      <window_info anchor="bottom" id="Problems" order="18" />
      <window_info anchor="right" id="Bean Validation" order="0" weight="0.3297587" />
      <window_info anchor="right" id="Commander" internal_type="SLIDING" order="1" type="SLIDING" weight="0.4" />
      <window_info anchor="right" id="Maven Projects" order="2" sideWeight="0.4964706" weight="0.14812332" />
      <window_info anchor="right" id="Ant Build" order="3" weight="0.25" />
      <window_info anchor="right" content_ui="combo" id="Hierarchy" order="4" weight="0.25" />
      <window_info anchor="right" id="Palette" order="5" />
      <window_info anchor="right" id="Capture Analysis" order="6" />
      <window_info anchor="right" id="Theme Preview" order="7" />
      <window_info anchor="right" id="Palette&#9;" order="8" />
      <window_info anchor="right" id="Database" order="9" weight="0.3297587" />
      <window_info anchor="right" id="Coverage" order="10" side_tool="true" weight="0.3297587" />
      <window_info anchor="right" x="0" y="0" width="337" height="648" id="Documentation" order="11" sideWeight="0.5035294" side_tool="true" weight="0.14812332" />
    </layout-to-restore>
  </component>
  <component name="TypeScriptGeneratedFilesManager">
    <option name="version" value="1" />
  </component>
  <component name="UnknownFeatures">
    <option featureType="com.intellij.fileTypeFactory" implementationName="*.md" />
  </component>
  <component name="VcsContentAnnotationSettings">
    <option name="myLimit" value="2678400000" />
  </component>
  <component name="VcsManagerConfiguration">
    <MESSAGE value="snowalker--添加特殊记账逻辑" />
    <MESSAGE value="snowalker--删除多余常量" />
    <option name="LAST_COMMIT_MESSAGE" value="snowalker--删除多余常量" />
  </component>
  <component name="editorHistoryManager">
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/CHANGELOG">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="893">
          <caret line="47" selection-start-line="47" selection-end-line="47" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/util/notify/bean/AccExtEntity.java" />
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/README.md">
      <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
        <state split_layout="SPLIT">
          <first_editor relative-caret-position="568">
            <caret line="70" selection-start-line="70" selection-end-line="70" />
          </first_editor>
          <second_editor />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/test/java/com/gaoyang/marketing/maccbasecore/MAccBalanceTests.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="156">
          <caret line="339" column="7" selection-start-line="339" selection-start-column="7" selection-end-line="339" selection-end-column="7" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/src/main/java/com/gaoyang/marketing/maccbasecore/facade/model/request/SpecialChargeAccountData.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="551">
          <caret line="38" column="26" lean-forward="true" selection-start-line="15" selection-start-column="2" selection-end-line="38" selection-end-column="26" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/core/service/impl/AccountBizServiceImpl.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="437">
          <caret line="634" column="50" lean-forward="true" selection-start-line="634" selection-start-column="50" selection-end-line="634" selection-end-column="50" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/mq/acccharge/consumer/service/AccChargeSubService.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="221">
          <caret line="29" column="19" selection-start-line="29" selection-start-column="19" selection-end-line="29" selection-end-column="19" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/enumutil/ResponseEnum.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="285">
          <caret line="15" column="4" selection-start-line="15" selection-start-column="4" selection-end-line="15" selection-end-column="4" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/../rmqtool-protocol-lib/rctmq-spring-demo/src/main/java/com/snowalker/executor/rmqtest/MQSenderController.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="-216">
          <caret line="124" column="67" lean-forward="true" selection-start-line="124" selection-start-column="67" selection-end-line="124" selection-end-column="67" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/test/java/com/gaoyang/marketing/maccbasecore/MAccBaseCoreAppTests.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="9633">
          <caret line="548" column="8" selection-start-line="548" selection-start-column="8" selection-end-line="552" selection-end-column="46" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/../rmqtool-protocol-lib/rctmq-spring-demo/src/main/java/com/snowalker/Application.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="380">
          <caret line="28" selection-start-line="28" selection-end-line="28" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/mq/acccharge/AccChargeServer.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="380">
          <caret line="32" column="13" selection-start-line="32" selection-start-column="13" selection-end-line="32" selection-end-column="13" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/mq/acccharge/consumer/listener/AccChargeConsumerListener.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="4408">
          <caret line="260" column="13" selection-start-line="260" selection-start-column="13" selection-end-line="260" selection-end-column="13" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/mq/acccharge/producer/executor/AccChargeLocalServiceExecuter.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="665">
          <caret line="46" column="50" selection-start-line="46" selection-start-column="50" selection-end-line="46" selection-end-column="50" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/src/main/java/com/gaoyang/marketing/maccbasecore/facade/model/AccExtEntity.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="1463">
          <caret line="91" column="20" selection-start-line="91" selection-start-column="20" selection-end-line="91" selection-end-column="20" />
          <folding>
            <element signature="imports" expanded="true" />
          </folding>
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/common/util/config/RulerChargeUtils.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="285">
          <caret line="41" column="31" selection-start-line="41" selection-start-column="31" selection-end-line="41" selection-end-column="31" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/resources/application-dev.properties">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="-855" />
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/resources/maccbasecore/common-config.properties">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="209">
          <caret line="11" column="29" selection-start-line="11" selection-start-column="29" selection-end-line="11" selection-end-column="29" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/doc/K8S基础设施搭建.md">
      <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
        <state split_layout="SPLIT">
          <first_editor relative-caret-position="-139" />
          <second_editor />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/src/main/java/com/gaoyang/marketing/maccbasecore/facade/constant/AccountConst.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="570">
          <caret line="30" column="74" selection-start-line="30" selection-start-column="67" selection-end-line="30" selection-end-column="74" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/run.sh">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="171">
          <caret line="9" selection-start-line="9" selection-end-line="9" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/pom.xml">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="304">
          <caret line="16" column="43" selection-start-line="16" selection-start-column="43" selection-end-line="16" selection-end-column="43" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/doc/高阳Kubernates部署简介.md">
      <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
        <state split_layout="SPLIT">
          <first_editor relative-caret-position="152">
            <caret line="8" column="39" selection-start-line="8" selection-start-column="39" selection-end-line="8" selection-end-column="39" />
          </first_editor>
          <second_editor />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/doc/镜像打包部署.md">
      <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
        <state split_layout="SPLIT">
          <first_editor relative-caret-position="285">
            <caret line="15" column="34" selection-start-line="15" selection-start-column="34" selection-end-line="15" selection-end-column="34" />
          </first_editor>
          <second_editor />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/Dockerfile">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="133">
          <caret line="7" selection-start-line="7" selection-end-line="7" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/../rmqtool-protocol-lib/msg-protocol/src/main/java/com/gaoyang/marketing/protocol/DeliverQueryTaskProtocol.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="171">
          <caret line="20" column="77" lean-forward="true" selection-start-line="20" selection-start-column="38" selection-end-line="20" selection-end-column="77" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/../rmqtool-protocol-lib/msg-protocol/src/main/java/com/gaoyang/marketing/protocol/CreateTradeProtocol.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="57">
          <caret line="23" column="31" selection-start-line="23" selection-start-column="31" selection-end-line="23" selection-end-column="31" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/../rmqtool-protocol-lib/msg-protocol/src/main/java/com/gaoyang/marketing/protocol/ExchangeVoucherProtocol.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="75">
          <caret line="47" column="22" selection-start-line="47" selection-start-column="22" selection-end-line="47" selection-end-column="22" />
          <folding>
            <element signature="imports" expanded="true" />
            <element signature="e#1003#1004#0" expanded="true" />
            <element signature="e#1045#1046#0" expanded="true" />
            <element signature="e#1169#1170#0" expanded="true" />
            <element signature="e#1201#1202#0" expanded="true" />
            <element signature="e#1363#1364#0" expanded="true" />
            <element signature="e#1389#1390#0" expanded="true" />
            <element signature="e#1531#1532#0" expanded="true" />
            <element signature="e#1561#1562#0" expanded="true" />
          </folding>
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/../rmqtool-protocol-lib/msg-protocol/src/main/java/com/gaoyang/marketing/MsgProtocolEntity.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="171">
          <caret line="9" column="13" selection-start-line="9" selection-start-column="13" selection-end-line="9" selection-end-column="13" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/../rmqtool-protocol-lib/msg-protocol/src/main/java/com/gaoyang/marketing/util/MsgProtocolConstUtil.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="203">
          <caret line="25" column="41" selection-start-line="25" selection-start-column="41" selection-end-line="25" selection-end-column="41" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/../rmqtool-protocol-lib/msg-protocol/src/main/java/com/gaoyang/marketing/constant/MsgEnvConst.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="455">
          <caret line="40" column="30" selection-start-line="40" selection-start-column="30" selection-end-line="40" selection-end-column="30" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/../rmqtool-protocol-lib/msg-protocol/src/main/java/com/gaoyang/marketing/constant/MsgProtocolConst.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="399">
          <caret line="72" column="78" selection-start-line="72" selection-start-column="68" selection-end-line="72" selection-end-column="78" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/../rmqtool-protocol-lib/msg-protocol/src/main/java/com/gaoyang/marketing/MsgProtocolFactory.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="531">
          <caret line="79" column="56" selection-start-line="79" selection-start-column="56" selection-end-line="79" selection-end-column="56" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/../rmqtool-protocol-lib/msg-protocol/src/test/java/com/gaoyang/marketing/protocol/TestAccPaymentSuccProtocol.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="2755">
          <caret line="156" selection-start-line="156" selection-end-line="156" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/../rmqtool-protocol-lib/msg-protocol/pom.xml">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="190">
          <caret line="10" selection-start-line="10" selection-end-line="10" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/../rmqtool-protocol-lib/msg-protocol/src/main/java/com/gaoyang/marketing/BaseMsg.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="171">
          <caret line="10" column="22" selection-start-line="10" selection-start-column="22" selection-end-line="10" selection-end-column="22" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/../rmqtool-protocol-lib/msg-protocol/src/main/java/com/gaoyang/marketing/protocol/DeliveryProtocol.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="-57">
          <caret line="20" column="42" selection-start-line="20" selection-start-column="42" selection-end-line="20" selection-end-column="42" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/pom.xml">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="57">
          <caret line="12" selection-start-line="12" selection-end-line="12" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/biz/service/AccountBalanceBizServiceFacadeImpl.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="171">
          <caret line="34" column="68" selection-start-line="34" selection-start-column="68" selection-end-line="34" selection-end-column="68" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/src/main/java/com/gaoyang/marketing/maccbasecore/facade/AccountBalanceBizServiceFacade.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="171">
          <caret line="40" column="77" selection-start-line="40" selection-start-column="77" selection-end-line="40" selection-end-column="77" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/src/main/java/com/gaoyang/marketing/maccbasecore/facade/constant/AccBalanceConst.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="209">
          <caret line="17" column="66" selection-start-line="17" selection-start-column="32" selection-end-line="17" selection-end-column="66" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-facade/src/main/java/com/gaoyang/marketing/maccbasecore/facade/model/request/QueryAccountBalanceData.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="304">
          <caret line="16" column="17" selection-start-line="16" selection-start-column="17" selection-end-line="16" selection-end-column="17" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/shield-ratelimiter-core/pom.xml">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="38">
          <caret line="38" column="20" selection-start-line="38" selection-start-column="20" selection-end-line="38" selection-end-column="20" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/shleld-ratelimter-demo/src/main/java/com/snowalker/ratelimiter/demo/Application.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="269">
          <caret line="24" lean-forward="true" selection-start-line="24" selection-end-line="24" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/shield-ratelimiter-core/src/main/java/com/snowalker/shield/ratelimiter/core/redis/RedisCacheConfig.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="135">
          <caret line="25" column="13" selection-start-line="25" selection-start-column="13" selection-end-line="25" selection-end-column="13" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/shield-ratelimiter-core/src/main/java/com/snowalker/shield/ratelimiter/core/handler/RateLimterHandler.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="1125">
          <caret line="93" column="26" selection-start-line="93" selection-start-column="19" selection-end-line="93" selection-end-column="26" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/shield-ratelimiter-core/src/main/java/com/snowalker/shield/ratelimiter/core/annotation/RateLimiter.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="1">
          <caret line="14" column="18" selection-start-line="14" selection-start-column="18" selection-end-line="14" selection-end-column="18" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/shield-ratelimiter-core/src/main/resources/rateLimter.lua">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="-134">
          <caret line="5" lean-forward="true" selection-start-line="5" selection-end-line="5" />
        </state>
      </provider>
    </entry>
    <entry file="file://D:/snowalker-workspace/0mkt-workspace/maccbasecore/maccbasecore-service/src/main/java/com/gaoyang/marketing/maccbasecore/biz/service/AccountBizServiceFacadeImpl.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="6935">
          <caret line="473" column="34" selection-start-line="473" selection-start-column="34" selection-end-line="473" selection-end-column="34" />
          <folding>
            <element signature="imports" expanded="true" />
          </folding>
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/shleld-ratelimter-demo/src/main/resources/application.properties">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="-114" />
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/shleld-ratelimter-demo/src/main/java/com/snowalker/ratelimiter/demo/controller/TestController.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="169">
          <caret line="26" column="63" selection-start-line="26" selection-start-column="63" selection-end-line="26" selection-end-column="63" />
        </state>
      </provider>
    </entry>
  </component>
  <component name="masterDetails">
    <states>
      <state key="ArtifactsStructureConfigurable.UI">
        <settings>
          <artifact-editor />
          <last-edited>permission:war</last-edited>
          <splitter-proportions>
            <option name="proportions">
              <list>
                <option value="0.2" />
                <option value="0.5" />
              </list>
            </option>
          </splitter-proportions>
        </settings>
      </state>
      <state key="FacetStructureConfigurable.UI">
        <settings>
          <last-edited>Spring (maccbasecore-service)|Spring</last-edited>
          <splitter-proportions>
            <option name="proportions">
              <list>
                <option value="0.2" />
              </list>
            </option>
          </splitter-proportions>
        </settings>
      </state>
      <state key="GlobalLibrariesConfigurable.UI">
        <settings>
          <splitter-proportions>
            <option name="proportions">
              <list>
                <option value="0.2" />
              </list>
            </option>
          </splitter-proportions>
        </settings>
      </state>
      <state key="JdkListConfigurable.UI">
        <settings>
          <last-edited>1.8</last-edited>
          <splitter-proportions>
            <option name="proportions">
              <list>
                <option value="0.2" />
              </list>
            </option>
          </splitter-proportions>
        </settings>
      </state>
      <state key="ModuleStructureConfigurable.UI">
        <settings>
          <last-edited>maccbasecore-service</last-edited>
          <splitter-proportions>
            <option name="proportions">
              <list>
                <option value="0.2" />
                <option value="0.6" />
              </list>
            </option>
          </splitter-proportions>
        </settings>
      </state>
      <state key="ProjectJDKs.UI">
        <settings>
          <last-edited>1.8</last-edited>
          <splitter-proportions>
            <option name="proportions">
              <list>
                <option value="0.2" />
              </list>
            </option>
          </splitter-proportions>
        </settings>
      </state>
      <state key="ProjectLibrariesConfigurable.UI">
        <settings>
          <last-edited>Maven: aopalliance:aopalliance:1.0</last-edited>
          <splitter-proportions>
            <option name="proportions">
              <list>
                <option value="0.2" />
              </list>
            </option>
          </splitter-proportions>
        </settings>
      </state>
    </states>
  </component>
</project>

================================================
FILE: CHANGELOG
================================================
2018-10-29
1. 增加限流提示自定义属性,message(),不填默认为“false”

================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: README.md
================================================
# shield-ratelimiter
> 基于Redis的分布式限流工具包

在分布式领域,我们难免会遇到并发量突增,对后端服务造成高压力,严重甚至会导致系统宕机。为避免这种问题,我们通常会为接口添加限流、降级、熔断等能力,从而使接口更为健壮。Java领域常见的开源组件有Netflix的hystrix,阿里系开源的sentinel等,都是蛮不错的限流熔断框架。

今天我们就基于Redis组件的特性,实现一个分布式限流组件,名字就定为shield-ratelimiter。
<!--more-->
## 原理
首先解释下为何采用Redis作为限流组件的核心。

通俗地讲,假设一个用户(用IP判断)每秒访问某服务接口的次数不能超过10次,那么我们可以在Redis中创建一个键,并设置键的过期时间为60秒。

当一个用户对此服务接口发起一次访问就把键值加1,在单位时间(此处为1s)内当键值增加到10的时候,就禁止访问服务接口。PS:在某种场景中添加访问时间间隔还是很有必要的。我们本次不考虑间隔时间,只关注单位时间内的访问次数。

## 需求
原理已经讲过了,说下需求。
1. 基于Redis的incr及过期机制开发
2. 调用方便,声明式
3. Spring支持


基于上述需求,我们决定基于注解方式进行核心功能开发,基于Spring-boot-starter作为基础环境,从而能够很好的适配Spring环境。

另外,在本次开发中,我们不通过简单的调用Redis的java类库API实现对Redis的incr操作。

原因在于,我们要保证整个限流的操作是原子性的,如果用Java代码去做操作及判断,会有并发问题。这里我决定采用Lua脚本进行核心逻辑的定义。
## 为何使用Lua
在正式开发前,我简单介绍下对Redis的操作中,为何推荐使用Lua脚本。

1. 减少网络开销: 不使用 Lua 的代码需要向 Redis 发送多次请求, 而脚本只需一次即可, 减少网络传输;
2. 原子操作: Redis 将整个脚本作为一个原子执行, 无需担心并发, 也就无需事务;
3. 复用: 脚本会永久保存 Redis 中, 其他客户端可继续使用.

Redis添加了对Lua的支持,能够很好的满足原子性、事务性的支持,让我们免去了很多的异常逻辑处理。对于Lua的语法不是本文的主要内容,感兴趣的可以自行查找资料。
## 正式开发
到这里,我们正式开始手写限流组件的进程。
### 1. 工程定义
项目基于maven构建,主要依赖Spring-boot-starter,我们主要在springboot上进行开发,因此自定义的开发包可以直接依赖下面这个坐标,方便进行包管理。版本号自行选择稳定版。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>1.4.2.RELEASE</version>
        </dependency>
### 2. Redis整合
由于我们是基于Redis进行的限流操作,因此需要整合Redis的类库,上面已经讲到,我们是基于Springboot进行的开发,因此这里可以直接整合RedisTemplate。
#### 2.1 坐标引入
这里我们引入spring-boot-starter-redis的依赖。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-redis</artifactId>
            <version>1.4.2.RELEASE</version>
        </dependency>
#### 2.2 注入CacheManager及RedisTemplate
新建一个Redis的配置类,命名为RedisCacheConfig,使用javaconfig形式注入CacheManager及RedisTemplate。为了操作方便,我们采用了Jackson进行序列化。代码如下

        @Configuration
        @EnableCaching
        public class RedisCacheConfig {

            private static final Logger LOGGER = LoggerFactory.getLogger(RedisCacheConfig.class);

            @Bean
            public CacheManager cacheManager(RedisTemplate<?, ?> redisTemplate) {
                CacheManager cacheManager = new RedisCacheManager(redisTemplate);
                if (LOGGER.isDebugEnabled()) {
                    LOGGER.debug("Springboot Redis cacheManager 加载完成");
                }
                return cacheManager;
            }

            @Bean
            public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
                RedisTemplate<String, Object> template = new RedisTemplate<>();
                template.setConnectionFactory(factory);

                //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
                Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);

                ObjectMapper mapper = new ObjectMapper();
                mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
                mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
                serializer.setObjectMapper(mapper);

                template.setValueSerializer(serializer);
                //使用StringRedisSerializer来序列化和反序列化redis的key值
                template.setKeySerializer(new StringRedisSerializer());
                template.afterPropertiesSet();
                LOGGER.info("Springboot RedisTemplate 加载完成");
                return template;
            }
        }

**注意** 要使用 **@Configuration** 标注此类为一个配置类,当然你可以使用 **@Component**, 但是不推荐,原因在于 **@Component** 注解虽然也可以当作配置类,但是并不会为其生成CGLIB代理Class,而使用**@Configuration**,CGLIB会为其生成代理类,进行性能的提升。

#### 2.3 调用方application.propertie需要增加Redis配置
我们的包开发完毕之后,调用方的application.properties需要进行相关配置如下:

        #单机模式redis
        spring.redis.host=127.0.0.1
        spring.redis.port=6379
        spring.redis.pool.maxActive=8
        spring.redis.pool.maxWait=-1
        spring.redis.pool.maxIdle=8
        spring.redis.pool.minIdle=0
        spring.redis.timeout=10000
        spring.redis.password=

如果有密码的话,配置password即可。

这里为单机配置,如果需要支持哨兵集群,则配置如下,Java代码不需要改动,只需要变动配置即可。**注意** 两种配置不能共存!

        #哨兵集群模式
        # database name
        spring.redis.database=0
        # server password 密码,如果没有设置可不配
        spring.redis.password=
        # pool settings ...池配置
        spring.redis.pool.max-idle=8
        spring.redis.pool.min-idle=0
        spring.redis.pool.max-active=8
        spring.redis.pool.max-wait=-1
        # name of Redis server  哨兵监听的Redis server的名称
        spring.redis.sentinel.master=mymaster
        # comma-separated list of host:port pairs  哨兵的配置列表
        spring.redis.sentinel.nodes=127.0.0.1:26379,127.0.0.1:26479,127.0.0.1:26579


### 3. 定义注解
为了调用方便,我们定义一个名为**RateLimiter** 的注解,内容如下

            /**
            * @author snowalker
            * @version 1.0
            * @date 2018/10/27 1:25
            * @className RateLimiter
            * @desc 限流注解
            */
            @Target(ElementType.METHOD)
            @Retention(RetentionPolicy.RUNTIME)
            @Documented
            public @interface RateLimiter {

                /**
                * 限流key
                * @return
                */
                String key() default "rate:limiter";
                /**
                * 单位时间限制通过请求数
                * @return
                */
                long limit() default 10;

                /**
                * 过期时间,单位秒
                * @return
                */
                long expire() default 1;
            }

该注解明确只用于方法,主要有三个属性。
1. key--表示限流模块名,指定该值用于区分不同应用,不同场景,推荐格式为:应用名:模块名:ip:接口名:方法名
2. limit--表示单位时间允许通过的请求数
3. expire--incr的值的过期时间,业务中表示限流的单位时间。
### 4. 解析注解
定义好注解后,需要开发注解使用的切面,这里我们直接使用aspectj进行切面的开发。先看代码

        @Aspect
        @Component
        public class RateLimterHandler {

            private static final Logger LOGGER = LoggerFactory.getLogger(RateLimterHandler.class);

            @Autowired
            RedisTemplate redisTemplate;

            private DefaultRedisScript<Long> getRedisScript;

            @PostConstruct
            public void init() {
                getRedisScript = new DefaultRedisScript<>();
                getRedisScript.setResultType(Long.class);
                getRedisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("rateLimter.lua")));
                LOGGER.info("RateLimterHandler[分布式限流处理器]脚本加载完成");
            }

这里是注入了RedisTemplate,使用其API进行Lua脚本的调用。

init() 方法在应用启动时会初始化DefaultRedisScript,并加载Lua脚本,方便进行调用。

PS: Lua脚本放置在classpath下,通过ClassPathResource进行加载。


            @Pointcut("@annotation(com.snowalker.shield.ratelimiter.core.annotation.RateLimiter)")
            public void rateLimiter() {}

这里我们定义了一个切点,表示只要注解了 **@RateLimiter** 的方法,均可以触发限流操作。

            @Around("@annotation(rateLimiter)")
            public Object around(ProceedingJoinPoint proceedingJoinPoint, RateLimiter rateLimiter) throws Throwable {
                if (LOGGER.isDebugEnabled()) {
                    LOGGER.debug("RateLimterHandler[分布式限流处理器]开始执行限流操作");
                }
                Signature signature = proceedingJoinPoint.getSignature();
                if (!(signature instanceof MethodSignature)) {
                    throw new IllegalArgumentException("the Annotation @RateLimter must used on method!");
                }
                /**
                * 获取注解参数
                */
                // 限流模块key
                String limitKey = rateLimiter.key();
                Preconditions.checkNotNull(limitKey);
                // 限流阈值
                long limitTimes = rateLimiter.limit();
                // 限流超时时间
                long expireTime = rateLimiter.expire();
                if (LOGGER.isDebugEnabled()) {
                    LOGGER.debug("RateLimterHandler[分布式限流处理器]参数值为-limitTimes={},limitTimeout={}", limitTimes, expireTime);
                }
                /**
                * 执行Lua脚本
                */
                List<String> keyList = new ArrayList();
                // 设置key值为注解中的值
                keyList.add(limitKey);
                /**
                * 调用脚本并执行
                */
                Long result = (Long) redisTemplate.execute(getRedisScript, keyList, expireTime, limitTimes);
                if (result == 0) {
                    String msg = "由于超过单位时间=" + expireTime + "-允许的请求次数=" + limitTimes + "[触发限流]";
                    LOGGER.debug(msg);
                    return "false";
                }
                if (LOGGER.isDebugEnabled()) {
                    LOGGER.debug("RateLimterHandler[分布式限流处理器]限流执行结果-result={},请求[正常]响应", result);
                }
                return proceedingJoinPoint.proceed();
            }
        }

这段代码的逻辑为,获取  **@RateLimiter** 注解配置的属性:key、limit、expire,并通过 **redisTemplate.execute(RedisScript<T> script, List<K> keys, Object... args)** 方法传递给Lua脚本进行限流相关操作,逻辑很清晰。

这里我们定义如果脚本返回状态为0则为触发限流,1表示正常请求。
### 5. Lua脚本
这里是我们整个限流操作的核心,通过执行一个Lua脚本进行限流的操作。脚本内容如下

        --获取KEY
        local key1 = KEYS[1]

        local val = redis.call('incr', key1)
        local ttl = redis.call('ttl', key1)

        --获取ARGV内的参数并打印
        local expire = ARGV[1]
        local times = ARGV[2]

        redis.log(redis.LOG_DEBUG,tostring(times))
        redis.log(redis.LOG_DEBUG,tostring(expire))

        redis.log(redis.LOG_NOTICE, "incr "..key1.." "..val);
        if val == 1 then
            redis.call('expire', key1, tonumber(expire))
        else
            if ttl == -1 then
                redis.call('expire', key1, tonumber(expire))
            end
        end

        if val > tonumber(times) then
            return 0
        end

        return 1

逻辑很通俗,我简单介绍下。

1. 首先脚本获取Java代码中传递而来的要限流的模块的key,不同的模块key值一定不能相同,否则会覆盖!
2. redis.call('incr', key1)对传入的key做incr操作,如果key首次生成,设置超时时间ARGV[1];(初始值为1)
3. ttl是为防止某些key在未设置超时时间并长时间已经存在的情况下做的保护的判断;
4. 每次请求都会做+1操作,当限流的值val大于我们注解的阈值,则返回0表示已经超过请求限制,触发限流。否则为正常请求。

当过期后,又是新的一轮循环,整个过程是一个原子性的操作,能够保证单位时间不会超过我们预设的请求阈值。

到这里我们便可以在项目中进行测试。
## 测试
[demo地址](https://github.com/TaXueWWL/shleld-ratelimter/tree/master/shleld-ratelimter-demo)

这里我贴一下核心代码,我们定义一个接口,并注解    **@RateLimiter(key = "ratedemo:1.0.0", limit = 5, expire = 100)** 表示模块ratedemo:sendPayment:1.0.0 
在100s内允许通过5个请求,这里的参数设置是为了方便看结果。实际中,我们通常会设置1s内允许通过的次数。

        @Controller
        public class TestController {

            private static final Logger LOGGER = LoggerFactory.getLogger(TestController.class);

            @ResponseBody
            @RequestMapping("ratelimiter")
            @RateLimiter(key = "ratedemo:1.0.0", limit = 5, expire = 100)
            public String sendPayment(HttpServletRequest request) throws Exception {

                return "正常请求";
            }

        }

我们通过RestClient请求接口,日志返回如下:

        2018-10-28 00:00:00.602 DEBUG 17364 --- [nio-8888-exec-1] c.s.s.r.core.handler.RateLimterHandler   :
         RateLimterHandler[分布式限流处理器]开始执行限流操作
        2018-10-28 00:00:00.688 DEBUG 17364 --- [nio-8888-exec-1] c.s.s.r.core.handler.RateLimterHandler   :
         RateLimterHandler[分布式限流处理器]限流执行结果-result=1,请求[正常]响应

        2018-10-28 00:00:00.860 DEBUG 17364 --- [nio-8888-exec-3] c.s.s.r.core.handler.RateLimterHandler   :
         RateLimterHandler[分布式限流处理器]开始执行限流操作
        2018-10-28 00:00:01.183 DEBUG 17364 --- [nio-8888-exec-4] c.s.s.r.core.handler.RateLimterHandler   :
         RateLimterHandler[分布式限流处理器]开始执行限流操作
        2018-10-28 00:00:01.520 DEBUG 17364 --- [nio-8888-exec-3] c.s.s.r.core.handler.RateLimterHandler   :
         RateLimterHandler[分布式限流处理器]限流执行结果-result=1,请求[正常]响应
        2018-10-28 00:00:01.521 DEBUG 17364 --- [nio-8888-exec-4] c.s.s.r.core.handler.RateLimterHandler   :
         RateLimterHandler[分布式限流处理器]限流执行结果-result=1,请求[正常]响应

        2018-10-28 00:00:01.557 DEBUG 17364 --- [nio-8888-exec-5] c.s.s.r.core.handler.RateLimterHandler   :
         RateLimterHandler[分布式限流处理器]开始执行限流操作
        2018-10-28 00:00:01.558 DEBUG 17364 --- [nio-8888-exec-5] c.s.s.r.core.handler.RateLimterHandler   :
         RateLimterHandler[分布式限流处理器]限流执行结果-result=1,请求[正常]响应

        2018-10-28 00:00:01.774 DEBUG 17364 --- [nio-8888-exec-7] c.s.s.r.core.handler.RateLimterHandler   :
         RateLimterHandler[分布式限流处理器]开始执行限流操作
        2018-10-28 00:00:02.111 DEBUG 17364 --- [nio-8888-exec-8] c.s.s.r.core.handler.RateLimterHandler   :
         RateLimterHandler[分布式限流处理器]开始
        2018-10-28 00:00:02.169 DEBUG 17364 --- [nio-8888-exec-7] c.s.s.r.core.handler.RateLimterHandler   :
         RateLimterHandler[分布式限流处理器]限流执行结果-result=1,请求[正常]响应

        2018-10-28 00:00:02.169 DEBUG 17364 --- [nio-8888-exec-8] c.s.s.r.core.handler.RateLimterHandler   :
         由于超过单位时间=100-允许的请求次数=5[触发限流]
        2018-10-28 00:00:02.276 DEBUG 17364 --- [io-8888-exec-10] c.s.s.r.core.handler.RateLimterHandler   :
         RateLimterHandler[分布式限流处理器]开始执行限流操作
        2018-10-28 00:00:02.276 DEBUG 17364 --- [io-8888-exec-10] c.s.s.r.core.handler.RateLimterHandler   :
         RateLimterHandler[分布式限流处理器]参数值为-limitTimes=5,limitTimeout=100
        2018-10-28 00:00:02.278 DEBUG 17364 --- [io-8888-exec-10] c.s.s.r.core.handler.RateLimterHandler   :
         由于超过单位时间=100-允许的请求次数=5[触发限流]
        2018-10-28 00:00:02.445 DEBUG 17364 --- [nio-8888-exec-2] c.s.s.r.core.handler.RateLimterHandler   :
         RateLimterHandler[分布式限流处理器]开始执行限流操作
        2018-10-28 00:00:02.445 DEBUG 17364 --- [nio-8888-exec-2] c.s.s.r.core.handler.RateLimterHandler   :
         RateLimterHandler[分布式限流处理器]参数值为-limitTimes=5,limitTimeout=100
        2018-10-28 00:00:02.446 DEBUG 17364 --- [nio-8888-exec-2] c.s.s.r.core.handler.RateLimterHandler   :
         由于超过单位时间=100-允许的请求次数=5[触发限流]
        2018-10-28 00:00:02.628 DEBUG 17364 --- [nio-8888-exec-4] c.s.s.r.core.handler.RateLimterHandler   :
         RateLimterHandler[分布式限流处理器]开始执行限流操作
        2018-10-28 00:00:02.628 DEBUG 17364 --- [nio-8888-exec-4] c.s.s.r.core.handler.RateLimterHandler   :
         RateLimterHandler[分布式限流处理器]参数值为-limitTimes=5,limitTimeout=100
        2018-10-28 00:00:02.629 DEBUG 17364 --- [nio-8888-exec-4] c.s.s.r.core.handler.RateLimterHandler   :
         由于超过单位时间=100-允许的请求次数=5[触发限流]

根据日志能够看到,正常请求5次后,返回限流触发,说明我们的逻辑生效,对前端而言也是可以看到false标记,表明我们的Lua脚本限流逻辑是正确的,这里具体返回什么标记需要调用方进行明确的定义。

## 总结
我们通过Redis的incr及expire功能特性,开发定义了一套基于注解的分布式限流操作,核心逻辑基于Lua保证了原子性。达到了很好的限流的目的,生产上,可以基于该特点进行定制自己的限流组件,当然你可以参考本文的代码,相信你写的一定比我的demo更好!


================================================
FILE: pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.snowalker</groupId>
    <artifactId>shield-ratelimiter</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>shield-ratelimiter-core</module>
        <module>shleld-ratelimter-demo</module>
    </modules>
    <packaging>pom</packaging>


</project>

================================================
FILE: shield-ratelimiter-core/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>shield-ratelimiter</artifactId>
        <groupId>com.snowalker</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>shield-ratelimiter-core</artifactId>
    <name>shield-ratelimiter-core</name>
    <groupId>com.snowalker</groupId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <spring.boot.version>1.4.2.RELEASE</spring.boot.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>${spring.boot.version}</version>
        </dependency>

        <!--spring缓存支持-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>${spring.boot.version}</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
            <version>${spring.boot.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.7</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>26.0-jre</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.6</version>
        </dependency>

    </dependencies>

</project>

================================================
FILE: shield-ratelimiter-core/src/main/java/com/snowalker/shield/ratelimiter/core/annotation/RateLimiter.java
================================================
package com.snowalker.shield.ratelimiter.core.annotation;

import java.lang.annotation.*;

/**
 * @author snowalker
 * @version 1.0
 * @date 2018/10/27 1:25
 * @className RateLimiter
 * @desc 限流注解
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RateLimiter {

    /**
     * 限流key
     * @return
     */
    String key() default "rate:limiter";
    /**
     * 单位时间限制通过请求数
     * @return
     */
    long limit() default 10;

    /**
     * 过期时间,单位秒
     * @return
     */
    long expire() default 1;

    /**
     * 限流提示语
     * @return
     */
    String message() default "false";
}


================================================
FILE: shield-ratelimiter-core/src/main/java/com/snowalker/shield/ratelimiter/core/handler/RateLimterHandler.java
================================================
package com.snowalker.shield.ratelimiter.core.handler;

import com.google.common.base.Preconditions;
import com.snowalker.shield.ratelimiter.core.annotation.RateLimiter;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.scripting.support.ResourceScriptSource;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;

/**
 * @author snowalker
 * @version 1.0
 * @date 2018/10/27 1:17
 * @className RateLimterHandler
 * @desc 限流处理器
 */
@Aspect
@Component
public class RateLimterHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(RateLimterHandler.class);

    @Autowired
    RedisTemplate redisTemplate;

    private DefaultRedisScript<Long> getRedisScript;

    @PostConstruct
    public void init() {
        getRedisScript = new DefaultRedisScript<>();
        getRedisScript.setResultType(Long.class);
        getRedisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("rateLimter.lua")));
        LOGGER.info("RateLimterHandler[分布式限流处理器]脚本加载完成");
    }

    @Pointcut("@annotation(com.snowalker.shield.ratelimiter.core.annotation.RateLimiter)")
    public void rateLimiter() {}

    @Around("@annotation(rateLimiter)")
    public Object around(ProceedingJoinPoint proceedingJoinPoint, RateLimiter rateLimiter) throws Throwable {
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("RateLimterHandler[分布式限流处理器]开始执行限流操作");
        }
        Signature signature = proceedingJoinPoint.getSignature();
        if (!(signature instanceof MethodSignature)) {
            throw new IllegalArgumentException("the Annotation @RateLimter must used on method!");
        }
        /**
         * 获取注解参数
         */
        // 限流模块key
        String limitKey = rateLimiter.key();
        Preconditions.checkNotNull(limitKey);
        // 限流阈值
        long limitTimes = rateLimiter.limit();
        // 限流超时时间
        long expireTime = rateLimiter.expire();
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("RateLimterHandler[分布式限流处理器]参数值为-limitTimes={},limitTimeout={}", limitTimes, expireTime);
        }
        // 限流提示语
        String message = rateLimiter.message();
        if (StringUtils.isBlank(message)) {
            message = "false";
        }
        /**
         * 执行Lua脚本
         */
        List<String> keyList = new ArrayList();
        // 设置key值为注解中的值
        keyList.add(limitKey);
        /**
         * 调用脚本并执行
         */
        Long result = (Long) redisTemplate.execute(getRedisScript, keyList, expireTime, limitTimes);
        if (result == 0) {
            String msg = "由于超过单位时间=" + expireTime + "-允许的请求次数=" + limitTimes + "[触发限流]";
            LOGGER.debug(msg);
            return message;
        }
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("RateLimterHandler[分布式限流处理器]限流执行结果-result={},请求[正常]响应", result);
        }
        return proceedingJoinPoint.proceed();
    }
}


================================================
FILE: shield-ratelimiter-core/src/main/java/com/snowalker/shield/ratelimiter/core/redis/RedisCacheConfig.java
================================================
package com.snowalker.shield.ratelimiter.core.redis;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @author snowalker
 * @version 1.0
 * @date 2018/10/27 1:15
 * @className RedisCacheConfig
 * @desc Redis配置
 */
@Configuration
@EnableCaching
public class RedisCacheConfig {

    private static final Logger LOGGER = LoggerFactory.getLogger(RedisCacheConfig.class);

    @Bean
    public CacheManager cacheManager(RedisTemplate<?, ?> redisTemplate) {
        CacheManager cacheManager = new RedisCacheManager(redisTemplate);
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("Springboot Redis cacheManager 加载完成");
        }
        return cacheManager;
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(mapper);

        template.setValueSerializer(serializer);
        //使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
        template.afterPropertiesSet();
        LOGGER.info("Springboot RedisTemplate 加载完成");
        return template;
    }
}

================================================
FILE: shield-ratelimiter-core/src/main/resources/application.properties
================================================
#redis
spring.redis.hostName=127.0.0.1
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.pool.maxActive=8
spring.redis.pool.maxWait=-1
spring.redis.pool.maxIdle=8
spring.redis.pool.minIdle=0
spring.redis.timeout=10000
spring.redis.password=

logging.path=D:/log/maccbasecore


================================================
FILE: shield-ratelimiter-core/src/main/resources/rateLimter.lua
================================================
--获取KEY
local key1 = KEYS[1]

local val = redis.call('incr', key1)
local ttl = redis.call('ttl', key1)

--获取ARGV内的参数并打印
local expire = ARGV[1]
local times = ARGV[2]

redis.log(redis.LOG_DEBUG,tostring(times))
redis.log(redis.LOG_DEBUG,tostring(expire))

redis.log(redis.LOG_NOTICE, "incr "..key1.." "..val);
if val == 1 then
    redis.call('expire', key1, tonumber(expire))
else
    if ttl == -1 then
        redis.call('expire', key1, tonumber(expire))
    end
end

if val > tonumber(times) then
    return 0
end

return 1

================================================
FILE: shield-ratelimiter-core/target/classes/application.properties
================================================
#redis
spring.redis.hostName=127.0.0.1
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.pool.maxActive=8
spring.redis.pool.maxWait=-1
spring.redis.pool.maxIdle=8
spring.redis.pool.minIdle=0
spring.redis.timeout=10000
spring.redis.password=

logging.path=D:/log/maccbasecore


================================================
FILE: shield-ratelimiter-core/target/classes/rateLimter.lua
================================================
--获取KEY
local key1 = KEYS[1]

local val = redis.call('incr', key1)
local ttl = redis.call('ttl', key1)

--获取ARGV内的参数并打印
local expire = ARGV[1]
local times = ARGV[2]

redis.log(redis.LOG_DEBUG,tostring(times))
redis.log(redis.LOG_DEBUG,tostring(expire))

redis.log(redis.LOG_NOTICE, "incr "..key1.." "..val);
if val == 1 then
    redis.call('expire', key1, tonumber(expire))
else
    if ttl == -1 then
        redis.call('expire', key1, tonumber(expire))
    end
end

if val > tonumber(times) then
    return 0
end

return 1

================================================
FILE: shield-ratelimiter.iml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4" />

================================================
FILE: shleld-ratelimter-demo/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>shleld-ratelimter-demo</artifactId>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <artifactId>shield-ratelimiter-core</artifactId>
            <groupId>com.snowalker</groupId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

================================================
FILE: shleld-ratelimter-demo/src/main/java/com/snowalker/ratelimiter/demo/Application.java
================================================
package com.snowalker.ratelimiter.demo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableScheduling
@SpringBootApplication
@ComponentScan(basePackages = {"com.snowalker"})
public class Application {

	private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);


	public static void main(String[] args) throws Exception {
		ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
	}


}


================================================
FILE: shleld-ratelimter-demo/src/main/java/com/snowalker/ratelimiter/demo/controller/TestController.java
================================================
package com.snowalker.ratelimiter.demo.controller;

import com.snowalker.shield.ratelimiter.core.annotation.RateLimiter;
import org.apache.catalina.servlet4preview.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author snowalker
 * @version 1.0
 * @date 2018/10/27 2:13
 * @className
 * @desc
 */
@Controller
public class TestController {

    private static final Logger LOGGER = LoggerFactory.getLogger(TestController.class);

    private static final String MESSAGE = "{\"code\":\"400\",\"msg\":\"FAIL\",\"desc\":\"触发限流\"}";

    @ResponseBody
    @RequestMapping("ratelimiter")
    @RateLimiter(key = "ratedemo:1.0.0", limit = 5, expire = 10, message = MESSAGE)
    public String sendPayment(HttpServletRequest request) throws Exception {

        return "正常请求";
    }

    @ResponseBody
    @RequestMapping("ratelimiter1")
    @RateLimiter(key = "ratedemo:1.0.1", limit = 5, expire = 10, message = MESSAGE)
    public String sendPayment1(HttpServletRequest request) throws Exception {

        return "正常请求";
    }
}


================================================
FILE: shleld-ratelimter-demo/src/main/resources/application.properties
================================================
#redis
spring.redis.hostName=127.0.0.1
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.pool.maxActive=8
spring.redis.pool.maxWait=-1
spring.redis.pool.maxIdle=8
spring.redis.pool.minIdle=0
spring.redis.timeout=10000
spring.redis.password=

logging.path=D:/log/ratelimiter
logging.level.com.snowalker=DEBUG
server.port=8888


================================================
FILE: shleld-ratelimter-demo/target/classes/application.properties
================================================
#redis
spring.redis.hostName=127.0.0.1
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.pool.maxActive=8
spring.redis.pool.maxWait=-1
spring.redis.pool.maxIdle=8
spring.redis.pool.minIdle=0
spring.redis.timeout=10000
spring.redis.password=

logging.path=D:/log/ratelimiter
logging.level.com.snowalker=DEBUG
server.port=8888
Download .txt
gitextract_xsb3h930/

├── .gitignore
├── .idea/
│   ├── .name
│   ├── codeStyles/
│   │   └── codeStyleConfig.xml
│   ├── compiler.xml
│   ├── dataSources.local.xml
│   ├── dataSources.xml
│   ├── encodings.xml
│   ├── inspectionProfiles/
│   │   └── Project_Default.xml
│   ├── misc.xml
│   ├── vcs.xml
│   └── workspace.xml
├── CHANGELOG
├── LICENSE
├── README.md
├── pom.xml
├── shield-ratelimiter-core/
│   ├── pom.xml
│   ├── src/
│   │   └── main/
│   │       ├── java/
│   │       │   └── com/
│   │       │       └── snowalker/
│   │       │           └── shield/
│   │       │               └── ratelimiter/
│   │       │                   └── core/
│   │       │                       ├── annotation/
│   │       │                       │   └── RateLimiter.java
│   │       │                       ├── handler/
│   │       │                       │   └── RateLimterHandler.java
│   │       │                       └── redis/
│   │       │                           └── RedisCacheConfig.java
│   │       └── resources/
│   │           ├── application.properties
│   │           └── rateLimter.lua
│   └── target/
│       └── classes/
│           ├── application.properties
│           └── rateLimter.lua
├── shield-ratelimiter.iml
└── shleld-ratelimter-demo/
    ├── pom.xml
    ├── src/
    │   └── main/
    │       ├── java/
    │       │   └── com/
    │       │       └── snowalker/
    │       │           └── ratelimiter/
    │       │               └── demo/
    │       │                   ├── Application.java
    │       │                   └── controller/
    │       │                       └── TestController.java
    │       └── resources/
    │           └── application.properties
    └── target/
        └── classes/
            └── application.properties
Download .txt
SYMBOL INDEX (12 symbols across 4 files)

FILE: shield-ratelimiter-core/src/main/java/com/snowalker/shield/ratelimiter/core/handler/RateLimterHandler.java
  class RateLimterHandler (line 32) | @Aspect
    method init (line 43) | @PostConstruct
    method rateLimiter (line 51) | @Pointcut("@annotation(com.snowalker.shield.ratelimiter.core.annotatio...
    method around (line 54) | @Around("@annotation(rateLimiter)")

FILE: shield-ratelimiter-core/src/main/java/com/snowalker/shield/ratelimiter/core/redis/RedisCacheConfig.java
  class RedisCacheConfig (line 24) | @Configuration
    method cacheManager (line 30) | @Bean
    method redisTemplate (line 39) | @Bean

FILE: shleld-ratelimter-demo/src/main/java/com/snowalker/ratelimiter/demo/Application.java
  class Application (line 11) | @EnableScheduling
    method main (line 19) | public static void main(String[] args) throws Exception {

FILE: shleld-ratelimter-demo/src/main/java/com/snowalker/ratelimiter/demo/controller/TestController.java
  class TestController (line 18) | @Controller
    method sendPayment (line 25) | @ResponseBody
    method sendPayment1 (line 33) | @ResponseBody
Condensed preview — 29 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (174K chars).
[
  {
    "path": ".gitignore",
    "chars": 278,
    "preview": "# Compiled class file\n*.class\n\n# Log file\n*.log\n\n# BlueJ files\n*.ctxt\n\n# Mobile Tools for Java (J2ME)\n.mtj.tmp/\n\n# Packa"
  },
  {
    "path": ".idea/.name",
    "chars": 17,
    "preview": "shieldratelimiter"
  },
  {
    "path": ".idea/codeStyles/codeStyleConfig.xml",
    "chars": 142,
    "preview": "<component name=\"ProjectCodeStyleConfiguration\">\n  <state>\n    <option name=\"USE_PER_PROJECT_SETTINGS\" value=\"true\" />\n "
  },
  {
    "path": ".idea/compiler.xml",
    "chars": 1576,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <annotationP"
  },
  {
    "path": ".idea/dataSources.local.xml",
    "chars": 480,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"dataSourceStorageLocal\">\n    <data-sourc"
  },
  {
    "path": ".idea/dataSources.xml",
    "chars": 875,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"DataSourceManagerImpl\" format=\"xml\" mult"
  },
  {
    "path": ".idea/encodings.xml",
    "chars": 2743,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\" defaultCharsetForPropertiesFil"
  },
  {
    "path": ".idea/inspectionProfiles/Project_Default.xml",
    "chars": 1725,
    "preview": "<component name=\"InspectionProjectProfileManager\">\n  <profile version=\"1.0\">\n    <option name=\"myName\" value=\"Project De"
  },
  {
    "path": ".idea/misc.xml",
    "chars": 1460,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ExternalStorageConfigurationManager\" ena"
  },
  {
    "path": ".idea/vcs.xml",
    "chars": 774,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping dire"
  },
  {
    "path": ".idea/workspace.xml",
    "chars": 106700,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"AnalysisUIOptions\">\n    <option name=\"GR"
  },
  {
    "path": "CHANGELOG",
    "chars": 48,
    "preview": "2018-10-29\n1. 增加限流提示自定义属性,message(),不填默认为“false”"
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "README.md",
    "chars": 14317,
    "preview": "# shield-ratelimiter\n> 基于Redis的分布式限流工具包\n\n在分布式领域,我们难免会遇到并发量突增,对后端服务造成高压力,严重甚至会导致系统宕机。为避免这种问题,我们通常会为接口添加限流、降级、熔断等能力,从而使接口更"
  },
  {
    "path": "pom.xml",
    "chars": 592,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "shield-ratelimiter-core/pom.xml",
    "chars": 2611,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "shield-ratelimiter-core/src/main/java/com/snowalker/shield/ratelimiter/core/annotation/RateLimiter.java",
    "chars": 636,
    "preview": "package com.snowalker.shield.ratelimiter.core.annotation;\n\nimport java.lang.annotation.*;\n\n/**\n * @author snowalker\n * @"
  },
  {
    "path": "shield-ratelimiter-core/src/main/java/com/snowalker/shield/ratelimiter/core/handler/RateLimterHandler.java",
    "chars": 3551,
    "preview": "package com.snowalker.shield.ratelimiter.core.handler;\n\nimport com.google.common.base.Preconditions;\nimport com.snowalke"
  },
  {
    "path": "shield-ratelimiter-core/src/main/java/com/snowalker/shield/ratelimiter/core/redis/RedisCacheConfig.java",
    "chars": 2355,
    "preview": "package com.snowalker.shield.ratelimiter.core.redis;\nimport com.fasterxml.jackson.annotation.JsonAutoDetect;\nimport com."
  },
  {
    "path": "shield-ratelimiter-core/src/main/resources/application.properties",
    "chars": 289,
    "preview": "#redis\nspring.redis.hostName=127.0.0.1\nspring.redis.host=127.0.0.1\nspring.redis.port=6379\nspring.redis.pool.maxActive=8\n"
  },
  {
    "path": "shield-ratelimiter-core/src/main/resources/rateLimter.lua",
    "chars": 523,
    "preview": "--获取KEY\nlocal key1 = KEYS[1]\n\nlocal val = redis.call('incr', key1)\nlocal ttl = redis.call('ttl', key1)\n\n--获取ARGV内的参数并打印\n"
  },
  {
    "path": "shield-ratelimiter-core/target/classes/application.properties",
    "chars": 289,
    "preview": "#redis\nspring.redis.hostName=127.0.0.1\nspring.redis.host=127.0.0.1\nspring.redis.port=6379\nspring.redis.pool.maxActive=8\n"
  },
  {
    "path": "shield-ratelimiter-core/target/classes/rateLimter.lua",
    "chars": 523,
    "preview": "--获取KEY\nlocal key1 = KEYS[1]\n\nlocal val = redis.call('incr', key1)\nlocal ttl = redis.call('ttl', key1)\n\n--获取ARGV内的参数并打印\n"
  },
  {
    "path": "shield-ratelimiter.iml",
    "chars": 80,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module type=\"JAVA_MODULE\" version=\"4\" />"
  },
  {
    "path": "shleld-ratelimter-demo/pom.xml",
    "chars": 1431,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "shleld-ratelimter-demo/src/main/java/com/snowalker/ratelimiter/demo/Application.java",
    "chars": 773,
    "preview": "package com.snowalker.ratelimiter.demo;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframe"
  },
  {
    "path": "shleld-ratelimter-demo/src/main/java/com/snowalker/ratelimiter/demo/controller/TestController.java",
    "chars": 1239,
    "preview": "package com.snowalker.ratelimiter.demo.controller;\n\nimport com.snowalker.shield.ratelimiter.core.annotation.RateLimiter;"
  },
  {
    "path": "shleld-ratelimter-demo/src/main/resources/application.properties",
    "chars": 339,
    "preview": "#redis\nspring.redis.hostName=127.0.0.1\nspring.redis.host=127.0.0.1\nspring.redis.port=6379\nspring.redis.pool.maxActive=8\n"
  },
  {
    "path": "shleld-ratelimter-demo/target/classes/application.properties",
    "chars": 339,
    "preview": "#redis\nspring.redis.hostName=127.0.0.1\nspring.redis.host=127.0.0.1\nspring.redis.port=6379\nspring.redis.pool.maxActive=8\n"
  }
]

About this extraction

This page contains the full source code of the TaXueWWL/shield-ratelimter GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 29 files (154.4 KB), approximately 43.5k tokens, and a symbol index with 12 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!