├── .gitignore
├── LICENSE
├── README.md
├── dk-agent
├── pom.xml
└── src
│ └── main
│ └── java
│ └── cn
│ └── laoshini
│ └── dk
│ ├── agent
│ ├── AgentMain.java
│ ├── AttachProviderPlaceHolder.java
│ ├── DangKangAgent.java
│ └── RuntimeAgentLoader.java
│ └── transform
│ ├── AbstractClassFileModifier.java
│ ├── ClassDefinedWrapper.java
│ ├── DangKangClassFileTransformer.java
│ ├── IClassByteCodeCache.java
│ ├── asm
│ ├── AbstractAsmModifier.java
│ └── package-info.java
│ ├── injection
│ ├── ConfigurableFunctionInjectorProxy.java
│ └── IConfigurableFunctionInjector.java
│ └── javassist
│ ├── AbstractJavassistModifier.java
│ ├── FunctionInjectionModifier.java
│ └── package-info.java
├── dk-autoconfigure
├── pom.xml
└── src
│ └── main
│ └── java
│ └── cn
│ └── laoshini
│ └── dk
│ └── autoconfigure
│ ├── DangKangBasicProperties.java
│ ├── DangKangCacheProperties.java
│ ├── DangKangConfigCenterProperties.java
│ ├── DangKangExternalProperties.java
│ ├── DangKangFunctionProperties.java
│ ├── DangKangGenerateProperties.java
│ ├── DangKangGmProperties.java
│ ├── DangKangIdProperties.java
│ ├── DangKangModuleProperties.java
│ ├── DangKangPairDaoProperties.java
│ └── DangKangRdbProperties.java
├── dk-common
├── pom.xml
└── src
│ └── main
│ └── java
│ └── cn
│ └── laoshini
│ └── dk
│ ├── annotation
│ ├── ConfigurableFunction.java
│ ├── FunctionDependent.java
│ ├── FunctionVariousWays.java
│ ├── Message.java
│ ├── MessageHandle.java
│ └── ResourceHolder.java
│ ├── common
│ ├── IDkApplicationContext.java
│ ├── PropertiesReader.java
│ └── ResourcesHolder.java
│ ├── constant
│ ├── Constants.java
│ ├── GameCodeEnum.java
│ └── LogLabel.java
│ ├── exception
│ ├── BusinessException.java
│ └── DkRuntimeException.java
│ └── util
│ ├── AngleUtil.java
│ ├── ClassUtil.java
│ ├── CollectionUtil.java
│ ├── LogUtil.java
│ ├── Md5Util.java
│ ├── NetUtil.java
│ ├── ReflectUtil.java
│ ├── StringUtil.java
│ ├── TypeUtil.java
│ └── ZlibUtil.java
├── dk-core
├── pom.xml
└── src
│ └── main
│ ├── java
│ └── cn
│ │ └── laoshini
│ │ └── dk
│ │ ├── cache
│ │ ├── CacheContainer.java
│ │ ├── IDkCache.java
│ │ └── impl
│ │ │ └── DkCacheGuavaImpl.java
│ │ ├── common
│ │ ├── DkApplicationContext.java
│ │ ├── DkEnvironment.java
│ │ └── SpringContextHolder.java
│ │ ├── condition
│ │ ├── AbstractSpringCondition.java
│ │ ├── ConditionRecord.java
│ │ ├── ConditionalOnPropertyExists.java
│ │ ├── ConditionalOnPropertyMissing.java
│ │ ├── ConditionalOnPropertyValue.java
│ │ ├── OnPropertyExistsCondition.java
│ │ ├── OnPropertyMissingCondition.java
│ │ ├── OnPropertyValueCondition.java
│ │ └── package-info.java
│ │ ├── constant
│ │ ├── BeanTypeEnum.java
│ │ ├── ConstTableSourceEnum.java
│ │ ├── DBTypeEnum.java
│ │ ├── ExpressionConstant.java
│ │ ├── ExpressionDependEnum.java
│ │ ├── GameConstant.java
│ │ ├── GameServerProtocolEnum.java
│ │ ├── GameServerStatus.java
│ │ ├── GeneratorTypeEnum.java
│ │ ├── HotfixResultEnum.java
│ │ ├── InnerTableNameConst.java
│ │ ├── MessageFormatEnum.java
│ │ ├── ModuleConstant.java
│ │ ├── PropertyKeyConstants.java
│ │ ├── QueryConditionKeyEnum.java
│ │ ├── RoleStatusEnum.java
│ │ ├── ServerType.java
│ │ ├── UseTypeEnum.java
│ │ └── UserStatusEnum.java
│ │ ├── dao
│ │ ├── CsvFileDao.java
│ │ ├── IBasicDao.java
│ │ ├── IDefaultDao.java
│ │ ├── IEntityClassManager.java
│ │ ├── IFileDao.java
│ │ ├── IPairConditional.java
│ │ ├── IPairDbDao.java
│ │ ├── IRelationalDbDao.java
│ │ ├── IRelationalDbDaoManager.java
│ │ ├── JsonFileDao.java
│ │ ├── PreparedStatementSqlBuilder.java
│ │ ├── SqlBuilder.java
│ │ ├── TableKey.java
│ │ ├── TableMapping.java
│ │ ├── package-info.java
│ │ ├── query
│ │ │ └── QueryUtil.java
│ │ └── update
│ │ │ ├── SqlWrapper.java
│ │ │ └── UpdateSqlWrapper.java
│ │ ├── domain
│ │ ├── ExecutorBean.java
│ │ ├── ExecutorMethod.java
│ │ ├── GameServerConfig.java
│ │ ├── GameSubject.java
│ │ ├── HandlerDesc.java
│ │ ├── HandlerExecutorMethod.java
│ │ ├── IntExecutorMethod.java
│ │ └── common
│ │ │ ├── ClassDescriptor.java
│ │ │ ├── HotfixFile.java
│ │ │ └── MethodDescriptor.java
│ │ ├── entity
│ │ ├── HandlerExpDescriptor.java
│ │ └── HotfixRecord.java
│ │ ├── exception
│ │ ├── CacheException.java
│ │ ├── DaoException.java
│ │ ├── JitException.java
│ │ └── MessageException.java
│ │ ├── executor
│ │ ├── AbstractOrderedWorker.java
│ │ ├── IOrderedExecutor.java
│ │ ├── IOrderedExecutorGroup.java
│ │ ├── NonOrderedQueuePoolExecutor.java
│ │ ├── OrderedQueuePool.java
│ │ ├── OrderedQueuePoolExecutor.java
│ │ └── TaskQueue.java
│ │ ├── expression
│ │ ├── BaseExpressionLogic.java
│ │ ├── BaseExpressionProcessor.java
│ │ ├── ExpressionLogicContext.java
│ │ ├── ExpressionLogicFactory.java
│ │ ├── IExpressionLogic.java
│ │ ├── IExpressionProcessor.java
│ │ ├── js
│ │ │ ├── JavaScriptExpressionLogic.java
│ │ │ └── JavaScriptExpressionProcessor.java
│ │ ├── package-info.java
│ │ └── spel
│ │ │ ├── SpelExpressionLogic.java
│ │ │ └── SpelExpressionProcessor.java
│ │ ├── function
│ │ ├── ConfigurableFunctionInjector.java
│ │ ├── Func.java
│ │ ├── FuncContainer.java
│ │ ├── FunctionDependentManager.java
│ │ ├── FunctionHolders.java
│ │ ├── FunctionSupplier.java
│ │ ├── VariousWaysFunctionBean.java
│ │ ├── VariousWaysManager.java
│ │ └── package-info.java
│ │ ├── generator
│ │ ├── id
│ │ │ ├── IIdIncrementer.java
│ │ │ ├── IRoleIdGenerator.java
│ │ │ ├── IUserIdGenerator.java
│ │ │ └── package-info.java
│ │ └── name
│ │ │ ├── INameGenerator.java
│ │ │ └── package-info.java
│ │ ├── jit
│ │ ├── DynamicGenerator.java
│ │ ├── JitClassLoader.java
│ │ ├── compiler
│ │ │ ├── DynamicCompiler.java
│ │ │ └── SpringBootDynamicCompiler.java
│ │ ├── generator
│ │ │ ├── AbstractClassFileGenerator.java
│ │ │ ├── AbstractCustomDtoClassFileGenerator.java
│ │ │ ├── CustomDtoClassFileGenerator.java
│ │ │ ├── HandlerClassFileGenerator.java
│ │ │ ├── IClassFileGenerator.java
│ │ │ └── NettyCustomDtoClassFileGenerator.java
│ │ ├── package-info.java
│ │ └── type
│ │ │ ├── AbstractNumericTypeBean.java
│ │ │ ├── AbstractTypeBean.java
│ │ │ ├── BooleanBean.java
│ │ │ ├── ByteBean.java
│ │ │ ├── CompositeBean.java
│ │ │ ├── CompositeExtendBean.java
│ │ │ ├── DoubleBean.java
│ │ │ ├── HandlerBean.java
│ │ │ ├── ITypeBean.java
│ │ │ ├── IntegerBean.java
│ │ │ ├── ListBean.java
│ │ │ ├── LongBean.java
│ │ │ ├── OrdinaryBean.java
│ │ │ ├── ShortBean.java
│ │ │ ├── StringBean.java
│ │ │ ├── TypeBeanFactory.java
│ │ │ └── TypeBeanRecord.java
│ │ ├── listener
│ │ ├── DkContextEvent.java
│ │ ├── DkEventPublisher.java
│ │ ├── IDkContextListener.java
│ │ ├── PropertyChangedEvent.java
│ │ └── PropertyChangedListener.java
│ │ ├── manager
│ │ ├── DangKangAnnotationProcessor.java
│ │ ├── EntityClassManager.java
│ │ ├── HandlerExpressionManager.java
│ │ ├── HotfixManager.java
│ │ ├── ModuleManager.java
│ │ ├── ResourceHolderManager.java
│ │ ├── SpringBeanManager.java
│ │ └── TypeUseManager.java
│ │ ├── module
│ │ ├── AbstractModuleRegistry.java
│ │ ├── IModuleRegistry.java
│ │ ├── loader
│ │ │ ├── ModuleClassLoader.java
│ │ │ ├── ModuleLoader.java
│ │ │ └── ModuleLoaderContext.java
│ │ ├── package-info.java
│ │ └── registry
│ │ │ ├── AbstractRecoverableModuleRegistry.java
│ │ │ ├── AggregateModuleRegistry.java
│ │ │ ├── ModuleConfigurableFunctionRegistry.java
│ │ │ ├── ModuleEntityClassRegistry.java
│ │ │ ├── ModuleMessageHandlerRegistry.java
│ │ │ ├── ModuleMessageRegistry.java
│ │ │ ├── ModuleResourceHolderRegistry.java
│ │ │ └── ModuleSpringBeanRegistry.java
│ │ ├── monitor
│ │ └── package-info.java
│ │ ├── net
│ │ ├── MessageDtoClassHolder.java
│ │ ├── MessageHandlerHolder.java
│ │ ├── MessageHolder.java
│ │ ├── codec
│ │ │ ├── IByteMessageCodec.java
│ │ │ ├── IByteMessageDecoder.java
│ │ │ ├── IByteMessageEncoder.java
│ │ │ ├── IMessageCodec.java
│ │ │ ├── IMessageDecoder.java
│ │ │ ├── IMessageEncoder.java
│ │ │ ├── INettyMessageDecoder.java
│ │ │ ├── INettyMessageEncoder.java
│ │ │ ├── JsonByteMessageDecoder.java
│ │ │ ├── JsonByteMessageEncoder.java
│ │ │ ├── JsonNettyMessageDecoder.java
│ │ │ ├── JsonNettyMessageEncoder.java
│ │ │ ├── JsonShortLengthNettyMessageEncoder.java
│ │ │ ├── JsonTextNettyMessageEncoder.java
│ │ │ ├── ProtobufByteMessageDecoder.java
│ │ │ ├── ProtobufByteMessageEncoder.java
│ │ │ ├── ProtobufNettyMessageDecoder.java
│ │ │ └── ProtobufNettyMessageEncoder.java
│ │ ├── connect
│ │ │ ├── IConnectClosedHandler.java
│ │ │ ├── IConnectExceptionHandler.java
│ │ │ └── IConnectOpenedHandler.java
│ │ ├── handler
│ │ │ ├── ExpressionMessageHandler.java
│ │ │ ├── IHttpMessageHandler.java
│ │ │ └── IMessageHandler.java
│ │ ├── msg
│ │ │ ├── CustomMsg.java
│ │ │ ├── IByteDto.java
│ │ │ ├── ICustomDto.java
│ │ │ ├── ICustomMessage.java
│ │ │ ├── IMessageDispatcher.java
│ │ │ ├── IMessageInterceptor.java
│ │ │ ├── ReqCustomMessage.java
│ │ │ └── RespCustomMessage.java
│ │ ├── package-info.java
│ │ ├── server
│ │ │ ├── AbstractInnerGameServer.java
│ │ │ ├── AbstractInnerNettyGameServer.java
│ │ │ ├── InnerGameServerFactory.java
│ │ │ ├── InnerNettyHttpGameServer.java
│ │ │ ├── InnerNettyTcpGameServer.java
│ │ │ ├── InnerNettyUdpGameServer.java
│ │ │ └── InnerNettyWebsocketGameServer.java
│ │ └── session
│ │ │ ├── AbstractSession.java
│ │ │ ├── DefaultMessageSender.java
│ │ │ ├── IMessageSender.java
│ │ │ ├── ISessionCreator.java
│ │ │ ├── NettyHttpSession.java
│ │ │ ├── NettySession.java
│ │ │ ├── NettyUdpSession.java
│ │ │ └── NettyWebsocketSession.java
│ │ ├── register
│ │ ├── AbstractGameDataLoaderAdaptor.java
│ │ ├── ClassFilters.java
│ │ ├── ClassIdReader.java
│ │ ├── ClassScanners.java
│ │ ├── DefaultClassScanner.java
│ │ ├── EntityRegisterAdaptor.java
│ │ ├── GameServerRegisterAdaptor.java
│ │ ├── IClassFilter.java
│ │ ├── IClassScanner.java
│ │ ├── IEntityRegister.java
│ │ ├── IFunctionRegister.java
│ │ ├── IGameDataLoader.java
│ │ ├── IGameServerRegister.java
│ │ ├── IGameServerStartedHandler.java
│ │ ├── IGmServerRegister.java
│ │ ├── IMessageDtoRegister.java
│ │ ├── IMessageHandlerRegister.java
│ │ ├── IMessageRegister.java
│ │ ├── MessageHandlerRegisterAdaptor.java
│ │ ├── MessageRegisterAdapter.java
│ │ ├── Registers.java
│ │ ├── UdpGameServerRegister.java
│ │ └── WebsocketGameServerRegister.java
│ │ ├── serialization
│ │ ├── IDataSerializable.java
│ │ └── StringDataSerialization.java
│ │ ├── server
│ │ ├── AbstractGameServer.java
│ │ ├── AbstractServer.java
│ │ ├── GameServerUnPauseWorker.java
│ │ └── GameServers.java
│ │ ├── service
│ │ └── GmService.java
│ │ ├── starter
│ │ ├── DangKangGameProperties.java
│ │ ├── DangKangGameServerProperties.java
│ │ ├── DangKangGameStarter.java
│ │ ├── DangKangStarter.java
│ │ ├── DkGameServerAutoConfiguration.java
│ │ ├── ExternalLastInitializer.java
│ │ └── package-info.java
│ │ ├── support
│ │ ├── IPropertyRefreshable.java
│ │ ├── IRefreshable.java
│ │ ├── ParamSupplier.java
│ │ └── RefresherContainer.java
│ │ ├── text
│ │ └── sensitive
│ │ │ ├── AbstractDesensitizeProcessor.java
│ │ │ ├── AbstractSensitiveWordProcessor.java
│ │ │ ├── BankCardDesensitizeProcessor.java
│ │ │ ├── ChineseNameDesensitizeProcessor.java
│ │ │ ├── DefaultSensitiveWordProcessor.java
│ │ │ ├── EmailDesensitizeProcessor.java
│ │ │ ├── IDesensitizeProcessor.java
│ │ │ ├── ISensitiveMaskPolicy.java
│ │ │ ├── ISensitiveWordProcessor.java
│ │ │ ├── IdCardNoDesensitizeProcessor.java
│ │ │ └── MobileDesensitizeProcessor.java
│ │ └── util
│ │ ├── ChannelUtil.java
│ │ ├── ClassHelper.java
│ │ ├── DateUtil.java
│ │ ├── FileUtil.java
│ │ ├── HotfixUtil.java
│ │ ├── HttpUtil.java
│ │ ├── JsonUtil.java
│ │ ├── MessageUtil.java
│ │ ├── ModuleResourceUtil.java
│ │ ├── ReflectHelper.java
│ │ ├── SpringUtils.java
│ │ ├── TypeHelper.java
│ │ └── ZipUtil.java
│ └── resources
│ └── applicationContext-dk-default.xml
├── dk-domain
├── pom.xml
└── src
│ └── main
│ └── java
│ └── cn
│ └── laoshini
│ └── dk
│ └── domain
│ ├── common
│ ├── ArrayTuple.java
│ ├── ConstReadTable.java
│ ├── ConstTable.java
│ ├── ListTuple.java
│ ├── MultiConstTableContent.java
│ ├── Tuple.java
│ └── TupleArray.java
│ ├── dto
│ ├── ExpressionBlockDTO.java
│ ├── ExpressionDescriptorDTO.java
│ ├── GameServerInfoDTO.java
│ ├── GameServerRegisterDTO.java
│ ├── HandlerExpDescriptorDTO.java
│ ├── HotfixRecordDTO.java
│ └── ModuleInfoDTO.java
│ ├── msg
│ ├── AbstractMessage.java
│ ├── IMessage.java
│ ├── ReqMessage.java
│ └── RespMessage.java
│ ├── query
│ ├── AbstractQueryCondition.java
│ ├── BeanQueryCondition.java
│ ├── ListQueryCondition.java
│ ├── Page.java
│ └── PageQueryCondition.java
│ └── responese
│ ├── Result.java
│ └── ResultCode.java
├── dk-game-core
├── pom.xml
└── src
│ ├── main
│ └── java
│ │ └── cn
│ │ └── laoshini
│ │ └── dk
│ │ ├── client
│ │ ├── AbstractBiasCodecNettyTcpClient.java
│ │ ├── AbstractNettyTcpClient.java
│ │ ├── ClientException.java
│ │ ├── CustomMessageNettyTcpClient.java
│ │ ├── JsonNettyTcpClient.java
│ │ ├── ProtobufNettyTcpClient.java
│ │ └── package-info.java
│ │ ├── cluster
│ │ └── package-info.java
│ │ ├── constant
│ │ ├── AttributeKeyConstant.java
│ │ ├── BtNodeType.java
│ │ ├── CompositeType.java
│ │ └── NodeState.java
│ │ ├── domain
│ │ ├── Player.java
│ │ └── Role.java
│ │ ├── entity
│ │ ├── GameConfig.java
│ │ ├── GameRole.java
│ │ ├── GameUser.java
│ │ ├── MixedGameServerInfo.java
│ │ └── package-info.java
│ │ ├── event
│ │ └── ChannelCloseEvent.java
│ │ ├── eventbus
│ │ ├── EventMgr.java
│ │ └── LoggingSubscriberExceptionHandler.java
│ │ ├── id
│ │ ├── DefaultRoleIdGenerator.java
│ │ └── DefaultUserIdGenerator.java
│ │ ├── net
│ │ ├── codec
│ │ │ ├── BaseProtobufMessageEncoder.java
│ │ │ ├── CustomByteMessageCodec.java
│ │ │ ├── CustomNettyMessageDecoder.java
│ │ │ ├── CustomNettyMessageEncoder.java
│ │ │ └── ProtobufByteMessageCodec.java
│ │ ├── handler
│ │ │ ├── ICustomMessageHandler.java
│ │ │ ├── IJsonMessageHandler.java
│ │ │ ├── IProtobufMessageHandler.java
│ │ │ └── MessageReceiveDispatcher.java
│ │ ├── msg
│ │ │ ├── Base.proto
│ │ │ ├── BaseProtobufMessage.java
│ │ │ ├── INettyCustomMessage.java
│ │ │ ├── INettyDto.java
│ │ │ ├── ReqNettyCustomMessage.java
│ │ │ └── RespNettyCustomMessage.java
│ │ └── package-info.java
│ │ ├── robot
│ │ ├── bt
│ │ │ ├── BehaviorTree.java
│ │ │ ├── BehaviorTreeProducer.java
│ │ │ ├── IBehaviorTree.java
│ │ │ ├── IBtConfig.java
│ │ │ ├── factory
│ │ │ │ ├── AbstractBtActionNodeFactory.java
│ │ │ │ ├── AbstractBtConditionNodeFactory.java
│ │ │ │ ├── IBtNodeFactory.java
│ │ │ │ ├── IBtRootNodeFactory.java
│ │ │ │ └── impl
│ │ │ │ │ ├── BtActionNodeFactoryImpl.java
│ │ │ │ │ ├── BtCompositeNodeFactory.java
│ │ │ │ │ ├── BtConditionNodeFactoryImpl.java
│ │ │ │ │ ├── BtDecoratorNodeFactory.java
│ │ │ │ │ └── BtRootNodeFactoryImpl.java
│ │ │ ├── node
│ │ │ │ ├── AbstractBtAction.java
│ │ │ │ ├── AbstractBtCompositeNode.java
│ │ │ │ ├── AbstractBtCondition.java
│ │ │ │ ├── AbstractBtNode.java
│ │ │ │ ├── BtConditionNode.java
│ │ │ │ ├── BtRootNode.java
│ │ │ │ ├── IBtNode.java
│ │ │ │ ├── IBtNodeConfig.java
│ │ │ │ ├── composite
│ │ │ │ │ ├── EmptyNode.java
│ │ │ │ │ ├── ParallelAllFail.java
│ │ │ │ │ ├── ParallelAllSucceed.java
│ │ │ │ │ ├── ParallelHybirdFail.java
│ │ │ │ │ ├── ParallelHybirdSucceed.java
│ │ │ │ │ ├── ParallelSelector.java
│ │ │ │ │ ├── ParallelSequence.java
│ │ │ │ │ ├── SelectorNode.java
│ │ │ │ │ └── SequenceNode.java
│ │ │ │ └── condition
│ │ │ │ │ ├── EqualCondition.java
│ │ │ │ │ └── FalseCondition.java
│ │ │ └── package-info.java
│ │ ├── fsm
│ │ │ ├── AbstractFsmRobot.java
│ │ │ ├── FsmMessage.java
│ │ │ ├── IFsmRobot.java
│ │ │ ├── IFsmState.java
│ │ │ ├── IStateMachine.java
│ │ │ └── package-info.java
│ │ └── package-info.java
│ │ ├── serialization
│ │ └── ProtoBufDataSerialization.java
│ │ ├── server
│ │ ├── AbstractNettyTcpGameServer.java
│ │ ├── NettyServerFactory.java
│ │ ├── channel
│ │ │ ├── INettyChannelReader.java
│ │ │ ├── JsonMessageChannelReader.java
│ │ │ ├── LastChannelReader.java
│ │ │ ├── NettyCustomMessageChannelReader.java
│ │ │ └── ProtobufMessageChannelReader.java
│ │ ├── impl
│ │ │ ├── CustomNettyTcpGameServer.java
│ │ │ ├── HttpGameServer.java
│ │ │ ├── JsonNettyTcpGameServer.java
│ │ │ └── ProtobufNettyTcpGameServer.java
│ │ ├── package-info.java
│ │ └── worker
│ │ │ └── MessageReceiveWorker.java
│ │ └── util
│ │ └── ByteMessageUtil.java
│ └── test
│ └── java
│ └── cn
│ └── laoshini
│ └── dk
│ └── robot
│ └── fsm
│ ├── FsmTest.java
│ ├── Monster.java
│ ├── MonsterState.java
│ └── MonsterStateMachine.java
├── dk-impl-basic
├── dk-basic-da
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── laoshini
│ │ └── dk
│ │ ├── cache
│ │ └── DefaultCacheImpl.java
│ │ └── dao
│ │ ├── DefaultDaoImpl.java
│ │ ├── DefaultRelationalDbDao.java
│ │ ├── EmbeddedPairDao.java
│ │ ├── InnerGameDataSourceConfig.java
│ │ └── RelationalDbDaoManager.java
├── dk-basic-excel
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── laoshini
│ │ └── dk
│ │ └── excel
│ │ ├── AbstractExcelExporter.java
│ │ ├── ConstraintExcelExporter.java
│ │ ├── ExcelConstant.java
│ │ ├── ExcelExporter.java
│ │ ├── ExcelFileDao.java
│ │ ├── ExcelReader.java
│ │ ├── ExcelUtil.java
│ │ ├── MatrixExcelExporter.java
│ │ └── constraint
│ │ ├── ExcelDateHeader.java
│ │ ├── ExcelFormulaHeader.java
│ │ ├── ExcelHeader.java
│ │ ├── ExcelListHeader.java
│ │ └── ExcelNumericHeader.java
├── dk-config-center-jdbc
│ ├── pom.xml
│ ├── sql
│ │ └── config-center-server.sql
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── laoshini
│ │ │ └── dk
│ │ │ └── config
│ │ │ └── center
│ │ │ ├── DkJdbcConfigCenterApplication.java
│ │ │ ├── annotation
│ │ │ ├── Label.java
│ │ │ ├── Profile.java
│ │ │ └── Property.java
│ │ │ ├── constant
│ │ │ ├── PropertiesConstant.java
│ │ │ ├── PropertyOperation.java
│ │ │ └── PropertyStatus.java
│ │ │ ├── domain
│ │ │ ├── PropertyField.java
│ │ │ ├── PropertySource.java
│ │ │ └── UpdatedProperties.java
│ │ │ ├── entity
│ │ │ ├── ConfigProperty.java
│ │ │ ├── PropertyChange.java
│ │ │ └── PropertyHistory.java
│ │ │ ├── mapper
│ │ │ ├── PropertiesMapper.java
│ │ │ ├── PropertyHistoryMapper.java
│ │ │ └── VersionHistoryMapper.java
│ │ │ ├── mybatis
│ │ │ └── PropertyChangeJsonTypeHandler.java
│ │ │ ├── service
│ │ │ ├── GameServerConfigService.java
│ │ │ ├── PropertiesService.java
│ │ │ └── VersionService.java
│ │ │ └── web
│ │ │ └── GameServerConfigController.java
│ │ └── resources
│ │ ├── application.properties
│ │ ├── banner.txt
│ │ ├── logback.xml
│ │ └── mapper
│ │ ├── PropertiesMapper.xml
│ │ ├── PropertyHistoryMapper.xml
│ │ └── VersionHistoryMapper.xml
├── dk-config-client
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── laoshini
│ │ │ └── dk
│ │ │ └── config
│ │ │ └── client
│ │ │ ├── CloudBusRefresher.java
│ │ │ ├── CustomerContextRefresher.java
│ │ │ ├── DkConfigClientApplicationContext.java
│ │ │ └── DkConfigClientEnvironment.java
│ │ └── resources
│ │ ├── META-INF
│ │ └── spring.factories
│ │ └── applicationContext-dk-config.xml
├── dk-db-id-incrementer
│ ├── pom.xml
│ ├── sql
│ │ └── id_incrementer.sql
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── laoshini
│ │ └── dk
│ │ └── generator
│ │ └── id
│ │ ├── ColumnIdIncrementer.java
│ │ ├── DefaultIdIncrementer.java
│ │ ├── IDbIdIncrementer.java
│ │ ├── IdIncrementerConstant.java
│ │ └── PairIdIncrementer.java
├── dk-gm-console
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── laoshini
│ │ │ └── dk
│ │ │ └── console
│ │ │ ├── DkAdminApplication.java
│ │ │ ├── service
│ │ │ └── GameServerService.java
│ │ │ ├── util
│ │ │ └── HttpUtil.java
│ │ │ ├── vo
│ │ │ ├── HotfixRecordVO.java
│ │ │ └── ModuleInfoVO.java
│ │ │ └── web
│ │ │ ├── DkCommonController.java
│ │ │ ├── DkGameServerController.java
│ │ │ └── DkGmController.java
│ │ └── resources
│ │ ├── application.properties
│ │ └── logback.xml
├── dk-gm
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── laoshini
│ │ └── dk
│ │ ├── gm
│ │ ├── GmHttpRequestUriInterceptor.java
│ │ ├── constant
│ │ │ └── GmConstants.java
│ │ ├── handler
│ │ │ ├── DoHotfixHandler.java
│ │ │ ├── GetGameServerInfoHandler.java
│ │ │ ├── GetHotfixHistoryHandler.java
│ │ │ ├── GetModuleListHandler.java
│ │ │ ├── PauseGameServerHandler.java
│ │ │ ├── ReleaseGameServerHandler.java
│ │ │ ├── ReloadModulesHandler.java
│ │ │ └── RemoveModuleHandler.java
│ │ └── message
│ │ │ ├── hotfix
│ │ │ ├── DoHotfixReq.java
│ │ │ ├── DoHotfixRes.java
│ │ │ ├── GetHotfixHistoryReq.java
│ │ │ └── GetHotfixHistoryRes.java
│ │ │ ├── module
│ │ │ ├── GetModuleListReq.java
│ │ │ ├── GetModuleListRes.java
│ │ │ ├── ReloadModulesReq.java
│ │ │ ├── ReloadModulesRes.java
│ │ │ ├── RemoveModuleReq.java
│ │ │ └── RemoveModuleRes.java
│ │ │ └── server
│ │ │ ├── GetGameServerInfoReq.java
│ │ │ ├── GetGameServerInfoRes.java
│ │ │ ├── PauseGameServerReq.java
│ │ │ ├── PauseGameServerRes.java
│ │ │ ├── ReleaseGameServerReq.java
│ │ │ └── ReleaseGameServerRes.java
│ │ └── register
│ │ └── GmServerRegister.java
├── dk-name-generator-cn
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── laoshini
│ │ │ └── dk
│ │ │ └── generator
│ │ │ └── name
│ │ │ ├── AbstractLevelRandomNameGenerator.java
│ │ │ ├── BasicLevelRandomNameGenerator.java
│ │ │ ├── ChineseCharacter.java
│ │ │ ├── ChineseNameGenerator.java
│ │ │ ├── ILevelRandomNameGenerator.java
│ │ │ ├── LevelRandomNameGeneratorRegistry.java
│ │ │ ├── MiddleLevelRandomNameGenerator.java
│ │ │ ├── NameContainer.java
│ │ │ ├── SimpleLevelRandomNameGenerator.java
│ │ │ └── Surname.java
│ │ └── resources
│ │ ├── chinese_character.json
│ │ └── surname.json
├── dk-name-generator-foreign-cn
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── laoshini
│ │ │ └── dk
│ │ │ └── generator
│ │ │ └── name
│ │ │ ├── ForeignCnNameGenerator.java
│ │ │ └── IniName.java
│ │ └── resources
│ │ └── ini_name.json
├── dk-qr-code
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── laoshini
│ │ └── dk
│ │ └── qrcode
│ │ ├── QrCodeBuilder.java
│ │ ├── QrCodeReader.java
│ │ └── QrCodeUtil.java
└── pom.xml
├── dk-starter
└── pom.xml
└── pom.xml
/.gitignore:
--------------------------------------------------------------------------------
1 | HELP.md
2 | /**/target/
3 | !.mvn/wrapper/maven-wrapper.jar
4 | /levelDB/
5 | /logs/
6 | /modules/
7 |
8 | ### STS ###
9 | .apt_generated
10 | .classpath
11 | .factorypath
12 | .project
13 | .settings
14 | .springBeans
15 | .sts4-cache
16 |
17 | ### IntelliJ IDEA ###
18 | .idea
19 | *.iws
20 | *.iml
21 | *.ipr
22 |
23 | ### NetBeans ###
24 | /nbproject/private/
25 | /nbbuild/
26 | /dist/
27 | /nbdist/
28 | /.nb-gradle/
29 | /build/
30 |
31 | ### VS Code ###
32 | .vscode/
33 |
--------------------------------------------------------------------------------
/dk-agent/src/main/java/cn/laoshini/dk/agent/AgentMain.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.agent;
2 |
3 | /**
4 | * @author fagarine
5 | */
6 | public class AgentMain {
7 |
8 | public static void main(String[] args) {
9 | System.out.println("Game Agent Main execute");
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/dk-agent/src/main/java/cn/laoshini/dk/agent/AttachProviderPlaceHolder.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.agent;
2 |
3 | import java.io.IOException;
4 | import java.util.List;
5 |
6 | import com.sun.tools.attach.AttachNotSupportedException;
7 | import com.sun.tools.attach.VirtualMachine;
8 | import com.sun.tools.attach.VirtualMachineDescriptor;
9 | import com.sun.tools.attach.spi.AttachProvider;
10 |
11 | /**
12 | * @author fagarine
13 | */
14 | class AttachProviderPlaceHolder extends AttachProvider {
15 | @Override
16 | public String name() {
17 | return null;
18 | }
19 |
20 | @Override
21 | public String type() {
22 | return null;
23 | }
24 |
25 | @Override
26 | public VirtualMachine attachVirtualMachine(String s) throws AttachNotSupportedException, IOException {
27 | return null;
28 | }
29 |
30 | @Override
31 | public List listVirtualMachines() {
32 | return null;
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/dk-agent/src/main/java/cn/laoshini/dk/transform/IClassByteCodeCache.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.transform;
2 |
3 | import java.util.Map;
4 | import java.util.concurrent.ConcurrentHashMap;
5 |
6 | /**
7 | * 类字节码缓存接口
8 | *
9 | * @author fagarine
10 | */
11 | interface IClassByteCodeCache {
12 |
13 | /**
14 | * 缓存一些常用类的字节码信息
15 | */
16 | Map BYTE_CODE_CACHE = new ConcurrentHashMap<>();
17 |
18 | /**
19 | * 获取类名对应类的字节码,先尝试从缓存中查找
20 | *
21 | * @param className 类名
22 | * @return 返回类的字节码
23 | */
24 | default byte[] getClassBytes(String className) {
25 | return BYTE_CODE_CACHE.computeIfAbsent(className, this::classToBytes);
26 | }
27 |
28 | /**
29 | * 通过类名查找类,并返回类的字节码数据
30 | *
31 | * @param className 类名
32 | * @return 返回类的字节码
33 | */
34 | byte[] classToBytes(String className);
35 | }
36 |
--------------------------------------------------------------------------------
/dk-agent/src/main/java/cn/laoshini/dk/transform/asm/AbstractAsmModifier.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.transform.asm;
2 |
3 | import cn.laoshini.dk.transform.AbstractClassFileModifier;
4 |
5 | /**
6 | * 使用ASM实现修改Class字节码功能的抽象类,我习惯了使用javassist,ASM不熟悉,这里只是留下扩展空间
7 | *
8 | * @author fagarine
9 | */
10 | public abstract class AbstractAsmModifier extends AbstractClassFileModifier {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/dk-agent/src/main/java/cn/laoshini/dk/transform/asm/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 我本人更喜欢使用javassist,这个包是为喜欢使用asm技术的用户预留
3 | *
4 | * @author fagarine
5 | */
6 | package cn.laoshini.dk.transform.asm;
--------------------------------------------------------------------------------
/dk-agent/src/main/java/cn/laoshini/dk/transform/injection/ConfigurableFunctionInjectorProxy.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.transform.injection;
2 |
3 | /**
4 | * @author fagarine
5 | */
6 | public class ConfigurableFunctionInjectorProxy implements IConfigurableFunctionInjector {
7 | private ConfigurableFunctionInjectorProxy() {
8 | }
9 |
10 | private static ConfigurableFunctionInjectorProxy instance = new ConfigurableFunctionInjectorProxy();
11 |
12 | public static ConfigurableFunctionInjectorProxy getInstance() {
13 | return instance;
14 | }
15 |
16 | private IConfigurableFunctionInjector delegate;
17 |
18 | public static void setDelegate(IConfigurableFunctionInjector delegate) {
19 | instance.delegate = delegate;
20 | }
21 |
22 | @Override
23 | public void injectField(Object bean, String fieldName) {
24 | if (delegate == null) {
25 | // 功能注入实现类对象还未填入,缓存依赖注入的对象
26 | add(bean);
27 | } else {
28 | delegate.injectField(bean, fieldName);
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/dk-agent/src/main/java/cn/laoshini/dk/transform/javassist/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 使用javassist实现类字节码修改
3 | *
4 | * @author fagarine
5 | */
6 | package cn.laoshini.dk.transform.javassist;
--------------------------------------------------------------------------------
/dk-autoconfigure/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | dangkang
7 | cn.laoshini.dk
8 | 1.0.0-SNAPSHOT
9 |
10 | 4.0.0
11 |
12 | dk-autoconfigure
13 |
14 |
15 |
16 | org.springframework.boot
17 | spring-boot-autoconfigure
18 | 2.2.0.RELEASE
19 | provided
20 |
21 |
22 |
23 | org.springframework.boot
24 | spring-boot-configuration-processor
25 | 2.2.0.RELEASE
26 | provided
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/dk-autoconfigure/src/main/java/cn/laoshini/dk/autoconfigure/DangKangCacheProperties.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.autoconfigure;
2 |
3 | import lombok.Getter;
4 | import lombok.Setter;
5 |
6 | import org.springframework.boot.context.properties.ConfigurationProperties;
7 | import org.springframework.context.annotation.Configuration;
8 | import org.springframework.core.Ordered;
9 | import org.springframework.core.annotation.Order;
10 |
11 | /**
12 | * 应用内缓存相关配置项
13 | *
14 | * @author fagarine
15 | */
16 | @Getter
17 | @Setter
18 | @Configuration
19 | @Order(Ordered.HIGHEST_PRECEDENCE)
20 | @ConfigurationProperties(prefix = "dk.cache")
21 | public class DangKangCacheProperties {
22 |
23 | /**
24 | * 选择应用内缓存数据访问对象的实现方式
25 | */
26 | private String dao = "DEFAULT";
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/dk-autoconfigure/src/main/java/cn/laoshini/dk/autoconfigure/DangKangConfigCenterProperties.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.autoconfigure;
2 |
3 | import lombok.Getter;
4 | import lombok.Setter;
5 | import lombok.ToString;
6 |
7 | import org.springframework.boot.context.properties.ConfigurationProperties;
8 | import org.springframework.context.annotation.Configuration;
9 | import org.springframework.core.Ordered;
10 | import org.springframework.core.annotation.Order;
11 |
12 | /**
13 | * 当康系统配置中心相关配置项
14 | *
15 | * @author fagarine
16 | */
17 | @Getter
18 | @Setter
19 | @ToString
20 | @Configuration
21 | @Order(Ordered.HIGHEST_PRECEDENCE)
22 | @ConfigurationProperties(prefix = "dk.config")
23 | public class DangKangConfigCenterProperties {
24 |
25 | /**
26 | * 配置中心URL
27 | */
28 | private String server;
29 |
30 | /**
31 | * 项目名称(业务项目或者游戏项目的名称,例如游戏id)
32 | */
33 | private String name;
34 |
35 | /**
36 | * 项目profile(例如游戏项目默认使用serverId作为profile)
37 | */
38 | private String profile;
39 |
40 | /**
41 | * 项目标签(游戏项目的label表示运行环境,配置文件中可不填,默认为master)
42 | */
43 | private String label = "master";
44 |
45 | }
46 |
--------------------------------------------------------------------------------
/dk-autoconfigure/src/main/java/cn/laoshini/dk/autoconfigure/DangKangExternalProperties.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.autoconfigure;
2 |
3 | import java.util.List;
4 |
5 | import lombok.Getter;
6 | import lombok.Setter;
7 | import lombok.ToString;
8 |
9 | import org.springframework.boot.context.properties.ConfigurationProperties;
10 | import org.springframework.context.annotation.Configuration;
11 | import org.springframework.core.Ordered;
12 | import org.springframework.core.annotation.Order;
13 |
14 | /**
15 | * @author fagarine
16 | */
17 | @Getter
18 | @Setter
19 | @ToString
20 | @Configuration
21 | @Order(Ordered.HIGHEST_PRECEDENCE)
22 | @ConfigurationProperties(prefix = "dk.ext")
23 | public class DangKangExternalProperties {
24 |
25 | /**
26 | * 用户游戏项目的需要扫描到的包路径前缀,可以填写多个
27 | */
28 | private List packagePrefix;
29 |
30 | /**
31 | * 外部游戏功能注册功能实现类选择
32 | */
33 | private String register = "DEFAULT";
34 | }
35 |
--------------------------------------------------------------------------------
/dk-autoconfigure/src/main/java/cn/laoshini/dk/autoconfigure/DangKangFunctionProperties.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.autoconfigure;
2 |
3 | import lombok.Getter;
4 | import lombok.Setter;
5 | import lombok.ToString;
6 |
7 | import org.springframework.boot.context.properties.ConfigurationProperties;
8 | import org.springframework.context.annotation.Configuration;
9 | import org.springframework.core.Ordered;
10 | import org.springframework.core.annotation.Order;
11 |
12 | /**
13 | * 当康系统可配置功能相关配置项
14 | *
15 | * @author fagarine
16 | */
17 | @Getter
18 | @Setter
19 | @ToString
20 | @Configuration
21 | @Order(Ordered.HIGHEST_PRECEDENCE)
22 | @ConfigurationProperties(prefix = "dk.function")
23 | public class DangKangFunctionProperties {
24 |
25 | /**
26 | * 是否允许功能的实现类缺失;注意:允许缺失的情况下,如果找不到功能的实现类,系统也不会报错,这可能导致调用处的NullPointerException
27 | */
28 | private boolean vacant = true;
29 | }
30 |
--------------------------------------------------------------------------------
/dk-autoconfigure/src/main/java/cn/laoshini/dk/autoconfigure/DangKangGenerateProperties.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.autoconfigure;
2 |
3 | import lombok.Getter;
4 | import lombok.Setter;
5 | import lombok.ToString;
6 |
7 | import org.springframework.boot.context.properties.ConfigurationProperties;
8 | import org.springframework.context.annotation.Configuration;
9 | import org.springframework.core.Ordered;
10 | import org.springframework.core.annotation.Order;
11 |
12 | /**
13 | * @author fagarine
14 | */
15 | @Getter
16 | @Setter
17 | @ToString
18 | @Configuration
19 | @Order(Ordered.HIGHEST_PRECEDENCE)
20 | @ConfigurationProperties(prefix = "dk.generate")
21 | public class DangKangGenerateProperties {
22 |
23 | /**
24 | * 是否自动创建消息处理Handler类,默认为false;如果设置为true,当有新的Handler表达式创建时,将会创建一个对应的Handler类,并将表达式转变为其中的代码
25 | */
26 | private boolean handler = false;
27 | }
28 |
--------------------------------------------------------------------------------
/dk-autoconfigure/src/main/java/cn/laoshini/dk/autoconfigure/DangKangGmProperties.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.autoconfigure;
2 |
3 | import lombok.Getter;
4 | import lombok.Setter;
5 | import lombok.ToString;
6 |
7 | import org.springframework.boot.context.properties.ConfigurationProperties;
8 | import org.springframework.context.annotation.Configuration;
9 | import org.springframework.core.Ordered;
10 | import org.springframework.core.annotation.Order;
11 |
12 | /**
13 | * 当康系统游戏服GM功能相关配置项
14 | *
15 | * @author fagarine
16 | */
17 | @Getter
18 | @Setter
19 | @ToString
20 | @Configuration
21 | @Order(Ordered.HIGHEST_PRECEDENCE)
22 | @ConfigurationProperties(prefix = "dk.gm")
23 | public class DangKangGmProperties {
24 |
25 | /**
26 | * 游戏服进程的配置项中,记录GM服务接口的配置项名称
27 | */
28 | private String key = "gmUrl";
29 |
30 | /**
31 | * GM后台服务器URL根目录
32 | */
33 | private String console;
34 | }
35 |
--------------------------------------------------------------------------------
/dk-autoconfigure/src/main/java/cn/laoshini/dk/autoconfigure/DangKangIdProperties.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.autoconfigure;
2 |
3 | import lombok.Getter;
4 | import lombok.Setter;
5 | import lombok.ToString;
6 |
7 | import org.springframework.boot.context.properties.ConfigurationProperties;
8 | import org.springframework.context.annotation.Configuration;
9 | import org.springframework.core.Ordered;
10 | import org.springframework.core.annotation.Order;
11 |
12 | /**
13 | * @author fagarine
14 | */
15 | @Getter
16 | @Setter
17 | @ToString
18 | @Configuration
19 | @Order(Ordered.HIGHEST_PRECEDENCE)
20 | @ConfigurationProperties(prefix = "dk.id")
21 | public class DangKangIdProperties {
22 |
23 | /**
24 | * 选择id自增器的实现方式
25 | */
26 | private String incrementer = "DEFAULT";
27 |
28 | /**
29 | * 选择生成用户id的实现方式
30 | */
31 | private String user = "DEFAULT";
32 |
33 | /**
34 | * 选择生成游戏角色id的实现方式
35 | */
36 | private String role = "DEFAULT";
37 | }
38 |
--------------------------------------------------------------------------------
/dk-autoconfigure/src/main/java/cn/laoshini/dk/autoconfigure/DangKangModuleProperties.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.autoconfigure;
2 |
3 | import lombok.Getter;
4 | import lombok.Setter;
5 | import lombok.ToString;
6 |
7 | import org.springframework.boot.context.properties.ConfigurationProperties;
8 | import org.springframework.context.annotation.Configuration;
9 | import org.springframework.core.Ordered;
10 | import org.springframework.core.annotation.Order;
11 |
12 | /**
13 | * 外置模块配置项(外置模块项目专用)
14 | *
15 | * @author fagarine
16 | */
17 | @Getter
18 | @Setter
19 | @ToString
20 | @Configuration
21 | @Order(Ordered.HIGHEST_PRECEDENCE)
22 | @ConfigurationProperties(prefix = "dk.module")
23 | public class DangKangModuleProperties {
24 |
25 | /**
26 | * 模块名称(仅外置模块需要配置)
27 | */
28 | private String name;
29 |
30 | /**
31 | * 模块描述信息(仅外置模块需要配置)
32 | */
33 | private String description;
34 |
35 | }
36 |
37 |
--------------------------------------------------------------------------------
/dk-autoconfigure/src/main/java/cn/laoshini/dk/autoconfigure/DangKangPairDaoProperties.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.autoconfigure;
2 |
3 | import lombok.Getter;
4 | import lombok.Setter;
5 |
6 | import org.springframework.boot.context.properties.ConfigurationProperties;
7 | import org.springframework.context.annotation.Configuration;
8 | import org.springframework.core.Ordered;
9 | import org.springframework.core.annotation.Order;
10 |
11 | /**
12 | * 键值对数据库相关配置项
13 | *
14 | * @author fagarine
15 | */
16 | @Getter
17 | @Setter
18 | @Configuration
19 | @Order(Ordered.HIGHEST_PRECEDENCE)
20 | @ConfigurationProperties(prefix = "dk.pair")
21 | public class DangKangPairDaoProperties {
22 |
23 | /**
24 | * 选择键值对数据库数据访问对象的实现方式
25 | */
26 | private String dao = "DEFAULT";
27 |
28 | /**
29 | * 如果使用LevelDB作为数据库,填写数据库文件保存目录路径,可以是绝对路径,也可以使相对项目根目录的相对路径
30 | *
31 | * 注意:请保证配置的目录已存在,否则系统将使用默认路径
32 | */
33 | private String levelDbFolder;
34 |
35 | }
36 |
--------------------------------------------------------------------------------
/dk-common/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | dangkang
7 | cn.laoshini.dk
8 | 1.0.0-SNAPSHOT
9 |
10 | 4.0.0
11 |
12 | dk-common
13 |
14 |
15 |
16 | org.springframework
17 | spring-context
18 | ${spring.version}
19 | provided
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/dk-common/src/main/java/cn/laoshini/dk/annotation/ConfigurableFunction.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.annotation;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | /**
9 | * 可配置功能标记,使用该注解标记的类,表示是一个功能定义类,其允许有多种不同实现,用户可以通过添加功能实现类的项目依赖和配置指定,来选择具体使用哪种实现。
10 | *
11 | * 功能通过配置的好处:
12 | *
13 | * - 将功能与其他依赖的功能解耦,功能之间通过接口调用,不需要知道具体实现,甚至不需要关心实现类是否是单例
14 | * - 方便功能的统一管理,实现类的实例对象由系统统一管理
15 | * - 实现依赖最小化,可以针对某个功能实现单独做一个项目,用户只需要单独加入这个项目的依赖即可,避免其他代码干扰
16 | *
17 | *
18 | *
19 | * 注意:本注解需要与@{@link FunctionVariousWays}注解配合使用,
20 | * 本注解用来标记功能定义类(一般为接口),而{@link FunctionVariousWays}用来标记功能的实现类。
21 | * 另外:功能定义类在项目启动时,应该作为classpath的一部分,被系统类加载器加载,而不应该放在可插拔模块中。
22 | *
23 | *
24 | * @author fagarine
25 | * @see FunctionVariousWays
26 | */
27 | @Target(ElementType.TYPE)
28 | @Retention(RetentionPolicy.RUNTIME)
29 | public @interface ConfigurableFunction {
30 |
31 | /**
32 | * 该功能在配置项中的key,用户通过这个值作为配置项的key来选择实现方式(大小写敏感)
33 | */
34 | String key();
35 |
36 | /**
37 | * 功能说明
38 | */
39 | String description() default "";
40 | }
41 |
--------------------------------------------------------------------------------
/dk-common/src/main/java/cn/laoshini/dk/annotation/Message.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.annotation;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | /**
9 | * 用于标记类,被标记的类表示该类是一个消息类
10 | *
11 | * @author fagarine
12 | */
13 | @Target(ElementType.TYPE)
14 | @Retention(RetentionPolicy.RUNTIME)
15 | public @interface Message {
16 |
17 | /**
18 | * 消息id
19 | */
20 | int id();
21 |
22 | /**
23 | * 描述信息
24 | */
25 | String desc() default "";
26 |
27 | /**
28 | * 是否是GM消息
29 | */
30 | boolean gm() default false;
31 | }
32 |
--------------------------------------------------------------------------------
/dk-common/src/main/java/cn/laoshini/dk/annotation/ResourceHolder.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.annotation;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | /**
9 | * 该注解用于外置模块热更新,用来标记 外置模块中 持有数据 的 单例 、枚举 或 静态数据类
10 | *
11 | * 被该注解标记的类,意为数据或内存资源的持有者,表示该类在热更新模块时,需要保留更新前的资源数据,并拷贝到更新后的对象中
12 | *
13 | *
14 | * 该注解用于模块热更新,所以外置模块需要使用该注解;当然,非外置模块也建议使用,这有助于使用表达式获取数据;
15 | * 如果一个类已经被标记为Spring托管,则不需要再使用该注解标注,系统默认会保留Spring托管对象的数据;
16 | * 如果一个类被{@link FunctionVariousWays}标记,也不需要使用该注解;
17 | * 稍显特殊的,是被{@link MessageHandle}标记的类,如果Handler类中依赖了Spring组件,系统同样会使用Spring管理Handler对象;
18 | *
19 | * 综上,该标记适用于非Spring托管,但是又长期持有数据的对象,使用该注解的类必须是 单例 、枚举 或 静态数据类;
20 | * 如外置模块中缓存了部分用户数据的manager类,在热更后需要保留热更前已缓存的数据,则需要添加该注解。
21 | *
22 | * @author fagarine
23 | */
24 | @Target(ElementType.TYPE)
25 | @Retention(RetentionPolicy.RUNTIME)
26 | public @interface ResourceHolder {
27 | /**
28 | * 名称、描述,可选
29 | */
30 | String value() default "";
31 | }
32 |
--------------------------------------------------------------------------------
/dk-common/src/main/java/cn/laoshini/dk/common/IDkApplicationContext.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.common;
2 |
3 | import org.springframework.context.ConfigurableApplicationContext;
4 |
5 | /**
6 | * 当康容器上下文SPI接口
7 | *
8 | * @author fagarine
9 | */
10 | public interface IDkApplicationContext extends ConfigurableApplicationContext {
11 |
12 | /**
13 | * 传入用户项目中Spring配置文件路径
14 | *
15 | * @param locations 配置文件路径
16 | */
17 | void configLocations(String... locations);
18 |
19 | /**
20 | * 获取当康容器启动依赖的Spring配置文件
21 | *
22 | * @return 返回配置文件路径
23 | */
24 | String[] dependentSpringConfigs();
25 | }
26 |
--------------------------------------------------------------------------------
/dk-common/src/main/java/cn/laoshini/dk/constant/LogLabel.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.constant;
2 |
3 | /**
4 | * @author fagarine
5 | */
6 | public enum LogLabel {
7 | /**
8 | * 错误日志
9 | */
10 | ERROR("error"),
11 | /**
12 | * 警告日志
13 | */
14 | WARN("warn"),
15 | /**
16 | * INFO日志
17 | */
18 | INFO("info"),
19 | /**
20 | * DEBUG日志
21 | */
22 | DEBUG("debug"),
23 | /**
24 | * java agent日志
25 | */
26 | AGENT("agent"),
27 | /**
28 | * session日志
29 | */
30 | SESSION("session"),
31 | /**
32 | * 客户端发往服务端的消息日志
33 | */
34 | C2S("c2s"),
35 | /**
36 | * 服务端发往客户端的消息日志
37 | */
38 | S2C("s2c"),
39 | /**
40 | * 消息日志,不区分上行下行
41 | */
42 | MESSAGE("msg"),
43 | /**
44 | * 协议处理handler相关日志
45 | */
46 | HANDLER("handler"),
47 | ;
48 |
49 | private String label;
50 |
51 | LogLabel(String label) {
52 | this.label = label;
53 | }
54 |
55 | public String getLabel() {
56 | return label;
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/dk-common/src/main/java/cn/laoshini/dk/exception/BusinessException.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.exception;
2 |
3 | /**
4 | * @author fagarine
5 | */
6 | public class BusinessException extends DkRuntimeException {
7 | public BusinessException(String message, Throwable cause) {
8 | super(message, cause);
9 | }
10 |
11 | public BusinessException(String errorKey, String message) {
12 | super(errorKey, message);
13 | }
14 |
15 | public BusinessException(String errorKey, String message, Throwable cause) {
16 | super(errorKey, message, cause);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/dk-common/src/main/java/cn/laoshini/dk/exception/DkRuntimeException.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.exception;
2 |
3 | /**
4 | * @author fagarine
5 | */
6 | public class DkRuntimeException extends RuntimeException {
7 |
8 | private String errorKey;
9 |
10 | public DkRuntimeException(String message, Throwable cause) {
11 | super(message, cause);
12 | }
13 |
14 | public DkRuntimeException(String errorKey, String message) {
15 | super(message);
16 | this.errorKey = errorKey;
17 | }
18 |
19 | public DkRuntimeException(String errorKey, String message, Throwable cause) {
20 | super(message, cause);
21 | this.errorKey = errorKey;
22 | }
23 |
24 | public String getErrorKey() {
25 | return errorKey;
26 | }
27 |
28 | public void setErrorKey(String errorKey) {
29 | this.errorKey = errorKey;
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/dk-common/src/main/java/cn/laoshini/dk/util/CollectionUtil.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.util;
2 |
3 | import java.util.Collection;
4 | import java.util.Map;
5 |
6 | /**
7 | * @author fagarine
8 | */
9 | public class CollectionUtil {
10 | private CollectionUtil() {
11 | }
12 |
13 | public static boolean isEmpty(Collection> collection) {
14 | return collection == null || collection.isEmpty();
15 | }
16 |
17 | public static boolean isNotEmpty(Collection> collection) {
18 | return !isEmpty(collection);
19 | }
20 |
21 | public static boolean isEmpty(Map, ?> map) {
22 | return map == null || map.isEmpty();
23 | }
24 |
25 | public static boolean isNotEmpty(Map, ?> map) {
26 | return !isEmpty(map);
27 | }
28 |
29 | public static boolean isEmpty(Object[] array) {
30 | return array == null || array.length == 0;
31 | }
32 |
33 | public static boolean isNotEmpty(Object[] array) {
34 | return !isEmpty(array);
35 | }
36 |
37 | }
38 |
--------------------------------------------------------------------------------
/dk-common/src/main/java/cn/laoshini/dk/util/NetUtil.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.util;
2 |
3 | import java.net.InetSocketAddress;
4 | import java.net.Socket;
5 | import java.net.SocketAddress;
6 |
7 | /**
8 | * @author fagarine
9 | */
10 | public class NetUtil {
11 | private NetUtil() {
12 | }
13 |
14 | private static final String LOCAL_IP = "127.0.0.1";
15 |
16 | /**
17 | * 远程端口是否可用
18 | *
19 | * @param ip
20 | * @param port
21 | * @return
22 | */
23 | public static boolean remotePortAble(String ip, int port) {
24 | try (Socket s = new Socket()) {
25 | SocketAddress add = new InetSocketAddress(ip, port);
26 | s.connect(add, 3000);
27 | return true;
28 | } catch (Exception e) {
29 | return false;
30 | }
31 | }
32 |
33 | /**
34 | * 本机端口是否可用
35 | *
36 | * @param port 本机端口
37 | * @return
38 | */
39 | public static boolean localPortAble(int port) {
40 | try (Socket s = new Socket()) {
41 | s.bind(new InetSocketAddress(LOCAL_IP, port));
42 | return true;
43 | } catch (Exception e) {
44 | return false;
45 | }
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/cache/CacheContainer.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.cache;
2 |
3 | import java.util.concurrent.ConcurrentHashMap;
4 |
5 | import cn.laoshini.dk.exception.CacheException;
6 | import cn.laoshini.dk.util.LogUtil;
7 |
8 | /**
9 | * 缓存池容器管理
10 | *
11 | * @author fagarine
12 | */
13 | public class CacheContainer {
14 |
15 | private static ConcurrentHashMap caches = new ConcurrentHashMap<>();
16 |
17 | private static IDkCache getCache(String cacheKey) {
18 | if (cacheKey == null) {
19 | return null;
20 | }
21 | return caches.get(cacheKey);
22 | }
23 |
24 | public static void putCache(String cacheKey, IDkCache cache) {
25 | if (cacheKey == null) {
26 | String message = String.format("缓存池的key不能为空, cache:%s", cache.getClass());
27 | LogUtil.error(message);
28 | throw new CacheException("cache.key.null", message);
29 | }
30 |
31 | caches.put(cacheKey, cache);
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/common/DkApplicationContext.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.common;
2 |
3 | import org.springframework.context.support.ClassPathXmlApplicationContext;
4 | import org.springframework.core.env.ConfigurableEnvironment;
5 |
6 | /**
7 | * @author fagarine
8 | */
9 | public class DkApplicationContext extends ClassPathXmlApplicationContext implements IDkApplicationContext {
10 |
11 | @Override
12 | protected ConfigurableEnvironment createEnvironment() {
13 | return new DkEnvironment();
14 | }
15 |
16 | @Override
17 | public void configLocations(String... locations) {
18 | super.setConfigLocations(locations);
19 | }
20 |
21 | @Override
22 | public String[] dependentSpringConfigs() {
23 | return new String[] { "applicationContext-dk-default.xml" };
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/condition/ConditionRecord.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.condition;
2 |
3 | /**
4 | * 记录条件匹配信息
5 | *
6 | * @author fagarine
7 | */
8 | public class ConditionRecord {
9 |
10 | private StringBuilder message;
11 |
12 | public ConditionRecord(String message) {
13 | this.message = new StringBuilder(message);
14 | }
15 |
16 | public static ConditionRecord empty() {
17 | return new ConditionRecord("");
18 | }
19 |
20 | public void append(ConditionRecord record) {
21 | if (record.notEmpty()) {
22 | if (notEmpty()) {
23 | message.append(", ");
24 | }
25 | message.append(record.getMessage());
26 | }
27 | }
28 |
29 | public boolean isEmpty() {
30 | return message == null || message.length() == 0;
31 | }
32 |
33 | public boolean notEmpty() {
34 | return !isEmpty();
35 | }
36 |
37 | @Override
38 | public String toString() {
39 | return isEmpty() ? "" : message.toString();
40 | }
41 |
42 | public StringBuilder getMessage() {
43 | return message;
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/condition/ConditionalOnPropertyExists.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.condition;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | import org.springframework.context.annotation.Conditional;
9 |
10 | /**
11 | * 匹配条件:指定配置项必须存在;仅当指定的所有配置项存在有效值(非空且不为空字符串)的情况下,条件成立
12 | *
13 | * @author fagarine
14 | */
15 | @Target({ ElementType.TYPE, ElementType.METHOD })
16 | @Retention(RetentionPolicy.RUNTIME)
17 | @Conditional(OnPropertyExistsCondition.class)
18 | public @interface ConditionalOnPropertyExists {
19 |
20 | /**
21 | * 当条件只受单个配置项约束,或者有多个配置项但前缀名称不一致时,建议使用该方法;
22 | * 注意:使用该方法必须填写配置项的全名
23 | * 如果使用了该方法,还使用了{@link #prefix()}和{@link #name()},则会取他们的并集做匹配
24 | */
25 | String[] value() default {};
26 |
27 | /**
28 | * 如果有多个配置项,且具有同样的前缀名,建议使用该方法加{@link #name()}的形式,该方法需要与{@link #name()}联合使用
29 | */
30 | String prefix() default "";
31 |
32 | /**
33 | * 配置项的名称,该方法需要与{@link #prefix()}联合使用,prefix + "." + name 视为一个完整的配置项名称
34 | */
35 | String[] name() default {};
36 | }
37 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/condition/ConditionalOnPropertyMissing.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.condition;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | import org.springframework.context.annotation.Conditional;
9 |
10 | /**
11 | * 匹配条件:指定配置项必须 不存在;仅当指定的所有配置项不存在的情况下,条件成立
12 | *
13 | * @author fagarine
14 | */
15 | @Target({ ElementType.TYPE, ElementType.METHOD })
16 | @Retention(RetentionPolicy.RUNTIME)
17 | @Conditional(OnPropertyMissingCondition.class)
18 | public @interface ConditionalOnPropertyMissing {
19 |
20 | /**
21 | * 当条件只受单个配置项约束,或者有多个配置项但前缀名称不一致时,建议使用该方法;
22 | * 注意:使用该方法必须填写配置项的全名
23 | * 如果使用了该方法,还使用了{@link #prefix()}和{@link #name()},则会取他们的并集做匹配
24 | */
25 | String[] value() default {};
26 |
27 | /**
28 | * 如果有多个配置项,且具有同样的前缀名,建议使用该方法加{@link #name()}的形式,该方法需要与{@link #name()}联合使用
29 | */
30 | String prefix() default "";
31 |
32 | /**
33 | * 配置项的名称,该方法需要与{@link #prefix()}联合使用,prefix + "." + name 视为一个完整的配置项名称
34 | */
35 | String[] name() default {};
36 |
37 | }
38 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/condition/ConditionalOnPropertyValue.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.condition;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | import org.springframework.context.annotation.Conditional;
9 |
10 | /**
11 | * 匹配条件:指定配置项的值,必须包含指定值
12 | *
13 | * @author fagarine
14 | */
15 | @Target({ ElementType.TYPE, ElementType.METHOD })
16 | @Retention(RetentionPolicy.RUNTIME)
17 | @Conditional(OnPropertyValueCondition.class)
18 | public @interface ConditionalOnPropertyValue {
19 |
20 | /**
21 | * 配置项名称,全名,例如: dk.default-dao
22 | */
23 | String[] propertyName() default {};
24 |
25 | /**
26 | * 配置项的值中,必须包含的内容,仅在配置项的值不为空时有效。
27 | *
28 | * 注意以下特殊情况:
29 | * 如果本方法返回空字符串,表示不管配置项是否存在,都匹配成功;
30 | * 如果在配置信息中找不到对应配置项的值,则默认表示匹配成功
31 | *
32 | */
33 | String havingValue() default "";
34 |
35 | /**
36 | * 配置项不存在时,是否匹配;如果本方法返回true,当配置项不存在时,则匹配不通过,否则匹配通过
37 | */
38 | boolean matchIfMissing() default false;
39 | }
40 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/condition/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 该包下提供Spring组件部分自动配置条件
3 | *
4 | * 其实spring-boot-autoconfigure项目提供了更多更强大的条件,但是为了增加项目的可扩展性,减小项目的固定依赖,故而项目中单独实现了部分常用条件
5 | *
6 | *
7 | * @author fagarine
8 | * @see org.springframework.context.annotation.Conditional
9 | * @see org.springframework.context.annotation.Condition
10 | */
11 | package cn.laoshini.dk.condition;
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/constant/ConstTableSourceEnum.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.constant;
2 |
3 | /**
4 | * 配置表单数据来源枚举
5 | *
6 | * @author fagarine
7 | */
8 | public enum ConstTableSourceEnum {
9 | /**
10 | * excel文件
11 | */
12 | EXCEL,
13 | /**
14 | * JSON文件
15 | */
16 | JSON,
17 | /**
18 | * 数据库
19 | */
20 | DB,
21 | ;
22 |
23 | }
24 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/constant/DBTypeEnum.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.constant;
2 |
3 | /**
4 | * 关系数据库类型
5 | *
6 | * @author fagarine
7 | */
8 | public enum DBTypeEnum {
9 | /**
10 | * 系统默认使用数据库
11 | */
12 | MYSQL,
13 | SQL_SERVER,
14 | ORACLE,
15 | DB2,
16 | ;
17 | }
18 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/constant/ExpressionConstant.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.constant;
2 |
3 | /**
4 | * @author fagarine
5 | */
6 | public class ExpressionConstant {
7 | private ExpressionConstant() {
8 | }
9 |
10 | public static final String REQ_MESSAGE_PARAM = "req";
11 |
12 | public static final String REQ_MESSAGE_DATA = "reqData";
13 |
14 | public static final String GAME_SUBJECT_PARAM = "subject";
15 |
16 | public static final String RETURN_PARAM = "_ret";
17 |
18 | public static final String JS_DEPENDENCY_FUNCTION = "expressionDependencies()";
19 |
20 | /**
21 | * 表达式类型枚举
22 | */
23 | public enum ExpressionTypeEnum {
24 | /**
25 | * Spring表达式Spel
26 | */
27 | SPEL,
28 | /**
29 | * JavaScript脚本
30 | */
31 | JS,
32 | ;
33 | }
34 |
35 | /**
36 | * 表达式代码分类枚举
37 | */
38 | public enum ExpressionCodeType {
39 | /**
40 | * 逻辑代码
41 | */
42 | LOGIC,
43 | /**
44 | * 依赖声明
45 | */
46 | DEPENDENCY,
47 | ;
48 | }
49 |
50 | }
51 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/constant/GameServerProtocolEnum.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.constant;
2 |
3 | /**
4 | * 游戏服通信协议类型枚举
5 | *
6 | * @author fagarine
7 | */
8 | public enum GameServerProtocolEnum {
9 |
10 | /**
11 | * TCP
12 | */
13 | TCP,
14 | UDP,
15 | HTTP,
16 | WEBSOCKET;
17 | }
18 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/constant/GameServerStatus.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.constant;
2 |
3 | import java.util.HashMap;
4 | import java.util.Map;
5 |
6 | /**
7 | * 游戏服状态枚举
8 | *
9 | * @author fagarine
10 | */
11 | public enum GameServerStatus {
12 |
13 | /**
14 | * 运行中
15 | */
16 | RUN(1),
17 |
18 | /**
19 | * 已停止业务
20 | */
21 | PAUSE(2),
22 |
23 | /**
24 | * 已关闭,未启动
25 | */
26 | CLOSE(3),
27 |
28 | ;
29 |
30 | private static final Map CODE_TO_STATUS = new HashMap<>(values().length);
31 |
32 | static {
33 | for (GameServerStatus status : values()) {
34 | CODE_TO_STATUS.put(status.code, status);
35 | }
36 | }
37 |
38 | private int code;
39 |
40 | GameServerStatus(int code) {
41 | this.code = code;
42 | }
43 |
44 | public static GameServerStatus getByCode(int code) {
45 | return CODE_TO_STATUS.get(code);
46 | }
47 |
48 | public int getCode() {
49 | return code;
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/constant/GeneratorTypeEnum.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.constant;
2 |
3 | /**
4 | * @author fagarine
5 | */
6 | public enum GeneratorTypeEnum {
7 |
8 | /**
9 | * 自定义格式消息
10 | */
11 | CUSTOM_MESSAGE,
12 |
13 | HANDLER,
14 |
15 | ;
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/constant/HotfixResultEnum.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.constant;
2 |
3 | /**
4 | * 热修复执行结果枚举
5 | *
6 | * @author fagarine
7 | */
8 | public enum HotfixResultEnum {
9 |
10 | /**
11 | * 执行成功
12 | */
13 | SUCCEED("执行成功"),
14 |
15 | /**
16 | * 类文件没有改变
17 | */
18 | NO_CHANGE("类文件没有改变"),
19 |
20 | /**
21 | * 未找到类
22 | */
23 | NO_CLASS("类未找到"),
24 |
25 | /**
26 | * 未找到agent
27 | */
28 | NO_AGENT("未找到agent"),
29 |
30 | /**
31 | * 执行出错
32 | */
33 | EXCEPTION("执行出错"),
34 |
35 | ;
36 |
37 | private String desc;
38 |
39 | HotfixResultEnum(String desc) {
40 | this.desc = desc;
41 | }
42 |
43 | public String getDesc() {
44 | return desc;
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/constant/InnerTableNameConst.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.constant;
2 |
3 | /**
4 | * @author fagarine
5 | */
6 | public class InnerTableNameConst {
7 | private InnerTableNameConst() {
8 | }
9 |
10 | public static final String GAME_CONFIG = "game_config";
11 |
12 | public static final String GAME_ROLE = "game_role";
13 |
14 | public static final String GAME_USER = "game_user";
15 |
16 | public static final String HANDLER_EXPRESSION = "handler_expression";
17 |
18 | public static final String HOTFIX_RECORD = "hotfix_record";
19 |
20 | public static final String MIXED_GAME_SERVER_INFO = "mixed_game_server_info";
21 | }
22 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/constant/MessageFormatEnum.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.constant;
2 |
3 | /**
4 | * 消息格式类型枚举
5 | *
6 | * @author fagarine
7 | */
8 | public enum MessageFormatEnum {
9 |
10 | /**
11 | * json,对应普通的JavaBean,比如DTO、VO等
12 | */
13 | JSON,
14 | /**
15 | * protobuf
16 | */
17 | PROTOBUF,
18 | /**
19 | * 自定义消息格式
20 | */
21 | CUSTOM,
22 | ;
23 | }
24 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/constant/ModuleConstant.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.constant;
2 |
3 | import java.util.LinkedHashSet;
4 | import java.util.Set;
5 | import java.util.regex.Pattern;
6 |
7 | /**
8 | * 外置模块功能相关常量
9 | *
10 | * @author fagarine
11 | */
12 | public class ModuleConstant {
13 | private ModuleConstant() {
14 | }
15 |
16 | /**
17 | * 系统可识别的,外置模块的配置文件后缀名
18 | */
19 | public static final String[] MODULE_CONFIG_FILE_SUFFIX = { ".properties", ".yaml", ".yml" };
20 |
21 | /**
22 | * 外置模块系统,模块配置文件名称命名规则(加载模块时,系统会去查找符合规则的配置文件,并且以先找到的配置文件中的配置信息为准)
23 | */
24 | public static final String[] MODULE_CONFIG_FILE_REG_EXP = { "^application-[A-Za-z0-9_-]+$", "^[A-Za-z0-9_-]+$" };
25 |
26 | public static final Set MODULE_CONFIG_FILE_PATTERNS = new LinkedHashSet<>(
27 | MODULE_CONFIG_FILE_REG_EXP.length);
28 |
29 | static {
30 | for (String regExp : MODULE_CONFIG_FILE_REG_EXP) {
31 | MODULE_CONFIG_FILE_PATTERNS.add(Pattern.compile(regExp));
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/constant/PropertyKeyConstants.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.constant;
2 |
3 | /**
4 | * 当康系统配置项参数key常量
5 | *
6 | * @author fagarine
7 | */
8 | public class PropertyKeyConstants {
9 | private PropertyKeyConstants() {
10 | }
11 |
12 | /**
13 | * 当康项目所有配置参数key的前缀
14 | */
15 | public static final String DANG_KANG_PROPERTY_KEY_PREFIX = "dk";
16 |
17 | /**
18 | * 模块名称
19 | */
20 | public static final String MODULE_NAME_KEY = "dk.module.name";
21 | /**
22 | * 模块描述信息
23 | */
24 | public static final String MODULE_DESCRIPTION_KEY = "dk.module.description";
25 |
26 | }
27 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/constant/QueryConditionKeyEnum.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.constant;
2 |
3 | /**
4 | * @author fagarine
5 | */
6 | public enum QueryConditionKeyEnum {
7 |
8 | /**
9 | * 数据库名
10 | */
11 | DB_NAME("DB_NAME", "数据库名"),
12 | TABLE_NAME("TABLE_NAME", "表名"),
13 | COLUMN_NAME("COLUMN_NAME", "列名"),
14 | UNIQUE_KEY("UNIQUE_KEY", "全表唯一标识"),
15 | ;
16 |
17 | private String key;
18 |
19 | private String cnName;
20 |
21 | QueryConditionKeyEnum(String key, String cnName) {
22 | this.key = key;
23 | this.cnName = cnName;
24 | }
25 |
26 | public String getKey() {
27 | return key;
28 | }
29 |
30 | public String getCnName() {
31 | return cnName;
32 | }
33 |
34 | }
35 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/constant/RoleStatusEnum.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.constant;
2 |
3 | /**
4 | * @author fagarine
5 | */
6 | public enum RoleStatusEnum {
7 | /**
8 | * 正常
9 | */
10 | NORMAL((short) 1),
11 | /**
12 | * 封号
13 | */
14 | LOCKED((short) 10),
15 | /**
16 | * 禁止登陆
17 | */
18 | FORBIDDEN((short) 20),
19 | /**
20 | * 无效
21 | */
22 | INVALID((short) 30),
23 | ;
24 |
25 | public static boolean isValidStatus(short code) {
26 | return NORMAL.code == code;
27 | }
28 |
29 | private short code;
30 |
31 | RoleStatusEnum(short code) {
32 | this.code = code;
33 | }
34 |
35 | public int getCode() {
36 | return code;
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/constant/ServerType.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.constant;
2 |
3 | /**
4 | * 游戏服务器(按功能、作用分)类型枚举
5 | *
6 | * @author fagarine
7 | */
8 | public enum ServerType {
9 |
10 | /**
11 | * 游戏服
12 | */
13 | GAME,
14 |
15 | /**
16 | * 游戏管理服务器,与游戏服在同一进程,共用数据,一般负责与后台管理服务器通信
17 | */
18 | GM,
19 |
20 | /**
21 | * 后台管理服务器
22 | */
23 | CONSOLE,
24 |
25 | /**
26 | * 帐号管理,用户登录服务器
27 | */
28 | ACCOUNT,
29 |
30 | /**
31 | * 用户充值、支付服务器
32 | */
33 | RECHARGE,
34 |
35 | ;
36 |
37 | }
38 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/constant/UseTypeEnum.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.constant;
2 |
3 | /**
4 | * Class用途分类枚举,按用途对Class分类
5 | *
6 | * @author fagarine
7 | */
8 | public enum UseTypeEnum {
9 | /**
10 | * POJO类、普通实例类
11 | */
12 | ORDINARY,
13 |
14 | /**
15 | * 静态工具类
16 | */
17 | UTIL,
18 |
19 | /**
20 | * 自定义格式消息DTO类
21 | */
22 | DTO,
23 |
24 | /**
25 | * Spring托管类
26 | */
27 | SPRING_BEAN,
28 |
29 | /**
30 | * 资源持有者
31 | */
32 | HOLDER,
33 |
34 | ;
35 | }
36 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/constant/UserStatusEnum.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.constant;
2 |
3 | /**
4 | * 用户帐号状态枚举
5 | *
6 | * @author fagarine
7 | */
8 | public enum UserStatusEnum {
9 |
10 | /**
11 | * 正常
12 | */
13 | NORMAL((short) 1),
14 | /**
15 | * 封号
16 | */
17 | LOCKED((short) 10),
18 | /**
19 | * 禁止登陆
20 | */
21 | FORBIDDEN((short) 20),
22 | /**
23 | * 无效
24 | */
25 | INVALID((short) 30),
26 | ;
27 |
28 | public static boolean isValidStatus(short code) {
29 | return NORMAL.code == code;
30 | }
31 |
32 | private short code;
33 |
34 | UserStatusEnum(short code) {
35 | this.code = code;
36 | }
37 |
38 | public int getCode() {
39 | return code;
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/dao/IBasicDao.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.dao;
2 |
3 | /**
4 | * 公用数据库访问对象定义接口,用于系统内部数据(例如用户配置数据等)的访问
5 | *
6 | * @author fagarine
7 | */
8 | public interface IBasicDao {
9 | }
10 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/dao/IEntityClassManager.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.dao;
2 |
3 | import java.util.List;
4 | import java.util.Map;
5 |
6 | import cn.laoshini.dk.annotation.ConfigurableFunction;
7 |
8 | /**
9 | * 实体类管理
10 | *
11 | * @author fagarine
12 | */
13 | @ConfigurableFunction(key = "dk.rdb.entity-manager")
14 | public interface IEntityClassManager {
15 |
16 | /**
17 | * 注册表与实体类的映射关系
18 | *
19 | * @param tableName 表名
20 | * @param tableClass 实体类
21 | */
22 | void registerEntityClass(String tableName, Class> tableClass);
23 |
24 | /**
25 | * 批量注册
26 | *
27 | * @param map key:表名称,value:对应的类
28 | */
29 | void batchRegister(Map> map);
30 |
31 | /**
32 | * 预备批量注销
33 | *
34 | * @param classLoader 类加载器
35 | */
36 | void prepareUnregister(ClassLoader classLoader);
37 |
38 | /**
39 | * 取消注销预备操作
40 | */
41 | void cancelPrepareUnregister();
42 |
43 | /**
44 | * 批量注销
45 | */
46 | void unregister();
47 |
48 | boolean containsClass(Class> clazz);
49 |
50 | String getClassTableName(String className);
51 |
52 | Class> getTableBeanClass(String tableName);
53 |
54 | List getTableNames();
55 |
56 | }
57 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/dao/IRelationalDbDaoManager.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.dao;
2 |
3 | import cn.laoshini.dk.annotation.ConfigurableFunction;
4 |
5 | /**
6 | * 关系数据库数据访问对象管理接口
7 | *
8 | * @author fagarine
9 | */
10 | @ConfigurableFunction(key = "dk.rdb.manager", description = "关系数据库数据访问对象管理")
11 | public interface IRelationalDbDaoManager {
12 |
13 | /**
14 | * 获取有效的数据库访问对象
15 | *
16 | * @param tableName 表名
17 | * @param clazz 实体类类型
18 | * @param 实体类类型
19 | * @return 该方法不会返回null
20 | */
21 | IRelationalDbDao getValidDbDao(String tableName, Class clazz);
22 |
23 | /**
24 | * 验证表是否存在
25 | *
26 | * @param tableName 表名
27 | * @return 验证结果
28 | */
29 | boolean validateTable(String tableName);
30 | }
31 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/dao/TableKey.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.dao;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | /**
9 | * 用于标记类变量,表示该字段为主键,
10 | *
11 | * 注意:使用该注解,必须保证该类已被@{@link TableMapping}标记,否则单独使用无效
12 | * 另外:如果一个类中有多个字段被标记,则会被视为联合主键看待
13 | *
14 | *
15 | * @author fagarine
16 | */
17 | @Target(ElementType.FIELD)
18 | @Retention(RetentionPolicy.RUNTIME)
19 | public @interface TableKey {
20 |
21 | /**
22 | * 描述信息,不可用于具体的业务逻辑
23 | */
24 | String value() default "";
25 |
26 | /**
27 | * 是否是自增字段
28 | */
29 | boolean autoIncrement() default false;
30 |
31 | }
32 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/dao/update/SqlWrapper.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.dao.update;
2 |
3 | import java.util.Map;
4 |
5 | /**
6 | * @author fagarine
7 | */
8 | public class SqlWrapper {
9 |
10 | protected String tableName;
11 |
12 | protected Class> entityType;
13 |
14 | protected Map condition;
15 |
16 | public String getTableName() {
17 | return tableName;
18 | }
19 |
20 | public void setTableName(String tableName) {
21 | this.tableName = tableName;
22 | }
23 |
24 | public Class> getEntityType() {
25 | return entityType;
26 | }
27 |
28 | public void setEntityType(Class> entityType) {
29 | this.entityType = entityType;
30 | }
31 |
32 | public Map getCondition() {
33 | return condition;
34 | }
35 |
36 | public void setCondition(Map condition) {
37 | this.condition = condition;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/dao/update/UpdateSqlWrapper.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.dao.update;
2 |
3 | import java.util.Map;
4 |
5 | /**
6 | * @author fagarine
7 | */
8 | public class UpdateSqlWrapper extends SqlWrapper {
9 |
10 | protected Map updateValues;
11 |
12 | public Map getUpdateValues() {
13 | return updateValues;
14 | }
15 |
16 | public void setUpdateValues(Map updateValues) {
17 | this.updateValues = updateValues;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/domain/GameSubject.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.domain;
2 |
3 | import java.io.Serializable;
4 |
5 | import cn.laoshini.dk.net.session.AbstractSession;
6 |
7 | /**
8 | * 游戏主体,消息到达后的接收方,一般为玩家
9 | *
10 | * @author fagarine
11 | */
12 | public class GameSubject implements Serializable {
13 |
14 | private static final long serialVersionUID = 1L;
15 |
16 | private AbstractSession session;
17 |
18 | public int getGameId() {
19 | return 0;
20 | }
21 |
22 | public int getServerId() {
23 | return 0;
24 | }
25 |
26 | public AbstractSession getSession() {
27 | return session;
28 | }
29 |
30 | public void setSession(AbstractSession session) {
31 | this.session = session;
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/domain/common/ClassDescriptor.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.domain.common;
2 |
3 | import java.io.Serializable;
4 |
5 | import lombok.Data;
6 |
7 | /**
8 | * @author fagarine
9 | */
10 | @Data
11 | public class ClassDescriptor implements Serializable {
12 |
13 | private static final long serialVersionUID = 1L;
14 |
15 | private String className;
16 |
17 | private String simpleName;
18 |
19 | private String type;
20 |
21 | private String comment;
22 | }
23 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/domain/common/HotfixFile.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.domain.common;
2 |
3 | import lombok.Getter;
4 | import lombok.Setter;
5 | import lombok.ToString;
6 |
7 | /**
8 | * 热修复文件信息
9 | *
10 | * @author fagarine
11 | */
12 | @Getter
13 | @Setter
14 | @ToString
15 | public class HotfixFile {
16 |
17 | /**
18 | * 类的全限定名
19 | */
20 | private String fullClassName;
21 |
22 | /**
23 | * 类文件的绝对路径
24 | */
25 | private String filePath;
26 |
27 | /**
28 | * 文件的最后修改时间
29 | */
30 | private long lastModifyTime;
31 | }
32 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/domain/common/MethodDescriptor.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.domain.common;
2 |
3 | import java.io.Serializable;
4 | import java.util.List;
5 |
6 | import lombok.Data;
7 |
8 | /**
9 | * @author fagarine
10 | */
11 | @Data
12 | public class MethodDescriptor implements Serializable {
13 |
14 | private static final long serialVersionUID = 1L;
15 |
16 | private String name;
17 |
18 | private String comment;
19 |
20 | private List> params;
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/entity/HotfixRecord.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.entity;
2 |
3 | import java.io.Serializable;
4 | import java.util.Date;
5 |
6 | import lombok.Getter;
7 | import lombok.Setter;
8 | import lombok.ToString;
9 |
10 | import cn.laoshini.dk.constant.InnerTableNameConst;
11 | import cn.laoshini.dk.dao.TableKey;
12 | import cn.laoshini.dk.dao.TableMapping;
13 |
14 | /**
15 | * 热修复执行结果记录
16 | *
17 | * @author fagarine
18 | */
19 | @Getter
20 | @Setter
21 | @ToString
22 | @TableMapping(value = InnerTableNameConst.HOTFIX_RECORD, description = "热修复记录")
23 | public class HotfixRecord implements Serializable {
24 |
25 | private static final long serialVersionUID = 1L;
26 |
27 | @TableKey
28 | private int id;
29 |
30 | /**
31 | * 热更key,用于区分是否是同一次热更操作,可以是热更说明信息等
32 | */
33 | private String hotfixKey;
34 |
35 | /**
36 | * 热更类名
37 | */
38 | private String className;
39 |
40 | /**
41 | * 热更时间
42 | */
43 | private Date hotfixTime;
44 |
45 | /**
46 | * 热更结果
47 | */
48 | private String result;
49 |
50 | /**
51 | * 描述信息
52 | */
53 | private String desc;
54 | }
55 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/exception/CacheException.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.exception;
2 |
3 | /**
4 | * @author fagarine
5 | */
6 | public class CacheException extends DkRuntimeException {
7 | public CacheException(String errorKey, String message) {
8 | super(errorKey, message);
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/exception/DaoException.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.exception;
2 |
3 | /**
4 | * @author fagarine
5 | */
6 | public class DaoException extends DkRuntimeException {
7 | public DaoException(String errorKey, String message) {
8 | super(errorKey, message);
9 | }
10 |
11 | public DaoException(String errorKey, String message, Throwable cause) {
12 | super(errorKey, message, cause);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/exception/JitException.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.exception;
2 |
3 | /**
4 | * @author fagarine
5 | */
6 | public class JitException extends DkRuntimeException {
7 | public JitException(String message, Throwable cause) {
8 | super(message, cause);
9 | }
10 |
11 | public JitException(String errorKey, String message) {
12 | super(errorKey, message);
13 | }
14 |
15 | public JitException(String errorKey, String message, Throwable cause) {
16 | super(errorKey, message, cause);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/executor/AbstractOrderedWorker.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.executor;
2 |
3 | import cn.laoshini.dk.util.LogUtil;
4 |
5 | /**
6 | * 有序队列工作者线程
7 | *
8 | * @author fagarine
9 | */
10 | public abstract class AbstractOrderedWorker implements Runnable {
11 |
12 | @Override
13 | public void run() {
14 | try {
15 | action();
16 | } catch (Throwable t) {
17 | LogUtil.error("有序任务执行出错", t);
18 | }
19 | }
20 |
21 | /**
22 | * 执行具体的业务逻辑
23 | */
24 | protected abstract void action();
25 |
26 | /**
27 | * 任务加入队列后,记录所属队列
28 | */
29 | private TaskQueue taskQueue;
30 |
31 | public TaskQueue getTaskQueue() {
32 | return taskQueue;
33 | }
34 |
35 | public void setTaskQueue(TaskQueue taskQueue) {
36 | this.taskQueue = taskQueue;
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/executor/IOrderedExecutor.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.executor;
2 |
3 | import cn.laoshini.dk.annotation.ConfigurableFunction;
4 |
5 | /**
6 | * 有序线程池接口
7 | *
8 | * 该接口的实现类,需要提供一个包含三个指定参数的构造方法,这三个参数为:
9 | *
10 | * - name: 线程池名称
11 | * - corePoolSize: 核心线程数量
12 | * - maxQueueSize: 单个任务队列的最大长度,当队列达到该长度时,新到的任务将被抛弃;仅为正整数时有效
13 | *
14 | *
15 | *
16 | * @param 任务标识的类型,该类型需要与实现类使用的{@link OrderedQueuePool}中的 K 类型一致
17 | * @author fagarine
18 | */
19 | @ConfigurableFunction(key = "dk.ordered.executor", description = "有序线程池")
20 | public interface IOrderedExecutor {
21 |
22 | /**
23 | * 添加任务
24 | *
25 | * @param key 任务的标识,用来选择任务队列
26 | * @param task 待执行任务
27 | * @return 返回是否成功加入队列
28 | */
29 | boolean addTask(KeyType key, AbstractOrderedWorker task);
30 | }
31 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/executor/IOrderedExecutorGroup.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.executor;
2 |
3 | /**
4 | * @author fagarine
5 | */
6 | public interface IOrderedExecutorGroup {
7 |
8 | IOrderedExecutor getExecutor(int index);
9 | }
10 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/executor/NonOrderedQueuePoolExecutor.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.executor;
2 |
3 | import java.util.concurrent.LinkedBlockingQueue;
4 | import java.util.concurrent.ThreadPoolExecutor;
5 | import java.util.concurrent.TimeUnit;
6 |
7 | /**
8 | * 非有序线程池,用于不需要严格按顺序执行的任务
9 | *
10 | * @author fagarine
11 | */
12 | public class NonOrderedQueuePoolExecutor extends ThreadPoolExecutor {
13 | public NonOrderedQueuePoolExecutor(int corePoolSize) {
14 | super(corePoolSize, corePoolSize * 2, 30, TimeUnit.SECONDS, new LinkedBlockingQueue());
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/executor/OrderedQueuePool.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.executor;
2 |
3 | import java.util.Map;
4 | import java.util.concurrent.ConcurrentHashMap;
5 |
6 | /**
7 | * 有序任务队列池
8 | *
9 | * @author fagarine
10 | */
11 | public class OrderedQueuePool {
12 |
13 | private final Map> taskQueueMap = new ConcurrentHashMap<>();
14 |
15 | /**
16 | * 获得非空任务队列,如果队列不存在,则创建一个返回
17 | *
18 | * @param key 队列key
19 | * @return 该方法不会返回null
20 | */
21 | public TaskQueue getTaskQueue(K key) {
22 | synchronized (taskQueueMap) {
23 | return taskQueueMap.computeIfAbsent(key, (k) -> new TaskQueue<>());
24 | }
25 | }
26 |
27 | /**
28 | * 获得全部任务队列
29 | *
30 | * @return 该方法不会返回null
31 | */
32 | public Map> getTaskQueues() {
33 | return taskQueueMap;
34 | }
35 |
36 | /**
37 | * 移除任务队列
38 | *
39 | * @param key 队列key
40 | */
41 | public void removeTaskQueue(K key) {
42 | taskQueueMap.remove(key);
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/expression/BaseExpressionProcessor.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.expression;
2 |
3 | import cn.laoshini.dk.domain.dto.ExpressionDescriptorDTO;
4 |
5 | /**
6 | * @author fagarine
7 | */
8 | public abstract class BaseExpressionProcessor implements IExpressionProcessor {
9 |
10 | /**
11 | * 表达式描述信息
12 | */
13 | protected ExpressionDescriptorDTO descriptor;
14 |
15 | public ExpressionDescriptorDTO getDescriptor() {
16 | return descriptor;
17 | }
18 |
19 | public void setDescriptor(ExpressionDescriptorDTO descriptor) {
20 | this.descriptor = descriptor;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/expression/IExpressionProcessor.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.expression;
2 |
3 | /**
4 | * 表达式处理器的接口,该接口实现具体表达式的执行
5 | *
6 | * @author fagarine
7 | */
8 | public interface IExpressionProcessor {
9 |
10 | /**
11 | * 准备表达式执行条件
12 | */
13 | default void prepare() {
14 | }
15 |
16 | /**
17 | * 运行表达式,并返回执行结果
18 | *
19 | * @param logicContext 逻辑上下文内容
20 | * @return 返回执行结果
21 | */
22 | Object action(ExpressionLogicContext logicContext);
23 | }
24 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/expression/js/JavaScriptExpressionLogic.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.expression.js;
2 |
3 | import javax.script.ScriptContext;
4 | import javax.script.SimpleScriptContext;
5 |
6 | import cn.laoshini.dk.constant.ExpressionConstant;
7 | import cn.laoshini.dk.expression.BaseExpressionLogic;
8 | import cn.laoshini.dk.expression.IExpressionProcessor;
9 | import cn.laoshini.dk.util.CollectionUtil;
10 |
11 | /**
12 | * 使用JavaScript脚本实现的表达式逻辑处理类
13 | *
14 | * @author fagarine
15 | */
16 | public class JavaScriptExpressionLogic extends BaseExpressionLogic {
17 |
18 | public JavaScriptExpressionLogic() {
19 | super(ExpressionConstant.ExpressionTypeEnum.JS);
20 | }
21 |
22 | @Override
23 | protected void initProcessors() {
24 | super.initProcessors();
25 |
26 | if (CollectionUtil.isNotEmpty(processors())) {
27 | ScriptContext context = new SimpleScriptContext();
28 | for (IExpressionProcessor processor : processors()) {
29 | JavaScriptExpressionProcessor jsProcessor = (JavaScriptExpressionProcessor) processor;
30 | jsProcessor.setScriptContext(context);
31 | jsProcessor.prepare();
32 | }
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/expression/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 该包下实现表达式相关逻辑
3 | *
4 | *
5 | * 提供将表达式做为业务逻辑执行的功能,为其他需要使用表达式功能的模块提供支持
6 | *
7 | *
8 | * 由于当前有许多表达式语言,如Spel, Groovy等,所以系统不再单独去实现一套,而是封装直接使用,本系统默认使用Spel
9 | *
10 | *
11 | * @author fagarine
12 | */
13 | package cn.laoshini.dk.expression;
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/expression/spel/SpelExpressionLogic.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.expression.spel;
2 |
3 | import cn.laoshini.dk.constant.ExpressionConstant;
4 | import cn.laoshini.dk.expression.BaseExpressionLogic;
5 |
6 | /**
7 | * 使用Spring表达式实现的表达式逻辑处理类
8 | *
9 | * @author fagarine
10 | */
11 | public class SpelExpressionLogic extends BaseExpressionLogic {
12 |
13 | public SpelExpressionLogic() {
14 | super(ExpressionConstant.ExpressionTypeEnum.SPEL);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/function/FuncContainer.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.function;
2 |
3 | import java.util.Collection;
4 | import java.util.List;
5 | import java.util.Vector;
6 |
7 | import cn.laoshini.dk.util.CollectionUtil;
8 |
9 | /**
10 | * @author fagarine
11 | */
12 | enum FuncContainer {
13 | /**
14 | * 枚举实现单例
15 | */
16 | INSTANCE;
17 |
18 | private static final List FUNC_LIST = new Vector<>();
19 |
20 | static void add(Func> func) {
21 | FUNC_LIST.add(func);
22 | }
23 |
24 | static void refreshAll(Collection changedFunctionKeys) {
25 | // 移除无效的可配置功能依赖
26 | FUNC_LIST.removeIf(func -> {
27 | boolean valid = func.isValid();
28 | if (!valid) {
29 | func.clear();
30 | }
31 | return !valid;
32 | });
33 |
34 | if (!CollectionUtil.isEmpty(changedFunctionKeys)) {
35 | for (Func func : FUNC_LIST) {
36 | if (changedFunctionKeys.contains(func.getFunctionKey())) {
37 | func.refresh();
38 | }
39 | }
40 | }
41 | }
42 |
43 | }
44 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/generator/id/IIdIncrementer.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.generator.id;
2 |
3 | import cn.laoshini.dk.annotation.ConfigurableFunction;
4 | import cn.laoshini.dk.exception.BusinessException;
5 |
6 | /**
7 | * id自增功能的接口定义
8 | *
9 | * 特别需要注意的是,该类的实现类的构造方法中,必须有一个指向{@link #idName()}方法返回值相同参数的构造方法
10 | *
11 | *
12 | * @author fagarine
13 | */
14 | @ConfigurableFunction(key = "dk.id.incrementer", description = "id自增器")
15 | public interface IIdIncrementer {
16 |
17 | /**
18 | * 返回id自增器实例对应id的名称
19 | *
20 | * @return 实现类应该保证该方法不会返回null
21 | */
22 | String idName();
23 |
24 | /**
25 | * 自增并返回下一个id
26 | *
27 | * @return 正整数
28 | * @throws BusinessException 所有异常都封装为BusinessException抛出
29 | */
30 | long nextId() throws BusinessException;
31 | }
32 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/generator/id/IRoleIdGenerator.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.generator.id;
2 |
3 | import cn.laoshini.dk.annotation.ConfigurableFunction;
4 | import cn.laoshini.dk.exception.BusinessException;
5 | import cn.laoshini.dk.function.VariousWaysManager;
6 |
7 | /**
8 | * 游戏角色id生成器(实现类实现具体的生成规则和格式)
9 | *
10 | * @author fagarine
11 | */
12 | @ConfigurableFunction(key = "dk.id.role", description = "游戏角色id生成器")
13 | public interface IRoleIdGenerator {
14 |
15 | /**
16 | * 返回下一个角色id
17 | *
18 | * @param platNo 用户来源,渠道号
19 | * @param gameId 角色所属游戏id
20 | * @param serverId 角色所属服务器id
21 | * @return 正整数
22 | */
23 | long nextRoleId(int platNo, int gameId, int serverId) throws BusinessException;
24 |
25 | /**
26 | * 创建并返回一个id自增器,使用缺省名称("role_id")
27 | *
28 | * @return 如果找不到IIdIncrementer的实现类,会抛出异常
29 | */
30 | default IIdIncrementer newRoleIdIncrementer() {
31 | return VariousWaysManager.getFunctionCurrentImpl(IIdIncrementer.class, "role_id");
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/generator/id/IUserIdGenerator.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.generator.id;
2 |
3 | import cn.laoshini.dk.annotation.ConfigurableFunction;
4 | import cn.laoshini.dk.exception.BusinessException;
5 | import cn.laoshini.dk.function.VariousWaysManager;
6 |
7 | /**
8 | * 用户id生成器(实现类实现具体的生成规则和格式)
9 | *
10 | * @author fagarine
11 | */
12 | @ConfigurableFunction(key = "dk.id.user", description = "用户id生成器")
13 | public interface IUserIdGenerator {
14 |
15 | /**
16 | * 返回下一个用户id
17 | *
18 | * @param platNo 用户来源,渠道号
19 | * @return 正整数
20 | */
21 | long nextUserId(int platNo) throws BusinessException;
22 |
23 | /**
24 | * 创建并返回一个id自增器,使用缺省名称("user_id")
25 | *
26 | * @return 如果找不到IIdIncrementer的实现类,会抛出异常
27 | */
28 | default IIdIncrementer newUserIdIncrementer() {
29 | return VariousWaysManager.getFunctionCurrentImpl(IIdIncrementer.class, "user_id");
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/generator/id/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 自增id生成器相关
3 | *
4 | * @author fagarine
5 | */
6 | package cn.laoshini.dk.generator.id;
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/generator/name/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 游戏角色名称生成器相关
3 | *
4 | * @author fagarine
5 | */
6 | package cn.laoshini.dk.generator.name;
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/jit/JitClassLoader.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.jit;
2 |
3 | import java.io.File;
4 | import java.net.URL;
5 |
6 | import cn.laoshini.dk.exception.JitException;
7 | import cn.laoshini.dk.module.loader.ModuleClassLoader;
8 |
9 | /**
10 | * 运行时及时编译、加载的类加载器
11 | *
12 | * @author fagarine
13 | */
14 | public class JitClassLoader extends ModuleClassLoader {
15 | public JitClassLoader(URL[] urls, ClassLoader parent) {
16 | super(urls, parent);
17 | }
18 |
19 | public Class loadClass(String classFilePath, String className) {
20 | File classFile = new File(classFilePath);
21 | if (!classFile.exists() || classFile.isDirectory()) {
22 | throw new JitException("class.file.missing", "类文件不存在:" + classFilePath);
23 | }
24 |
25 | addURL(classFile);
26 |
27 | try {
28 | return (Class) loadClass(className);
29 | } catch (ClassNotFoundException e) {
30 | throw new JitException("load.class.error", String.format("加载类[%s]失败, file:%s", className, classFilePath));
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/jit/generator/CustomDtoClassFileGenerator.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.jit.generator;
2 |
3 | import java.nio.ByteBuffer;
4 |
5 | import cn.laoshini.dk.jit.type.CompositeBean;
6 | import cn.laoshini.dk.net.msg.ICustomDto;
7 |
8 | /**
9 | * 自定义格式消息(使用JDK自带的{@link ByteBuffer}作为缓冲区)DTO类的生成器
10 | *
11 | * @author fagarine
12 | */
13 | public class CustomDtoClassFileGenerator extends AbstractCustomDtoClassFileGenerator {
14 |
15 | public CustomDtoClassFileGenerator(CompositeBean compositeBean, ClassLoader classLoader) {
16 | super(compositeBean, classLoader, ByteBuffer.class.getName(), ICustomDto.class.getName());
17 | }
18 |
19 | @Override
20 | public String candidateClassNamePrefix() {
21 | return "CustomDto";
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/jit/generator/NettyCustomDtoClassFileGenerator.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.jit.generator;
2 |
3 | import cn.laoshini.dk.jit.type.CompositeBean;
4 |
5 | /**
6 | * 自定义格式消息(使用Netty的ByteBuf作为缓冲区)DTO类的生成器
7 | *
8 | * @author fagarine
9 | */
10 | public class NettyCustomDtoClassFileGenerator extends AbstractCustomDtoClassFileGenerator {
11 | public NettyCustomDtoClassFileGenerator(CompositeBean compositeBean, ClassLoader classLoader) {
12 | super(compositeBean, classLoader, "io.netty.buffer.ByteBuf", "cn.laoshini.dk.server.message.INettyDto");
13 | }
14 |
15 | @Override
16 | public String candidateClassNamePrefix() {
17 | return "NettyCustomDto";
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/jit/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 该包提供Java代码的动态生成和动态编译功能
3 | *
4 | * @author fagarine
5 | */
6 | package cn.laoshini.dk.jit;
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/jit/type/AbstractNumericTypeBean.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.jit.type;
2 |
3 | /**
4 | * @author fagarine
5 | */
6 | public abstract class AbstractNumericTypeBean extends AbstractTypeBean {
7 |
8 | private T min;
9 |
10 | private T max;
11 |
12 | public T getMin() {
13 | return min;
14 | }
15 |
16 | public void setMin(T min) {
17 | this.min = min;
18 | }
19 |
20 | public T getMax() {
21 | return max;
22 | }
23 |
24 | public void setMax(T max) {
25 | this.max = max;
26 | }
27 |
28 | @Override
29 | public String toString() {
30 | return "AbstractNumericTypeBean{" + "min=" + min + ", max=" + max + "} " + super.toString();
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/jit/type/BooleanBean.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.jit.type;
2 |
3 | import cn.laoshini.dk.constant.BeanTypeEnum;
4 |
5 | /**
6 | * @author fagarine
7 | */
8 | public class BooleanBean extends AbstractTypeBean {
9 |
10 | @Override
11 | public BeanTypeEnum getType() {
12 | return BeanTypeEnum.BOOLEAN;
13 | }
14 |
15 | @Override
16 | public Class getValueType() {
17 | return required() ? boolean.class : Boolean.class;
18 | }
19 |
20 | @Override
21 | public String toString() {
22 | return "BooleanBean{" + "name='" + name + '\'' + ", valueType=" + valueType + ", val=" + val + ", defaultVal="
23 | + defaultVal + ", description='" + description + '\'' + '}';
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/jit/type/ByteBean.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.jit.type;
2 |
3 | import cn.laoshini.dk.constant.BeanTypeEnum;
4 |
5 | /**
6 | * @author fagarine
7 | */
8 | public class ByteBean extends AbstractNumericTypeBean {
9 | @Override
10 | public BeanTypeEnum getType() {
11 | return BeanTypeEnum.BYTE;
12 | }
13 |
14 | @Override
15 | public Class getValueType() {
16 | return required() ? byte.class : Byte.class;
17 | }
18 |
19 | @Override
20 | public String toString() {
21 | return "ByteBean{" + "name='" + name + '\'' + ", valueType=" + valueType + ", val=" + val + ", defaultVal="
22 | + defaultVal + ", description='" + description + '\'' + '}';
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/jit/type/CompositeBean.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.jit.type;
2 |
3 | import java.util.Collections;
4 | import java.util.List;
5 |
6 | import cn.laoshini.dk.constant.BeanTypeEnum;
7 |
8 | /**
9 | * @author fagarine
10 | */
11 | public class CompositeBean extends AbstractTypeBean> {
12 |
13 | public CompositeBean() {
14 | super();
15 | setDefaultVal(Collections.emptyList());
16 | }
17 |
18 | @Override
19 | public BeanTypeEnum getType() {
20 | return BeanTypeEnum.COMPOSITE;
21 | }
22 |
23 | @Override
24 | public String toString() {
25 | return "CompositeBean{" + "name='" + name + '\'' + ", valueType=" + valueType + ", val=" + val + ", defaultVal="
26 | + defaultVal + ", description='" + description + '\'' + '}';
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/jit/type/CompositeExtendBean.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.jit.type;
2 |
3 | import cn.laoshini.dk.net.msg.ICustomDto;
4 |
5 | /**
6 | * @author fagarine
7 | */
8 | public class CompositeExtendBean extends CompositeBean {
9 | }
10 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/jit/type/DoubleBean.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.jit.type;
2 |
3 | import cn.laoshini.dk.constant.BeanTypeEnum;
4 |
5 | /**
6 | * @author fagarine
7 | */
8 | public class DoubleBean extends AbstractNumericTypeBean {
9 |
10 | @Override
11 | public BeanTypeEnum getType() {
12 | return BeanTypeEnum.DOUBLE;
13 | }
14 |
15 | @Override
16 | public Class getValueType() {
17 | return required() ? double.class : Double.class;
18 | }
19 |
20 | @Override
21 | public String toString() {
22 | return "DoubleBean{" + "name='" + name + '\'' + ", valueType=" + valueType + ", val=" + val + ", defaultVal="
23 | + defaultVal + ", description='" + description + '\'' + '}';
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/jit/type/IntegerBean.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.jit.type;
2 |
3 | import cn.laoshini.dk.constant.BeanTypeEnum;
4 |
5 | /**
6 | * @author fagarine
7 | */
8 | public class IntegerBean extends AbstractNumericTypeBean {
9 |
10 | @Override
11 | public BeanTypeEnum getType() {
12 | return BeanTypeEnum.INTEGER;
13 | }
14 |
15 | @Override
16 | public Class getValueType() {
17 | return required() ? int.class : Integer.class;
18 | }
19 |
20 | @Override
21 | public String toString() {
22 | return "IntegerBean{" + "name='" + name + '\'' + ", valueType=" + valueType + ", val=" + val + ", defaultVal="
23 | + defaultVal + ", description='" + description + '\'' + '}';
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/jit/type/ListBean.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.jit.type;
2 |
3 | import java.util.List;
4 |
5 | import cn.laoshini.dk.constant.BeanTypeEnum;
6 |
7 | /**
8 | * @author fagarine
9 | */
10 | public class ListBean extends AbstractTypeBean> {
11 |
12 | private Class> actualClass;
13 |
14 | @Override
15 | public BeanTypeEnum getType() {
16 | return BeanTypeEnum.LIST;
17 | }
18 |
19 | public Class> getActualClass() {
20 | return actualClass;
21 | }
22 |
23 | public void setActualClass(Class> actualClass) {
24 | this.actualClass = actualClass;
25 | }
26 |
27 | @Override
28 | public String toString() {
29 | return "ListBean{" + "actualClass=" + actualClass + ", name='" + name + '\'' + ", valueType=" + valueType
30 | + ", val=" + val + ", defaultVal=" + defaultVal + ", description='" + description + '\'' + '}';
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/jit/type/LongBean.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.jit.type;
2 |
3 | import cn.laoshini.dk.constant.BeanTypeEnum;
4 |
5 | /**
6 | * @author fagarine
7 | */
8 | public class LongBean extends AbstractNumericTypeBean {
9 |
10 | @Override
11 | public BeanTypeEnum getType() {
12 | return BeanTypeEnum.LONG;
13 | }
14 |
15 | @Override
16 | public Class getValueType() {
17 | return required() ? long.class : Long.class;
18 | }
19 |
20 | @Override
21 | public String toString() {
22 | return "LongBean{" + "name='" + name + '\'' + ", valueType=" + valueType + ", val=" + val + ", defaultVal="
23 | + defaultVal + ", description='" + description + '\'' + '}';
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/jit/type/OrdinaryBean.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.jit.type;
2 |
3 | import cn.laoshini.dk.constant.BeanTypeEnum;
4 |
5 | /**
6 | * @author fagarine
7 | */
8 | public class OrdinaryBean extends AbstractTypeBean {
9 | @Override
10 | public BeanTypeEnum getType() {
11 | return BeanTypeEnum.ORDINARY;
12 | }
13 |
14 | @Override
15 | public String toString() {
16 | return "OrdinaryBean{" + "name='" + name + '\'' + ", valueType=" + valueType + ", val=" + val + ", defaultVal="
17 | + defaultVal + ", description='" + description + '\'' + '}';
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/jit/type/ShortBean.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.jit.type;
2 |
3 | import cn.laoshini.dk.constant.BeanTypeEnum;
4 |
5 | /**
6 | * @author fagarine
7 | */
8 | public class ShortBean extends AbstractNumericTypeBean {
9 | @Override
10 | public BeanTypeEnum getType() {
11 | return BeanTypeEnum.SHORT;
12 | }
13 |
14 | @Override
15 | public Class getValueType() {
16 | return required() ? short.class : Short.class;
17 | }
18 |
19 | @Override
20 | public String toString() {
21 | return "ShortBean{" + "name='" + name + '\'' + ", valueType=" + valueType + ", val=" + val + ", defaultVal="
22 | + defaultVal + ", description='" + description + '\'' + '}';
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/jit/type/StringBean.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.jit.type;
2 |
3 | import cn.laoshini.dk.constant.BeanTypeEnum;
4 |
5 | /**
6 | * @author fagarine
7 | */
8 | public class StringBean extends AbstractTypeBean {
9 |
10 | @Override
11 | public BeanTypeEnum getType() {
12 | return BeanTypeEnum.STRING;
13 | }
14 |
15 | @Override
16 | public Class getValueType() {
17 | return String.class;
18 | }
19 |
20 | @Override
21 | public String toString() {
22 | return "StringBean{" + "name='" + name + '\'' + ", valueType=" + valueType + ", val=" + val + ", defaultVal="
23 | + defaultVal + ", description='" + description + '\'' + '}';
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/jit/type/TypeBeanRecord.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.jit.type;
2 |
3 | import cn.laoshini.dk.constant.BeanTypeEnum;
4 |
5 | /**
6 | * @author fagarine
7 | */
8 | public final class TypeBeanRecord extends AbstractNumericTypeBean {
9 |
10 | private int beanTypeCode;
11 |
12 | @Override
13 | public BeanTypeEnum getType() {
14 | return BeanTypeEnum.codeOf(beanTypeCode);
15 | }
16 |
17 | public int getBeanTypeCode() {
18 | return beanTypeCode;
19 | }
20 |
21 | public void setBeanTypeCode(int beanTypeCode) {
22 | this.beanTypeCode = beanTypeCode;
23 | }
24 |
25 | @Override
26 | public String toString() {
27 | return "TypeBeanRecord{" + "beanTypeCode=" + beanTypeCode + "} " + super.toString();
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/listener/DkContextEvent.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.listener;
2 |
3 | import org.springframework.context.event.ApplicationContextEvent;
4 |
5 | import cn.laoshini.dk.common.SpringContextHolder;
6 |
7 | /**
8 | * @author fagarine
9 | */
10 | public class DkContextEvent extends ApplicationContextEvent {
11 |
12 | public DkContextEvent() {
13 | super(SpringContextHolder.getContext());
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/listener/DkEventPublisher.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.listener;
2 |
3 | import cn.laoshini.dk.common.SpringContextHolder;
4 |
5 | /**
6 | * 当康系统事件发布者
7 | *
8 | * @author fagarine
9 | */
10 | public class DkEventPublisher {
11 | private DkEventPublisher() {
12 | }
13 |
14 | /**
15 | * 发布事件
16 | *
17 | * @param event 事件对象
18 | */
19 | public static void publishEvent(DkContextEvent event) {
20 | SpringContextHolder.getContext().publishEvent(event);
21 | }
22 |
23 | }
24 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/listener/IDkContextListener.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.listener;
2 |
3 | import org.springframework.context.ApplicationListener;
4 |
5 | /**
6 | * 当康系统事件监听器接口
7 | *
8 | * @author fagarine
9 | */
10 | public interface IDkContextListener extends ApplicationListener {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/listener/PropertyChangedEvent.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.listener;
2 |
3 | import java.util.Collection;
4 |
5 | /**
6 | * 对应配置项有更新的事件
7 | *
8 | * @author fagarine
9 | */
10 | public class PropertyChangedEvent extends DkContextEvent {
11 |
12 | /**
13 | * 记录改变了的配置项key
14 | */
15 | private Collection changedPropertyKeys;
16 |
17 | public PropertyChangedEvent(Collection changedPropertyKeys) {
18 | this.changedPropertyKeys = changedPropertyKeys;
19 | }
20 |
21 | public PropertyChangedEvent() {
22 | this(null);
23 | }
24 |
25 | public Collection getChangedPropertyKeys() {
26 | return changedPropertyKeys;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/listener/PropertyChangedListener.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.listener;
2 |
3 | import java.util.LinkedHashSet;
4 | import java.util.Set;
5 |
6 | import org.springframework.stereotype.Component;
7 |
8 | import cn.laoshini.dk.support.IPropertyRefreshable;
9 |
10 | /**
11 | * 配置项更新事件监听器
12 | *
13 | * @author fagarine
14 | */
15 | @Component
16 | public class PropertyChangedListener implements IDkContextListener {
17 |
18 | private static Set refreshers = new LinkedHashSet<>();
19 |
20 | public static void addRefresher(IPropertyRefreshable refresher) {
21 | refreshers.add(refresher);
22 | }
23 |
24 | @Override
25 | public void onApplicationEvent(PropertyChangedEvent event) {
26 | for (IPropertyRefreshable refresher : refreshers) {
27 | refresher.refresh(event.getChangedPropertyKeys());
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/module/AbstractModuleRegistry.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.module;
2 |
3 | import cn.laoshini.dk.module.loader.ModuleClassLoader;
4 | import cn.laoshini.dk.module.loader.ModuleLoaderContext;
5 |
6 | /**
7 | * 模块功能注册表基本实现
8 | *
9 | * @author fagarine
10 | */
11 | public abstract class AbstractModuleRegistry implements IModuleRegistry {
12 |
13 | protected ModuleLoaderContext context;
14 |
15 | public AbstractModuleRegistry() {
16 | }
17 |
18 | public AbstractModuleRegistry(ModuleLoaderContext context) {
19 | this.context = context;
20 | }
21 |
22 | /**
23 | * 注销并清理数据,不允许子类再覆盖
24 | */
25 | @Override
26 | public final void unregister() {
27 | unregister0();
28 |
29 | cleanUp();
30 | }
31 |
32 | /**
33 | * 子类通过实现该方法注销
34 | */
35 | protected abstract void unregister0();
36 |
37 | /**
38 | * 注销后清理数据
39 | */
40 | protected void cleanUp() {
41 | context = null;
42 | }
43 |
44 | @Override
45 | public ModuleClassLoader getModuleClassLoader() {
46 | return context.getClassLoader();
47 | }
48 |
49 | }
50 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/module/IModuleRegistry.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.module;
2 |
3 | import java.util.jar.JarFile;
4 |
5 | /**
6 | * 模块功能注册表
7 | *
8 | * @author fagarine
9 | */
10 | public interface IModuleRegistry {
11 |
12 | /**
13 | * 获取模块的类加载器
14 | *
15 | * @return 返回类加载器
16 | */
17 | ClassLoader getModuleClassLoader();
18 |
19 | void prepareRegister(JarFile moduleJarFile);
20 |
21 | /**
22 | * 执行模块相关功能的注册
23 | *
24 | * @param moduleJarFile 模块对应的jar包对象
25 | */
26 | void register(JarFile moduleJarFile);
27 |
28 | /**
29 | * 准备注销注册信息,旧模块(热更后将被替换的模块称为旧模块)注册表调用
30 | */
31 | void prepareUnregister();
32 |
33 | /**
34 | * 执行注销操作,旧模块调用
35 | */
36 | void unregister();
37 |
38 | /**
39 | * 回退操作
40 | */
41 | void rollback();
42 |
43 | enum Phase {
44 | /**
45 | * 初始阶段,功能未注册
46 | */
47 | UNREGISTERED,
48 | /**
49 | * 已做好注册准备
50 | */
51 | PREPARE_REGISTER,
52 | /**
53 | * 已注册
54 | */
55 | REGISTERED,
56 | /**
57 | * 准备注销
58 | */
59 | PREPARE_UNREGISTER;
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/module/loader/ModuleLoaderContext.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.module.loader;
2 |
3 | import java.io.File;
4 |
5 | /**
6 | * 插拔式功能模块加载上下文对象
7 | *
8 | * @author fagarine
9 | */
10 | public class ModuleLoaderContext {
11 |
12 | private ModuleClassLoader classLoader;
13 |
14 | /**
15 | * 模块jar包文件
16 | */
17 | protected File moduleFile;
18 |
19 | public ModuleLoaderContext(ModuleClassLoader classLoader, File moduleFile) {
20 | this.classLoader = classLoader;
21 | this.moduleFile = moduleFile;
22 | }
23 |
24 | public String getModuleFilePath() {
25 | return moduleFile.getAbsolutePath();
26 | }
27 |
28 | public ModuleClassLoader getClassLoader() {
29 | return classLoader;
30 | }
31 |
32 | public void setClassLoader(ModuleClassLoader classLoader) {
33 | this.classLoader = classLoader;
34 | }
35 |
36 | public File getModuleFile() {
37 | return moduleFile;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/monitor/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 服务器状态监控相关
3 | *
4 | * @author fagarine
5 | */
6 | package cn.laoshini.dk.monitor;
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/net/codec/IByteMessageCodec.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.net.codec;
2 |
3 | import cn.laoshini.dk.domain.GameSubject;
4 |
5 | /**
6 | * 以字节数组形式交互的消息编解码器接口
7 | *
8 | * @param 消息体类型
9 | * @author fagarine
10 | */
11 | public interface IByteMessageCodec extends IMessageCodec {
12 |
13 | /**
14 | * 消息解码
15 | *
16 | * @param bytes 消息内容
17 | * @param subject 消息所属主体对象
18 | * @return 返回解码后的消息体
19 | */
20 | @Override
21 | MessageType decode(byte[] bytes, GameSubject subject);
22 |
23 | /**
24 | * 消息编码
25 | *
26 | * @param message 消息体
27 | * @param subject 消息所属主体对象
28 | * @return 返回编码后的消息内容
29 | */
30 | @Override
31 | byte[] encode(MessageType message, GameSubject subject);
32 |
33 | }
34 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/net/codec/IByteMessageEncoder.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.net.codec;
2 |
3 | import cn.laoshini.dk.domain.GameSubject;
4 |
5 | /**
6 | * 将消息编码成字节数组的编码器接口,功能单一(只负责消息编码),便于lambda编程
7 | *
8 | * @author fagarine
9 | */
10 | @FunctionalInterface
11 | public interface IByteMessageEncoder extends IMessageEncoder {
12 |
13 | /**
14 | * 创建并返回一个新的Protobuf消息编码器
15 | *
16 | * @return 返回Protobuf消息编码器
17 | */
18 | static ProtobufByteMessageEncoder newProtobufEncoder() {
19 | return new ProtobufByteMessageEncoder();
20 | }
21 |
22 | @Override
23 | default byte[] encode(M message, GameSubject subject) {
24 | return encode(message);
25 | }
26 |
27 | /**
28 | * 将传入消息对象编码成字节数组并返回
29 | *
30 | * @param message 消息内容
31 | * @return 返回编码后的数据,允许返回null
32 | */
33 | byte[] encode(M message);
34 | }
35 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/net/codec/IMessageCodec.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.net.codec;
2 |
3 | /**
4 | * 消息编解码器接口定义类
5 | *
6 | * @param 消息进入类型
7 | * @param 消息解码后的类型或编码前的类型
8 | * @author fagarine
9 | */
10 | public interface IMessageCodec extends IMessageEncoder, IMessageDecoder {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/net/codec/IMessageDecoder.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.net.codec;
2 |
3 | import cn.laoshini.dk.domain.GameSubject;
4 |
5 | /**
6 | * 消息解码器接口定义类
7 | *
8 | * @param 消息解码前的类型
9 | * @param 消息解码后的类型
10 | * @author fagarine
11 | */
12 | public interface IMessageDecoder {
13 |
14 | /**
15 | * 消息解码
16 | *
17 | * @param data 消息内容
18 | * @param subject 消息所属主体对象
19 | * @return 返回解码后的消息体
20 | */
21 | M decode(T data, GameSubject subject);
22 | }
23 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/net/codec/IMessageEncoder.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.net.codec;
2 |
3 | import cn.laoshini.dk.domain.GameSubject;
4 |
5 | /**
6 | * 消息编码器接口定义类
7 | *
8 | * @param 消息编码后的类型
9 | * @param 消息编码前的类型
10 | * @author fagarine
11 | */
12 | public interface IMessageEncoder {
13 |
14 | /**
15 | * 消息编码
16 | *
17 | * @param message 消息体
18 | * @param subject 消息所属主体对象
19 | * @return 返回编码后的消息内容
20 | */
21 | T encode(M message, GameSubject subject);
22 | }
23 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/net/codec/INettyMessageDecoder.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.net.codec;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import io.netty.channel.ChannelHandler;
5 | import io.netty.channel.ChannelHandlerContext;
6 |
7 | /**
8 | * 使用netty通信的消息到达后的解析器
9 | *
10 | * @param 解析后返回的消息类型
11 | * @author fagarine
12 | */
13 | public interface INettyMessageDecoder extends ChannelHandler, IMessageDecoder {
14 |
15 | @Override
16 | default void handlerAdded(ChannelHandlerContext ctx) throws Exception {
17 |
18 | }
19 |
20 | @Override
21 | default void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
22 |
23 | }
24 |
25 | @Override
26 | default void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
27 | // 消息解析实现这些不需要方法,在接口中做默认实现,避免影响子类
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/net/codec/INettyMessageEncoder.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.net.codec;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import io.netty.channel.ChannelHandler;
5 | import io.netty.channel.ChannelHandlerContext;
6 |
7 | /**
8 | * 使用netty通信的消息发送前的编码
9 | *
10 | * @param 编码前的消息类型
11 | * @author fagarine
12 | */
13 | public interface INettyMessageEncoder extends ChannelHandler, IMessageEncoder {
14 |
15 | @Override
16 | default void handlerAdded(ChannelHandlerContext ctx) throws Exception {
17 | // 消息编码实现这些不需要方法,在接口中做默认实现,避免影响子类
18 | }
19 |
20 | @Override
21 | default void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
22 | // 消息编码实现这些不需要方法,在接口中做默认实现,避免影响子类
23 | }
24 |
25 | @Override
26 | default void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
27 | // 消息编码实现这些不需要方法,在接口中做默认实现,避免影响子类
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/dk-core/src/main/java/cn/laoshini/dk/net/codec/JsonByteMessageEncoder.java:
--------------------------------------------------------------------------------
1 | package cn.laoshini.dk.net.codec;
2 |
3 | import cn.laoshini.dk.domain.msg.AbstractMessage;
4 | import cn.laoshini.dk.util.MessageUtil;
5 |
6 | /**
7 | * JSON格式消息编码器
8 | *
9 | * @author fagarine
10 | */
11 | public class JsonByteMessageEncoder implements IByteMessageEncoder> {
12 |
13 | @Override
14 | public byte[] encode(AbstractMessage