From 912240c8735f0573f4deaa1fd11a1229b2f1339a Mon Sep 17 00:00:00 2001 From: linrf Date: Tue, 13 Jun 2023 17:41:02 +0800 Subject: [PATCH] =?UTF-8?q?viewtask=20=E5=B0=81=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infrastructure/mapper/BlDeptMapper.java | 10 +- .../docus/server/bl/service/IBlService.java | 4 +- .../server/bl/service/impl/BlServiceImpl.java | 7 +- .../main/resources/mapper/BlDeptMapper.xml | 8 +- .../main/resources/mapper/BlTBasicMapper.xml | 6 +- .../main/resources/mapper/BlUserMapper.xml | 6 +- collect-sdry/src/main/resources/bootstrap.yml | 36 +- .../java/com/docus/server/collect/IJob.java | 2 +- .../collect/basic/ws/TBasicWsCollectJob.java | 11 +- .../collect/dept/ws/DeptWsCollectJob.java | 10 +- .../report/view/LisViewCollectJob.java | 56 + .../collect/web/common/BasicProperties.java | 16 + .../collect/web/common/DocusProperties.java | 93 ++ .../web/common/NoViewChNewbornProperties.java | 15 + .../collect/web/common/NoViewProperties.java | 14 + .../collect/web/common/dto/BasicQueryDto.java | 39 + .../web/common/dto/CollectionForJZHDto.java | 11 + .../web/common/dto/CollectionRequire.java | 47 + .../common/dto/CollectionRequireTimeDto.java | 32 + .../web/common/dto/CollectionSaveDto.java | 13 + .../collect/web/common/dto/DaTypeDto.java | 9 + .../collect/web/common/dto/DableJsonDto.java | 40 + .../collect/web/common/dto/DataFormatDto.java | 10 + .../collect/web/common/dto/DataSourceDto.java | 18 + .../web/common/dto/DataSourcesDto.java | 11 + .../web/common/dto/DataTransferJsonDto.java | 11 + .../collect/web/common/dto/FieldJsonDto.java | 29 + .../collect/web/common/dto/HoliDay.java | 22 + .../common/dto/MutliDataTransferJsonDto.java | 10 + .../web/common/dto/NoViewCollectionDto.java | 66 ++ .../collect/web/common/dto/NoViewConfig.java | 15 + .../web/common/dto/NoViewMakeUpDto.java | 18 + .../collect/web/common/dto/TaskCollect.java | 42 + .../web/common/dto/ViewReportTwoDto.java | 39 + .../web/common/dto/two/ReportDownTwoDto.java | 25 + .../common/dto/two/ReportHospitalTwoDto.java | 25 + .../common/dto/two/ReportPatientTwoDto.java | 18 + .../web/common/dto/two/ReportTaskTwoDto.java | 19 + .../{domain => common/entity}/TaskConfig.java | 4 +- .../entity}/TaskOriginalMessage.java | 4 +- .../convert/TaskOriginalMessageConverter.java | 4 +- .../collect/web/enums/ColectNameEnum.java | 109 ++ .../collect/web/enums/CollectTypeEnum.java | 2 + .../collect/web/enums/DisposeModeEnum.java | 7 + .../collect/web/enums/MedicalRecordEnum.java | 28 + .../collect/web/enums/RedisKeyEnum.java | 5 + .../collect/web/job/AbstractCollectJob.java | 20 +- .../collect/web/mapper/TaskConfigMapper.java | 2 +- .../web/mapper/TaskOriginalMessageMapper.java | 2 +- .../collect/web/process/JobProcessor.java | 4 +- .../collect/web/process/VisitorProcessor.java | 10 +- .../collect/web/service/CollectService.java | 446 +++++++ .../collect/web/service/HospitalEnum.java | 35 + .../web/service/ITaskConfigService.java | 6 +- .../service/ITaskOriginalMessageService.java | 2 +- .../service/impl/TaskConfigServiceImpl.java | 6 +- .../impl/TaskOriginalMessageServiceImpl.java | 6 +- .../server/collect/web/utils/DateUtils.java | 878 ++++++++++++++ .../collect/web/utils/DynamicAnnotation.java | 42 + .../server/collect/web/utils/HoliDayUtil.java | 71 ++ .../server/collect/web/utils/IpUtil.java | 55 + .../server/collect/web/utils/MapObjUtil.java | 167 +++ .../collect/web/utils/MqQueueUtils.java | 23 + .../server/collect/web/utils/RedisMq.java | 82 ++ .../web/utils/SpringRestTemplateUtils.java | 244 ++++ .../server/collect/web/utils/UrlEncode.java | 137 +++ .../server/collect/web/utils/XaUtils.java | 1039 +++++++++++++++++ docus-archivefile/pom.xml | 9 + .../mapper/AfViewCollectionLogMapper.java | 15 + .../pojo/entity/AfViewCollectionLog.java | 51 + .../pojo/entity/CollectsysDictionary.java | 33 + .../docus/server/archivefile/service/B.java | 4 - .../service/IAfViewCollectionLogService.java | 11 + .../server/archivefile/service/impl/A.java | 4 - .../impl/AfViewCollectionLogServiceImpl.java | 17 + .../server/common/CommonApplication.java | 22 + .../docus/server/common/bean/MqExchange.java | 94 ++ .../com/docus/server/common/bean/MqQueue.java | 77 ++ .../com/docus/server/common/bean/Result.java | 40 + .../server/common/config/RabbitMQConfig.java | 105 ++ .../ServletListenerRegistrationConfig.java | 35 + .../common/{ => config}/UserProperties.java | 2 +- .../server/common/constants/Constants.java | 19 + .../common/constants/RabbitMQProperty.java | 33 + .../common/declare/AbstractDeclare.java | 50 + .../server/common/declare/AmBindDeclare.java | 98 ++ .../common/declare/AmExchangeDeclare.java | 100 ++ .../server/common/declare/AmQueueDeclare.java | 136 +++ .../server/common}/enums/EnumItemView.java | 2 +- .../enums/EnumTypeHandlerDispatch.java | 2 +- .../docus/server/common}/enums/FlagEnum.java | 2 +- .../server/common}/enums/IIntegerEnum.java | 2 +- .../common}/enums/IntegerEnumHandler.java | 2 +- .../docus/server/common}/enums/StateEnum.java | 4 +- .../docus/server/common/exception/Assert.java | 58 + .../common/exception/BaseException.java | 58 + .../exception/GlobalExceptionHandler.java | 201 ++++ .../server/common/exception/IResult.java | 19 + .../common/exception/RabbitMQException.java | 58 + .../exception/RabbitMQExceptionAssert.java | 31 + .../exception/RabbitMQExceptionUtils.java | 35 + .../common/listen/AbstractMessageHandler.java | 152 +++ .../listen/InitThreadLocalPoolListen.java | 40 + .../server/common/listen/MessageListen.java | 54 + .../server/common/message/MessageData.java | 42 + .../server/common/message/MqMessage.java | 48 + .../register/AbstractRegisterQueue.java | 146 +++ .../docus/server/common/request/Request.java | 20 + .../server/common/request/RequestQueue.java | 89 ++ .../common/send/AbstractReceiveService.java | 15 + .../common/send/AbstractSendService.java | 197 ++++ .../server/common/service/IBaseService.java | 2 +- .../common/service/RabbitMQApiService.java | 18 + .../common/service/impl/BaseServiceImpl.java | 1 - .../service/impl/RabbitMQApiServiceImpl.java | 26 + .../common/{ => service/impl}/Sort.java | 2 +- .../server/common/thread/RequestThread.java | 42 + .../common/thread/RequestThreadPool.java | 118 ++ .../server/common/type/AmExcepitonEnum.java | 35 + .../server/common/type/ExchangeTypeEnum.java | 46 + .../docus/server/common/type/ResultEnum.java | 53 + .../docus/server/common/util/ClassUtils.java | 40 + .../server/common/util/RabbitMQUtils.java | 49 + .../server/common/util/ResultWapper.java | 68 ++ .../docus/server/common/util/UUIDUtils.java | 25 + .../server/common/util/ValidateUtils.java | 71 ++ .../common/util/ValidatorResultUtil.java | 31 + .../src/main/resources/application.properties | 1 + .../service/impl/PowerUserServiceImpl.java | 2 +- .../infrastructure/mapper/LisDeptMapper.java | 10 +- .../docus/server/lis/service/ILisService.java | 4 +- .../lis/service/impl/LisServiceImpl.java | 6 +- .../main/resources/mapper/LisDeptMapper.xml | 34 +- .../main/resources/mapper/LisTBasicMapper.xml | 6 +- .../main/resources/mapper/LisUserMapper.xml | 6 +- 135 files changed, 7105 insertions(+), 126 deletions(-) create mode 100644 common-collect/src/main/java/com/docus/server/collect/report/view/LisViewCollectJob.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/BasicProperties.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/DocusProperties.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/NoViewChNewbornProperties.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/NoViewProperties.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/BasicQueryDto.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/CollectionForJZHDto.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/CollectionRequire.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/CollectionRequireTimeDto.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/CollectionSaveDto.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/DaTypeDto.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/DableJsonDto.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/DataFormatDto.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/DataSourceDto.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/DataSourcesDto.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/DataTransferJsonDto.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/FieldJsonDto.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/HoliDay.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/MutliDataTransferJsonDto.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/NoViewCollectionDto.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/NoViewConfig.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/NoViewMakeUpDto.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/TaskCollect.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/ViewReportTwoDto.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/two/ReportDownTwoDto.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/two/ReportHospitalTwoDto.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/two/ReportPatientTwoDto.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/common/dto/two/ReportTaskTwoDto.java rename common-collect/src/main/java/com/docus/server/collect/web/{domain => common/entity}/TaskConfig.java (94%) rename common-collect/src/main/java/com/docus/server/collect/web/{enums => common/entity}/TaskOriginalMessage.java (91%) create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/enums/ColectNameEnum.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/enums/DisposeModeEnum.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/enums/MedicalRecordEnum.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/enums/RedisKeyEnum.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/service/HospitalEnum.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/utils/DateUtils.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/utils/DynamicAnnotation.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/utils/HoliDayUtil.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/utils/IpUtil.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/utils/MapObjUtil.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/utils/MqQueueUtils.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/utils/RedisMq.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/utils/SpringRestTemplateUtils.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/utils/UrlEncode.java create mode 100644 common-collect/src/main/java/com/docus/server/collect/web/utils/XaUtils.java create mode 100644 docus-archivefile/src/main/java/com/docus/server/archivefile/mapper/AfViewCollectionLogMapper.java create mode 100644 docus-archivefile/src/main/java/com/docus/server/archivefile/pojo/entity/AfViewCollectionLog.java create mode 100644 docus-archivefile/src/main/java/com/docus/server/archivefile/pojo/entity/CollectsysDictionary.java delete mode 100644 docus-archivefile/src/main/java/com/docus/server/archivefile/service/B.java create mode 100644 docus-archivefile/src/main/java/com/docus/server/archivefile/service/IAfViewCollectionLogService.java delete mode 100644 docus-archivefile/src/main/java/com/docus/server/archivefile/service/impl/A.java create mode 100644 docus-archivefile/src/main/java/com/docus/server/archivefile/service/impl/AfViewCollectionLogServiceImpl.java create mode 100644 docus-common/src/main/java/com/docus/server/common/CommonApplication.java create mode 100644 docus-common/src/main/java/com/docus/server/common/bean/MqExchange.java create mode 100644 docus-common/src/main/java/com/docus/server/common/bean/MqQueue.java create mode 100644 docus-common/src/main/java/com/docus/server/common/bean/Result.java create mode 100644 docus-common/src/main/java/com/docus/server/common/config/RabbitMQConfig.java create mode 100644 docus-common/src/main/java/com/docus/server/common/config/ServletListenerRegistrationConfig.java rename docus-common/src/main/java/com/docus/server/common/{ => config}/UserProperties.java (87%) create mode 100644 docus-common/src/main/java/com/docus/server/common/constants/Constants.java create mode 100644 docus-common/src/main/java/com/docus/server/common/constants/RabbitMQProperty.java create mode 100644 docus-common/src/main/java/com/docus/server/common/declare/AbstractDeclare.java create mode 100644 docus-common/src/main/java/com/docus/server/common/declare/AmBindDeclare.java create mode 100644 docus-common/src/main/java/com/docus/server/common/declare/AmExchangeDeclare.java create mode 100644 docus-common/src/main/java/com/docus/server/common/declare/AmQueueDeclare.java rename {common-collect/src/main/java/com/docus/server/collect/web => docus-common/src/main/java/com/docus/server/common}/enums/EnumItemView.java (92%) rename {common-collect/src/main/java/com/docus/server/collect/web => docus-common/src/main/java/com/docus/server/common}/enums/EnumTypeHandlerDispatch.java (97%) rename {common-collect/src/main/java/com/docus/server/collect/web => docus-common/src/main/java/com/docus/server/common}/enums/FlagEnum.java (92%) rename {common-collect/src/main/java/com/docus/server/collect/web => docus-common/src/main/java/com/docus/server/common}/enums/IIntegerEnum.java (95%) rename {common-collect/src/main/java/com/docus/server/collect/web => docus-common/src/main/java/com/docus/server/common}/enums/IntegerEnumHandler.java (97%) rename {common-collect/src/main/java/com/docus/server/collect/web => docus-common/src/main/java/com/docus/server/common}/enums/StateEnum.java (80%) create mode 100644 docus-common/src/main/java/com/docus/server/common/exception/Assert.java create mode 100644 docus-common/src/main/java/com/docus/server/common/exception/BaseException.java create mode 100644 docus-common/src/main/java/com/docus/server/common/exception/GlobalExceptionHandler.java create mode 100644 docus-common/src/main/java/com/docus/server/common/exception/IResult.java create mode 100644 docus-common/src/main/java/com/docus/server/common/exception/RabbitMQException.java create mode 100644 docus-common/src/main/java/com/docus/server/common/exception/RabbitMQExceptionAssert.java create mode 100644 docus-common/src/main/java/com/docus/server/common/exception/RabbitMQExceptionUtils.java create mode 100644 docus-common/src/main/java/com/docus/server/common/listen/AbstractMessageHandler.java create mode 100644 docus-common/src/main/java/com/docus/server/common/listen/InitThreadLocalPoolListen.java create mode 100644 docus-common/src/main/java/com/docus/server/common/listen/MessageListen.java create mode 100644 docus-common/src/main/java/com/docus/server/common/message/MessageData.java create mode 100644 docus-common/src/main/java/com/docus/server/common/message/MqMessage.java create mode 100644 docus-common/src/main/java/com/docus/server/common/register/AbstractRegisterQueue.java create mode 100644 docus-common/src/main/java/com/docus/server/common/request/Request.java create mode 100644 docus-common/src/main/java/com/docus/server/common/request/RequestQueue.java create mode 100644 docus-common/src/main/java/com/docus/server/common/send/AbstractReceiveService.java create mode 100644 docus-common/src/main/java/com/docus/server/common/send/AbstractSendService.java create mode 100644 docus-common/src/main/java/com/docus/server/common/service/RabbitMQApiService.java create mode 100644 docus-common/src/main/java/com/docus/server/common/service/impl/RabbitMQApiServiceImpl.java rename docus-common/src/main/java/com/docus/server/common/{ => service/impl}/Sort.java (96%) create mode 100644 docus-common/src/main/java/com/docus/server/common/thread/RequestThread.java create mode 100644 docus-common/src/main/java/com/docus/server/common/thread/RequestThreadPool.java create mode 100644 docus-common/src/main/java/com/docus/server/common/type/AmExcepitonEnum.java create mode 100644 docus-common/src/main/java/com/docus/server/common/type/ExchangeTypeEnum.java create mode 100644 docus-common/src/main/java/com/docus/server/common/type/ResultEnum.java create mode 100644 docus-common/src/main/java/com/docus/server/common/util/ClassUtils.java create mode 100644 docus-common/src/main/java/com/docus/server/common/util/RabbitMQUtils.java create mode 100644 docus-common/src/main/java/com/docus/server/common/util/ResultWapper.java create mode 100644 docus-common/src/main/java/com/docus/server/common/util/UUIDUtils.java create mode 100644 docus-common/src/main/java/com/docus/server/common/util/ValidateUtils.java create mode 100644 docus-common/src/main/java/com/docus/server/common/util/ValidatorResultUtil.java create mode 100644 docus-common/src/main/resources/application.properties diff --git a/bl-sysem/src/main/java/com/docus/server/bl/infrastructure/mapper/BlDeptMapper.java b/bl-sysem/src/main/java/com/docus/server/bl/infrastructure/mapper/BlDeptMapper.java index 270ecca..a434031 100644 --- a/bl-sysem/src/main/java/com/docus/server/bl/infrastructure/mapper/BlDeptMapper.java +++ b/bl-sysem/src/main/java/com/docus/server/bl/infrastructure/mapper/BlDeptMapper.java @@ -2,21 +2,21 @@ package com.docus.server.bl.infrastructure.mapper; import com.baomidou.dynamic.datasource.annotation.DS; import com.docus.server.bl.common.DSKeyConstants; -import com.docus.server.sys.common.pojo.dto.DeptDTO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.Date; import java.util.List; +import java.util.Map; @Mapper @DS(DSKeyConstants.DS_KEY) public interface BlDeptMapper { - List getDeptListView(@Param("startDate") Date startDate, - @Param("endDate") Date endDate, - @Param("offset") int offset, - @Param("pageSize") int pageSize); + List> list(@Param("startDate") Date startDate, + @Param("endDate") Date endDate, + @Param("offset") int offset, + @Param("pageSize") int pageSize); } diff --git a/bl-sysem/src/main/java/com/docus/server/bl/service/IBlService.java b/bl-sysem/src/main/java/com/docus/server/bl/service/IBlService.java index 411f5c5..f559885 100644 --- a/bl-sysem/src/main/java/com/docus/server/bl/service/IBlService.java +++ b/bl-sysem/src/main/java/com/docus/server/bl/service/IBlService.java @@ -1,14 +1,14 @@ package com.docus.server.bl.service; import com.docus.server.record.common.pojo.dto.TBasicDTO; -import com.docus.server.sys.common.pojo.dto.DeptDTO; import com.docus.server.sys.common.pojo.dto.UserDTO; import java.util.Date; import java.util.List; +import java.util.Map; public interface IBlService { - List getDeptListView(Date startDate, Date endDate, int pageNum, int pageSize); + List> list(Date startDate, Date endDate, int pageNum, int pageSize); List getUserListView(Date startDate, Date endDate, int pageNum, int pageSize); diff --git a/bl-sysem/src/main/java/com/docus/server/bl/service/impl/BlServiceImpl.java b/bl-sysem/src/main/java/com/docus/server/bl/service/impl/BlServiceImpl.java index b68252e..4effb5e 100644 --- a/bl-sysem/src/main/java/com/docus/server/bl/service/impl/BlServiceImpl.java +++ b/bl-sysem/src/main/java/com/docus/server/bl/service/impl/BlServiceImpl.java @@ -5,13 +5,13 @@ import com.docus.server.bl.infrastructure.mapper.BlTBasicMapper; import com.docus.server.bl.infrastructure.mapper.BlUserMapper; import com.docus.server.bl.service.IBlService; import com.docus.server.record.common.pojo.dto.TBasicDTO; -import com.docus.server.sys.common.pojo.dto.DeptDTO; import com.docus.server.sys.common.pojo.dto.UserDTO; import lombok.AllArgsConstructor; import org.springframework.stereotype.Component; import java.util.Date; import java.util.List; +import java.util.Map; @Component @AllArgsConstructor @@ -22,11 +22,10 @@ public class BlServiceImpl implements IBlService { private final BlTBasicMapper blTBasicMapper; @Override - public List getDeptListView(Date startDate, Date endDate, int pageNum, int pageSize) { - return blDeptMapper.getDeptListView(startDate, endDate, (pageNum - 1) * pageSize, pageSize); + public List> list(Date startDate, Date endDate, int pageNum, int pageSize) { + return blDeptMapper.list(startDate, endDate, (pageNum - 1) * pageSize, pageSize); } - @Override public List getUserListView(Date startDate, Date endDate, int pageNum, int pageSize) { return blUserMapper.getUserListView(startDate, endDate, (pageNum - 1) * pageSize, pageSize); diff --git a/bl-sysem/src/main/resources/mapper/BlDeptMapper.xml b/bl-sysem/src/main/resources/mapper/BlDeptMapper.xml index 42b97ae..c0fe31c 100644 --- a/bl-sysem/src/main/resources/mapper/BlDeptMapper.xml +++ b/bl-sysem/src/main/resources/mapper/BlDeptMapper.xml @@ -4,7 +4,7 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - SELECT `update_time` as update_time ,`dept_code` as dept_code,`dept_name` as dept_name FROM `his_dept` WHERE update_time between #{startDate} and #{endDate} order by update_time asc @@ -13,7 +13,7 @@ A;2--->B... + * + * @param num + * @return + */ + public static char aaNumToChar(int num) { + return (char) (64 + num); + } + + /** + * 获取字符的键盘值 + * + * @param s + * @return + */ + private static Integer aaCharToNum(char s) { + Integer result = 0; + switch (s) { + case 'A': + result = 65; + break; + case 'B': + result = 66; + break; + case 'C': + result = 67; + break; + case 'D': + result = 68; + break; + case 'E': + result = 69; + break; + case 'F': + result = 70; + break; + case 'G': + result = 71; + break; + case 'H': + result = 72; + break; + case 'I': + result = 73; + break; + case 'J': + result = 74; + break; + case 'K': + result = 75; + break; + case 'L': + result = 76; + break; + case 'M': + result = 77; + break; + case 'N': + result = 78; + break; + case 'O': + result = 79; + break; + case 'P': + result = 80; + break; + case 'Q': + result = 81; + break; + case 'R': + result = 82; + break; + case 'S': + result = 83; + break; + case 'T': + result = 84; + break; + case 'U': + result = 85; + break; + case 'V': + result = 86; + break; + case 'W': + result = 87; + break; + case 'X': + result = 88; + break; + case 'Y': + result = 89; + break; + case 'Z': + result = 90; + break; + case 'a': + result = 97; + break; + case 'b': + result = 98; + break; + case 'c': + result = 99; + break; + case 'd': + result = 100; + break; + case 'e': + result = 101; + break; + case 'f': + result = 102; + break; + case 'g': + result = 103; + break; + case 'h': + result = 104; + break; + case 'i': + result = 105; + break; + case 'j': + result = 106; + break; + case 'k': + result = 107; + break; + case 'l': + result = 108; + break; + case 'm': + result = 109; + break; + case 'n': + result = 110; + break; + case 'o': + result = 111; + break; + case 'p': + result = 112; + break; + case 'q': + result = 113; + break; + case 'r': + result = 114; + break; + case 's': + result = 115; + break; + case 't': + result = 116; + break; + case 'u': + result = 117; + break; + case 'v': + result = 118; + break; + case 'w': + result = 119; + break; + case 'x': + result = 120; + break; + case 'y': + result = 121; + break; + case 'z': + result = 122; + break; + case '0': + result = 48; + break; + case '1': + result = 49; + break; + case '2': + result = 50; + break; + case '3': + result = 51; + break; + case '4': + result = 52; + break; + case '5': + result = 53; + break; + case '6': + result = 54; + break; + case '7': + result = 55; + break; + case '8': + result = 56; + break; + case '9': + result = 57; + break; + default: + result = 0; + } + return result; + } + + /** + * 如 excel 里面显示 + * 递归问题--数字转化为字母,如(0-A,1-B....25-Z, 26-AA...) + * + * @param i + * @return + */ + public static String aaMoreNumToChar(int i) { + if ((0 <= i) && (i <= 25)) { + i += 65; + char ch = (char) i; + return String.valueOf(ch); + } else { + return aaMoreNumToChar(i / 26 - 1) + aaMoreNumToChar(i % 26); + } + } + + /** + * excel 里面显示 + *

+ * A->0; B->1;...AA->26 + * + * @param value + * @return + */ + public static int aaMoreCharToNum(String value) { + int rtn = 0; + int powIndex = 0; + value = value.toUpperCase(); + for (int i = value.length() - 1; i >= 0; i--) { + int tmpInt = value.charAt(i); + tmpInt -= 64; + + rtn += (int) Math.pow(26, powIndex) * tmpInt; + powIndex++; + } + //数值减去1 + rtn = rtn > 0 ? rtn - 1 : 0; + return rtn; + } + + + + + + public static String dealMobileStr(String mobileOldStr) { + if (isEmpty(mobileOldStr)) { + return null; + } + String str = mobileOldStr.replace("-", "").trim().replace(" ", ""); + if (str.length() > 11) { + str = str.substring(11); + } + return str; + } + + public static boolean isEmpty(String text) { + return StringUtils.isEmpty(text); + } + + /** + * 判断是否为空和isEmpty类似,只是如果输入的内容是空白符号,如:\t \n \f \r 空格等,均视为空 + * + * @param text + * @return + */ + public static boolean isBlank(String text) { + return StringUtils.isBlank(text); + } + + public static boolean isNotBlank(String text) { + return StringUtils.isNotBlank(text); + } + + + /** + * 获取文件后缀. + * 不包含. + *

+ * 如:/Users/duandazhi/Desktop/360.exe ---> exe + *

+ * FilenameUtils.getExtension(file.getOriginalFilename()) + */ + public static String getFileSuffix(String name) { + if (name == null) { + return ""; + } + if (name.indexOf(".") == -1) { + return ""; + } + + String suffix = name.substring(name.lastIndexOf(".") + 1); + + return suffix.trim().toLowerCase(); + } + + public static String getFileExt(String name) { + return getFileSuffix(name); + } + + public static String getFileExtentsion(MultipartFile file) { + return FilenameUtils.getExtension(file.getOriginalFilename()); + } + + /** + * 获取文件名称 + * + * @param path + * @return 如:path http://dl.360safe.com/360zip_setup_4.0.0.1050.exe --- > 360zip_setup_4.0.0.1050.exe + */ + public static String getFileNames(String path) { + return getFileNames(path, "/"); + } + + public static String getFileNames(String path, String regex) { + if (path == null || path.equalsIgnoreCase("")) { + return ""; + } + String[] paths = path.split(regex); + if (paths.length != 0) { + return paths[paths.length - 1]; + } + return ""; + } + + /** + * /Users/duandazhi/Desktop/360.exe 变成 UsersduandazhiDesktop360.exe + * + * @param path + * @return + */ + public static String getFileName(String path) { + String result = ""; + if (StringUtils.isNotBlank(path)) { + result = path.replace("*", "").replace("|", "") + .replace("\\", "").replace(":", "") + .replace(">", "") + .replace("?", "") + .replace("<", "") + .replace("/", "").replace("\"", ""); + } + return result; + } + + + /** + * os.name: + * windows or mac os x or mac os or linux + * + * @see + */ + public static boolean isWindows() { + String osName = System.getProperty("os.name", "windows").toLowerCase(); + if (osName.contains("windows")) { + return true; + } else { + return false; + } + } + + /** + * linux: file:/work/android-project/ + * windows: file:\\work\\android-project\\ + * + * @return + */ + public static String parseFilePath(String path) { + if (path == null || path.trim().length() == 0) { + return ""; + } + if (isWindows()) { + if (!path.contains("\\\\")) { + return path.replaceAll("/", "\\\\"); + } else { + return path; + } + } else { + if (!path.contains("/")) { + return path.replaceAll("\\\\", "/"); + } else { + return path; + } + } + } + + + + /** + * 金额转换,小写金钱转出大写; + * 数字转换为汉语中人民币的大写 + * eg:98.76 --> 玖拾捌元柒角陆分 + * eg:12345678.9 --> 壹千贰佰叁拾肆万伍千陆佰柒拾捌元玖角整 + * + * @param v + * @return + */ + public static String moneyTransform(double v) { + if (Math.abs(v) > XaUtils.MAX_VALUE) { + return "参数非法!"; + } + boolean isNegative = false; + if (v < 0) { + isNegative = true; + v = Math.abs(v); + } + long l = Math.round(v * 100); + if (l == 0) { + return "零元整"; + } + String strValue = l + ""; + // i用来控制数 + int i = 0; + // j用来控制单位 + int j = UNIT.length() - strValue.length(); + String rs = ""; + boolean isZero = false; + for (; i < strValue.length(); i++, j++) { + char ch = strValue.charAt(i); + if (ch == '0') { + isZero = true; + if (UNIT.charAt(j) == '亿' || UNIT.charAt(j) == '万' || UNIT.charAt(j) == '元') { + rs = rs + UNIT.charAt(j); + isZero = false; + } + } else { + if (isZero) { + rs = rs + "零"; + isZero = false; + } + rs = rs + DIGIT.charAt(ch - '0') + UNIT.charAt(j); + } + } + if (!rs.endsWith("分")) { + rs = rs + "整"; + } + rs = rs.replaceAll("亿万", "亿"); + rs = (isNegative ? "负" : "") + rs; + return rs; + } + + + + /** + * map抓换为xml报文 + * 手工处理,没有xml头 + * + * @param map + * @param sb + */ + @SuppressWarnings("all") + public static String mapToXML2(Map map, StringBuilder sb) { + Set set = map.keySet(); + for (Iterator it = set.iterator(); it.hasNext(); ) { + String key = (String) it.next(); + Object value = map.get(key); + if (null == value) { + value = ""; + } + if (value instanceof List) { + ArrayList list = (ArrayList) map.get(key); + sb.append("<" + key + ">"); + for (int i = 0; i < list.size(); i++) { + HashMap hm = (HashMap) list.get(i); + mapToXML2(hm, sb); + } + sb.append(""); + + } else { + if (value instanceof Map) { + sb.append("<" + key + ">"); + mapToXML2((HashMap) value, sb); + sb.append(""); + } else { + sb.append("<" + key + ">" + value + ""); + } + } + } + return sb.toString(); + } + + + + + + + /** + * Java字符串跟ASCII码互转 + * http://www.cnblogs.com/fengwenzhee/p/7239822.html + * string -> Ascii + * + * @param value + * @return + * String str = "{name:1234,password:4444}"; + * String asciiResult = stringToAscii(str.trim()); + * System.out.println(asciiResult); + * String stringResult = asciiToString(asciiResult); + * System.out.println(stringResult); + * System.out.println(asciiToString("160").trim()+"~"); + * System.out.println( asciiToString("10")); + * System.out.println( asciiToString("10")); + * System.out.println("...."); + * + * https://www.sojson.com/ascii.html + * A -- 65 + * a -- 97 + * a -- 97 + * 空格 -- 32 + * 回车 -- 10 + */ + public static String stringToAscii(String value) { + StringBuffer sbu = new StringBuffer(); + char[] chars = value.toCharArray(); + for (int i = 0; i < chars.length; i++) { + if (i != chars.length - 1) { + sbu.append((int) chars[i]).append(","); + } else { + sbu.append((int) chars[i]); + } + } + return sbu.toString(); + } + + /** + * Ascii -> string + * + * @param value + * @return + */ + public static String asciiToString(String value) { + StringBuffer sbu = new StringBuffer(); + String[] chars = value.split(","); + for (int i = 0; i < chars.length; i++) { + sbu.append((char) Integer.parseInt(chars[i])); + } + return sbu.toString(); + } + + + /** + * 去重空格,包含:空格、tab键、换行、  + * 这里比较系统的多了一个   + * 分别是:32、9、10、160 + *

+ * Trim leading and trailing whitespace from the given {@code String}. + * + * @param str the {@code String} to check + * @return the trimmed {@code String} + * @see Character#isWhitespace +   + *

+ *

+ * 一般的空白符默认值的 空格、tab键、换行符 + * 这里的空白符默认值的 ' '、\t、 \n 、&nbps 四种空白符 + * https://www.sojson.com/ascii.html + * 特殊的空格-ASCII码值160 和 32 是对应的两种空格 https://blog.csdn.net/lewky_liu/article/details/79353151 + *

+ * 示例: + * + * char cc = 160; + * String aa = cc + " 我是测试字符串\n\t"; + * System.out.println(); + * System.out.println(aa); + * System.out.println("length:" + aa.length()); + * System.out.println(XaUtils.trimContainNbsp(aa)); + * System.out.println(aa.trim()); + * System.out.println(); + * + */ + public static String trim(String str) { + str = str.trim() + ""; + str = org.springframework.util.StringUtils.trimTrailingCharacter(str, (char) 160); + str = str.trim(); + str = org.springframework.util.StringUtils.trimLeadingCharacter(str, (char) 160); + str = str.trim(); + return str; + } + + /** + * 去处科学技术法 + * + * @see # + * 如何准确的将科学计数法表示的Double类型转换为正常的字符串? + * https://segmentfault.com/q/1010000008823954 + * + * double a = 123456729.326666; + * System.out.println(a); + * System.out.println(Validator.isScientificCountingMethod("1.23456729326666E8")); + * System.out.println(Validator.isScientificCountingMethod("142342xd")); + * System.out.println(XaUtils.bigdecimalPlaninString(a)); + * double a = 123456729.326666; + * System.out.println(a); + * System.out.println(Validator.isScientificCountingMethod("1.23456729326666E8")); + * System.out.println(Validator.isScientificCountingMethod("142342xd")); + * System.out.println(XaUtils.bigdecimalPlaninString(a)); + * + * double 本来就有精度,必须指定保留多少位小数 + * 比如,excel 里面是数字,项目里面对应的字段是字符串,就容易出现科学技术法 + */ + public static String bigdecimalPlaninString(double d) { + BigDecimal d1 = new BigDecimal(Double.toString(d)); + BigDecimal d2 = new BigDecimal(Integer.toString(1)); + // 四舍五入,保留10位小数 + BigDecimal bigDecimal = d1.divide(d2, 20, BigDecimal.ROUND_HALF_UP); + // 这里在去掉,小数点收无用的0 + return bigDecimal.stripTrailingZeros().toPlainString(); + } + + + /** + * 使用java正则表达式去掉多余的.与0 + * + * double aaa = 131432.0; + * double aab = 131432.00000; + * double bbb = 131432; + * double bbc = 131432.143243; + * System.out.println(aaa); + * System.out.println(bbb); + * System.out.println(aab); + * System.out.println(String.valueOf(bbb)); + * System.out.println(new BigDecimal(bbc).stripTrailingZeros().toPlainString()); + *

+ * //double 直接使用 sout 输出,总是 自带一位小数,这里进行处理 + * + * + * @param s + * @return + */ + public static String subZeroAndDot(String s) { + if (s.indexOf(".") > 0) { + //去掉多余的0 + s = s.replaceAll("0+?$", ""); + //如最后一位是.则去掉 + s = s.replaceAll("[.]$", ""); + } + return s; + } + + /** + * 解析地址 快递地址信息 + * https://blog.csdn.net/superSubfn/article/details/80290491 + * + * @param address + * @return + * @author lin + *

+ *

+ * System.out.println(addressResolution("湖北省武汉市洪山区")); + * System.out.println(addressResolution("湖北省武汉市洪山区")); + * System.out.println(addressResolution("湖北省恩施土家族苗族自治州恩施市")); + * System.out.println(addressResolution("北京市市辖区朝阳区")); + * System.out.println(addressResolution("内蒙古自治区兴安盟科尔沁右翼前旗")); + * System.out.println(addressResolution("西藏自治区日喀则地区日喀则市")); + * System.out.println(addressResolution("海南省省直辖县级行政单位中沙群岛的岛礁及其海域")); + * System.out.println(addressResolution("陕西省西安市雁塔区旺座现代城E座1004")); + */ + public static List> expressAddressResolution(String address) { + String regex = "(?[^省]+自治区|.*?省|.*?行政区|.*?市)(?[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)(?[^县]+县|.+区|.+市|.+旗|.+海域|.+岛)?(?[^区]+区|.+镇)?(?.*)"; + Matcher m = Pattern.compile(regex).matcher(address); + String province = null, city = null, county = null, town = null, village = null; + List> table = new ArrayList>(); + Map row = null; + while (m.find()) { + row = new LinkedHashMap(); + province = m.group("province"); + row.put("province", province == null ? "" : province.trim()); + city = m.group("city"); + row.put("city", city == null ? "" : city.trim()); + county = m.group("county"); + row.put("county", county == null ? "" : county.trim()); + town = m.group("town"); + row.put("town", town == null ? "" : town.trim()); + village = m.group("village"); + row.put("village", village == null ? "" : village.trim()); + table.add(row); + } + return table; + } + +} diff --git a/docus-archivefile/pom.xml b/docus-archivefile/pom.xml index 60484a7..57549ef 100644 --- a/docus-archivefile/pom.xml +++ b/docus-archivefile/pom.xml @@ -10,6 +10,15 @@ Archetype - docus-archivefile http://maven.apache.org + + + com.docus + docus-common + 1.0-SNAPSHOT + compile + + + diff --git a/docus-archivefile/src/main/java/com/docus/server/archivefile/mapper/AfViewCollectionLogMapper.java b/docus-archivefile/src/main/java/com/docus/server/archivefile/mapper/AfViewCollectionLogMapper.java new file mode 100644 index 0000000..47f74b7 --- /dev/null +++ b/docus-archivefile/src/main/java/com/docus/server/archivefile/mapper/AfViewCollectionLogMapper.java @@ -0,0 +1,15 @@ +package com.docus.server.archivefile.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.docus.server.archivefile.pojo.entity.AfViewCollectionLog; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author linrf + * @date 2023/6/13 17:05 + */ +@Mapper +public interface AfViewCollectionLogMapper extends BaseMapper { + + +} diff --git a/docus-archivefile/src/main/java/com/docus/server/archivefile/pojo/entity/AfViewCollectionLog.java b/docus-archivefile/src/main/java/com/docus/server/archivefile/pojo/entity/AfViewCollectionLog.java new file mode 100644 index 0000000..8d33878 --- /dev/null +++ b/docus-archivefile/src/main/java/com/docus/server/archivefile/pojo/entity/AfViewCollectionLog.java @@ -0,0 +1,51 @@ +package com.docus.server.archivefile.pojo.entity; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author zengdl + * @website https://el-admin.vip + * @description / + * @date 2022-03-28 + **/ +@Data +@TableName("af_view_collection_log") +public class AfViewCollectionLog implements Serializable { + + @TableId("id") + @ApiModelProperty(value = "id") + private Long id; + + @TableField("jzh") + @ApiModelProperty(value = "记帐号") + private String jzh; + + @TableField("sys_code") + @ApiModelProperty(value = "采集器分类") + private String sysCode; + + @TableField("file_id") + @ApiModelProperty(value = "文件id") + private String fileId; + + @TableField("file_modify_time") + @ApiModelProperty(value = "文件最后修改时间") + private String fileModifyTime; + + @TableField("create_time") + @ApiModelProperty(value = "创建时间") + private Date createTime; + + public void copy(AfViewCollectionLog source) { + BeanUtil.copyProperties(source, this, CopyOptions.create().setIgnoreNullValue(true)); + } +} diff --git a/docus-archivefile/src/main/java/com/docus/server/archivefile/pojo/entity/CollectsysDictionary.java b/docus-archivefile/src/main/java/com/docus/server/archivefile/pojo/entity/CollectsysDictionary.java new file mode 100644 index 0000000..2c1ac13 --- /dev/null +++ b/docus-archivefile/src/main/java/com/docus/server/archivefile/pojo/entity/CollectsysDictionary.java @@ -0,0 +1,33 @@ +package com.docus.server.archivefile.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author zengdl + * @website https://el-admin.vip + * @description / + * @date 2022-09-02 + **/ +@Data +@TableName("af_collectsys_dictionary") +public class CollectsysDictionary implements Serializable { + + @TableId("id") + @ApiModelProperty(value = "id 雪花算法") + private Long id; + + @TableField("sys_code") + @ApiModelProperty(value = "采集来源系统编号") + private String sysCode; + + @TableField("sys_name") + @ApiModelProperty(value = "采集来源系统名称") + private String sysName; + +} diff --git a/docus-archivefile/src/main/java/com/docus/server/archivefile/service/B.java b/docus-archivefile/src/main/java/com/docus/server/archivefile/service/B.java deleted file mode 100644 index f95efc1..0000000 --- a/docus-archivefile/src/main/java/com/docus/server/archivefile/service/B.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.docus.server.archivefile.service; - -public interface B { -} diff --git a/docus-archivefile/src/main/java/com/docus/server/archivefile/service/IAfViewCollectionLogService.java b/docus-archivefile/src/main/java/com/docus/server/archivefile/service/IAfViewCollectionLogService.java new file mode 100644 index 0000000..a0eda9d --- /dev/null +++ b/docus-archivefile/src/main/java/com/docus/server/archivefile/service/IAfViewCollectionLogService.java @@ -0,0 +1,11 @@ +package com.docus.server.archivefile.service; + +import com.docus.server.archivefile.pojo.entity.AfViewCollectionLog; +import com.docus.server.common.service.IBaseService; + +/** + * @author linrf + * @date 2023/6/13 17:05 + */ +public interface IAfViewCollectionLogService extends IBaseService { +} diff --git a/docus-archivefile/src/main/java/com/docus/server/archivefile/service/impl/A.java b/docus-archivefile/src/main/java/com/docus/server/archivefile/service/impl/A.java deleted file mode 100644 index 384f814..0000000 --- a/docus-archivefile/src/main/java/com/docus/server/archivefile/service/impl/A.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.docus.server.archivefile.service.impl; - -public class A { -} diff --git a/docus-archivefile/src/main/java/com/docus/server/archivefile/service/impl/AfViewCollectionLogServiceImpl.java b/docus-archivefile/src/main/java/com/docus/server/archivefile/service/impl/AfViewCollectionLogServiceImpl.java new file mode 100644 index 0000000..a8e0e79 --- /dev/null +++ b/docus-archivefile/src/main/java/com/docus/server/archivefile/service/impl/AfViewCollectionLogServiceImpl.java @@ -0,0 +1,17 @@ +package com.docus.server.archivefile.service.impl; + +import com.docus.server.archivefile.mapper.AfViewCollectionLogMapper; +import com.docus.server.archivefile.pojo.entity.AfViewCollectionLog; +import com.docus.server.archivefile.service.IAfViewCollectionLogService; +import com.docus.server.common.service.impl.BaseServiceImpl; +import org.springframework.stereotype.Service; + +/** + * @author linrf + * @date 2023/6/13 17:06 + */ +@Service +public class AfViewCollectionLogServiceImpl extends BaseServiceImpl implements IAfViewCollectionLogService { + + +} diff --git a/docus-common/src/main/java/com/docus/server/common/CommonApplication.java b/docus-common/src/main/java/com/docus/server/common/CommonApplication.java new file mode 100644 index 0000000..68fdef7 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/CommonApplication.java @@ -0,0 +1,22 @@ +package com.docus.server.common; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: CommonApplication + * @Package: com.amos.consumer + * @author: amos + * @Description: + * @date: 2019/6/28 0028 上午 11:50 + * @Version: V1.0 + */ +@SpringBootApplication(scanBasePackages = {"com.docus.server.common.thread"}) +public class CommonApplication { + public static void main(String[] args) { + SpringApplication.run(CommonApplication.class, args); + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/bean/MqExchange.java b/docus-common/src/main/java/com/docus/server/common/bean/MqExchange.java new file mode 100644 index 0000000..7ff7df6 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/bean/MqExchange.java @@ -0,0 +1,94 @@ +package com.docus.server.common.bean; + +import com.docus.server.common.type.ExchangeTypeEnum; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Map; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: MqExchange + * @Package: com.docus.viewtaskcollect.common.bean + * @author: amos + * @Description: + * @date: 2019/6/28 0028 下午 15:23 + * @Version: V1.0 + */ +@Data +public class MqExchange { + /** + * 默认的DIRECT类型的交换机 + */ + public static final String DEFAULT_DIRECT_EXCHANGE = "amq.direct"; + /** + * 默认的TOPIC类型的交换机 + */ + public static final String DEFAULT_TOPIC_EXCHANGE = "amq.topic"; + /** + * 默认的HEADERS类型的交换机 + */ + public static final String DEFAULT_HEADERS_EXCHANGE = "amq.headers"; + /** + * 默认的FANOUT类型的交换机 + */ + public static final String DEFAULT_FANOUT_EXCHANGE = "amq.fanout"; + /** + * 交换机的名称 + */ + @NotNull(message = "交换机名称不能为空") + private String name; + + /** + * 交换机的类型 + */ + @NotNull(message = "交换机类型不能为空") + private ExchangeTypeEnum type; + /** + * 是否持久化 + * 持久化可以将交换机存盘,在服务器重启的时候不会丢失相关的信息 + * 默认是开启持久化 + */ + private boolean durable = Boolean.TRUE; + /** + * 是否自动删除 + * 自动删除的前提是至少有一个队列或者交换机与这个交互机绑定,之后所有与这个交换机绑定的队列或者交换机都与此解绑 + */ + private boolean autoDelete; + + public MqExchange name(String name) { + this.name = name; + return this; + } + + + public MqExchange type(ExchangeTypeEnum type) { + this.type = type; + return this; + } + + public MqExchange durable(boolean durable) { + this.durable = durable; + return this; + } + + public MqExchange autoDelete(boolean autoDelete) { + this.autoDelete = autoDelete; + return this; + } + + public MqExchange arguments(Map arguments) { + this.arguments = arguments; + return this; + } + + /** + * 自定义属性参数 + * 比如:alternate-exchange + */ + private Map arguments; + + +} diff --git a/docus-common/src/main/java/com/docus/server/common/bean/MqQueue.java b/docus-common/src/main/java/com/docus/server/common/bean/MqQueue.java new file mode 100644 index 0000000..cae68dc --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/bean/MqQueue.java @@ -0,0 +1,77 @@ +package com.docus.server.common.bean; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Map; + +/** + * Copyright (C) 五月软件工作室 + * + * @Package com.docus.viewtaskcollect.common.bean + * @ClassName MqQueue + * @Description 队列属性 + * @Author Amos + * @Modifier + * @Date 2019/6/29 20:10 + * @Version 1.0 + **/ +@Data +public class MqQueue { + /** + * 队列名称 + */ + @NotNull(message = "队列名称不能为空") + private String name; + /** + * 是否持久化 + * 持久化会存盘,服务器重启时不会丢失相关信息 + */ + private boolean durable; + /** + * 是否排他 + * 如果是排他,则该队列对首次声明他的连接有效,并在连接断开时自动删除 + * 注意: + * 1. 同一个连接的其他的Channel是可以连接该排他队列的 + * 2. 首次是说其他连接就不同创建同名的排他队列 + * 适用于一个客户端同时发送和读取消息 + */ + private boolean exclusive; + /** + * 是否自动删除 + * 自动删除的前提是至少有一个队列或者交换机与这个交互机绑定,之后所有与这个交换机绑定的队列或者交换机都与此解绑 + */ + private boolean autoDelete; + /** + * 结构化参数 + * x-message-ttl、x-expires等 + */ + private Map arguments; + + public MqQueue name(String name) { + this.name = name; + return this; + } + + public MqQueue durable(boolean durable) { + this.durable = durable; + return this; + } + + public MqQueue exclusive(boolean exclusive) { + this.exclusive = exclusive; + return this; + } + + public MqQueue autoDelete(boolean autoDelete) { + this.autoDelete = autoDelete; + return this; + } + + public MqQueue arguments(Map arguments) { + this.arguments = arguments; + return this; + } + + +} diff --git a/docus-common/src/main/java/com/docus/server/common/bean/Result.java b/docus-common/src/main/java/com/docus/server/common/bean/Result.java new file mode 100644 index 0000000..34023ef --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/bean/Result.java @@ -0,0 +1,40 @@ +package com.docus.server.common.bean; + +import lombok.Data; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: Result + * @Package: com.docus.viewtaskcollect.common.bean + * @author: amos + * @Description: 结果类 + * @date: 2019/6/28 0028 上午 9:51 + * @Version: V1.0 + */ +@Data +public class Result { + /** + * 编码 + */ + private Integer code; + /** + * 信息 + */ + private String msg; + /** + * 数据 + */ + private Object data; + + public Result(Integer code, String msg, Object data) { + this.code = code; + this.msg = msg; + this.data = data; + } + + public Result() { + } + +} diff --git a/docus-common/src/main/java/com/docus/server/common/config/RabbitMQConfig.java b/docus-common/src/main/java/com/docus/server/common/config/RabbitMQConfig.java new file mode 100644 index 0000000..3555ac1 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/config/RabbitMQConfig.java @@ -0,0 +1,105 @@ +package com.docus.server.common.config; + +import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: RabbitMQConfig + * @Package: com.amos.producer.config + * @author: amos + * @Description: rabbitMQ的配置 + * @date: 2019/6/28 0028 上午 9:11 + * @Version: V1.0 + */ +@Configuration +public class RabbitMQConfig { + /** + * rabbitMQ服务器的地址 + */ + @Value("${spring.rabbitmq.addresses:192.168.56.105:5672}") + private String addresses; + /** + * rabbitMQ用户名 + */ + @Value("${spring.rabbitmq.username:root}") + private String username; + /** + * rabbitMQ密码 + */ + @Value("${spring.rabbitmq.password:root}") + private String password; + /** + * rabbitMQ虚拟机 这里默认 / + */ + @Value("${spring.rabbitmq.virtual-host:/}") + private String virtualHost; + /** + * 消息发送失败,是否回调给发送者 + */ + @Value("${spring.rabbitmq.template.mandatory:false}") + private Boolean mandatory; + /** + * 是否确认 + */ + @Value("${spring.rabbitmq.publisher-confirms:false}") + private Boolean publisherConfirms; + /** + * 如果mandatorys设置成true,该值也设置 成true + */ + @Value("${spring.rabbitmq.publisher-returns:false}") + private Boolean publisherReturns; + + /** + * 注册rabbitMQ的Connection + * + * @return + */ + @Bean + public ConnectionFactory connectionFactory() { + CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory(); + cachingConnectionFactory.setAddresses(this.addresses); + cachingConnectionFactory.setUsername(this.username); + cachingConnectionFactory.setPassword(this.password); + cachingConnectionFactory.setVirtualHost(this.virtualHost); + // 如果消息要设置成回调,则以下的配置必须要设置成true + cachingConnectionFactory.setPublisherConfirms(this.publisherConfirms); + cachingConnectionFactory.setPublisherReturns(this.publisherReturns); + return cachingConnectionFactory; + } + + /** + * 因为要设置回调类,所以应是prototype类型,如果是singleton类型,则回调类为最后一次设置 + * 主要是为了设置回调类 + * + * @return + */ + @Bean(name = "rabbitTemplate") + @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) + public RabbitTemplate rabbitTemplate() { + RabbitTemplate template = new RabbitTemplate(this.connectionFactory()); + template.setMessageConverter(new Jackson2JsonMessageConverter()); + return template; + } + + /** + * 注册rabbitAdmin 方便管理 + * + * @param connectionFactory + * @return + */ + @Bean + public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) { + return new RabbitAdmin(connectionFactory); + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/config/ServletListenerRegistrationConfig.java b/docus-common/src/main/java/com/docus/server/common/config/ServletListenerRegistrationConfig.java new file mode 100644 index 0000000..56833ba --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/config/ServletListenerRegistrationConfig.java @@ -0,0 +1,35 @@ +package com.docus.server.common.config; + +import com.docus.server.common.listen.InitThreadLocalPoolListen; +import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Package com.docus.viewtaskcollect.common.config + * @ClassName ServletListenerRegistrationConfig + * @Description 在容器启动的时候,注册自定义的Listener + * 1. 在监听器中初始化线程池 + * @Author Amos + * @Modifier + * @Date 2019/7/14 16:41 + * @Version 1.0 + **/ +@Configuration +public class ServletListenerRegistrationConfig { + + /** + * 注册自定义的Bean + * 并且设置监听器,该监听器初始化线程池 + * + * @return + */ + @Bean + public ServletListenerRegistrationBean registrationBean() { + ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean(); + servletListenerRegistrationBean.setListener(new InitThreadLocalPoolListen()); + return servletListenerRegistrationBean; + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/UserProperties.java b/docus-common/src/main/java/com/docus/server/common/config/UserProperties.java similarity index 87% rename from docus-common/src/main/java/com/docus/server/common/UserProperties.java rename to docus-common/src/main/java/com/docus/server/common/config/UserProperties.java index 2498a8e..635f3e7 100644 --- a/docus-common/src/main/java/com/docus/server/common/UserProperties.java +++ b/docus-common/src/main/java/com/docus/server/common/config/UserProperties.java @@ -1,4 +1,4 @@ -package com.docus.server.common; +package com.docus.server.common.config; import lombok.Data; import org.springframework.beans.factory.annotation.Value; diff --git a/docus-common/src/main/java/com/docus/server/common/constants/Constants.java b/docus-common/src/main/java/com/docus/server/common/constants/Constants.java new file mode 100644 index 0000000..bef793c --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/constants/Constants.java @@ -0,0 +1,19 @@ +package com.docus.server.common.constants; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: Constants + * @Package: com.docus.viewtaskcollect.common.constants + * @author: amos + * @Description: + * @date: 2019/6/28 0028 下午 15:59 + * @Version: V1.0 + */ +public class Constants { + /** + * 默认参数不能为空的提示信息 + */ + public static final String PARAMETER_DEFAULT_NOT_NULL_EXCEPTION_MSG = "the parameter object could not be null"; +} diff --git a/docus-common/src/main/java/com/docus/server/common/constants/RabbitMQProperty.java b/docus-common/src/main/java/com/docus/server/common/constants/RabbitMQProperty.java new file mode 100644 index 0000000..c42907e --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/constants/RabbitMQProperty.java @@ -0,0 +1,33 @@ +package com.docus.server.common.constants; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: ExchangeProperty + * @Package: com.docus.viewtaskcollect.common.constants + * @author: amos + * @Description: + * @date: 2019/6/28 0028 下午 15:18 + * @Version: V1.0 + */ +public interface RabbitMQProperty { + /** + * 队列的属性 + */ + public interface QueueProperty { + + } + + /** + * 交换机的属性 + */ + public interface ExchangeProperty { + /** + * + */ + public static final String ALTERNATE_EXCHANGE = "alternate-exchange"; + + } +} + diff --git a/docus-common/src/main/java/com/docus/server/common/declare/AbstractDeclare.java b/docus-common/src/main/java/com/docus/server/common/declare/AbstractDeclare.java new file mode 100644 index 0000000..2a959d7 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/declare/AbstractDeclare.java @@ -0,0 +1,50 @@ +package com.docus.server.common.declare; + +import com.docus.server.common.bean.Result; +import com.docus.server.common.exception.RabbitMQExceptionUtils; +import com.docus.server.common.type.ResultEnum; +import com.docus.server.common.util.ValidateUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Copyright (C) 五月软件工作室 + * + * @Package com.docus.viewtaskcollect.common.declare + * @ClassName AbstractDeclare + * @Description TODO + * @Author Amos + * @Modifier + * @Date 2019/6/29 20:28 + * @Version 1.0 + **/ +public abstract class AbstractDeclare { + + public final Log logger = LogFactory.getLog(this.getClass()); + @Autowired + RabbitAdmin rabbitAdmin; + + /** + * 自定义的校验 + * + * @param object + */ + public abstract void DefinedValidate(Object object); + + /** + * 通用校验 + * 1. 校验字段是否是非空 + * + * @param object + */ + public void validate(Object object) { + Result result = ValidateUtils.validate(object); + if (!ResultEnum.success().equals(result.getCode())) { + RabbitMQExceptionUtils.throwRabbitMQException(result.getMsg()); + } + + this.DefinedValidate(object); + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/declare/AmBindDeclare.java b/docus-common/src/main/java/com/docus/server/common/declare/AmBindDeclare.java new file mode 100644 index 0000000..7eb86df --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/declare/AmBindDeclare.java @@ -0,0 +1,98 @@ +package com.docus.server.common.declare; + +import com.alibaba.fastjson.JSONObject; +import com.docus.server.common.bean.MqExchange; +import com.docus.server.common.exception.RabbitMQExceptionUtils; +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Package com.docus.viewtaskcollect.common.declare + * @ClassName AmBindDeclare + * @Description 绑定 + * @Author Amos + * @Modifier + * @Date 2019/6/29 22:57 + * @Version 1.0 + **/ +@Component +public class AmBindDeclare extends AbstractDeclare { + + + @Autowired + RabbitAdmin rabbitAdmin; + + /** + * 队列与交换机进行绑定 + * + * @param queueName 队列名称 + * @param exchangeName 交换机名称 + * @param routingKey 路由键 + * @return + */ + public boolean queueBind(String queueName, String exchangeName, String routingKey) { + return this.bind(queueName, Binding.DestinationType.QUEUE, exchangeName, routingKey, null); + } + + /** + * 绑定队列 + * 该绑定的默认交换机是 amq.direct 交换机, direct类型的交换机且开启持久化 + * 路由键也是该队列 + * + * @param queueName + * @return + */ + public boolean queueBind(String queueName) { + return this.queueBind(queueName, MqExchange.DEFAULT_DIRECT_EXCHANGE, queueName); + } + + /** + * 交换机和交换机进行绑定 + * + * @param destExchangeName 目标交换机名称 + * @param exchangeName 交换机名称 + * @param routingKey 路由键 + * @return + */ + public boolean exchangeBind(String destExchangeName, String exchangeName, String routingKey) { + return this.bind(destExchangeName, Binding.DestinationType.EXCHANGE, exchangeName, routingKey, null); + } + + /** + * bind绑定 + * + * @param destName 目标名称(可以是队列 也可以是交换机) + * @param type 绑定的类型 交换机 / 队列 + * @param exchangeName 交换机的名称 + * @param routingKey 路由键 + * @param map 结构参数 + * @return + */ + public boolean bind(String destName, Binding.DestinationType type, String exchangeName, String routingKey, Map map) { + this.logger.info("bind parameter is destName: " + destName + ", type: " + type.name() + + ", exchangeName: " + exchangeName + ", routingKey: " + routingKey + ", map: " + JSONObject.toJSONString(map)); + + Binding binding = new Binding(destName, Binding.DestinationType.QUEUE, exchangeName, routingKey, map); + try { + this.rabbitAdmin.declareBinding(binding); + } catch (Exception e) { + if (this.logger.isDebugEnabled()) { + RabbitMQExceptionUtils.throwRabbitMQException(e.getMessage()); + } + return Boolean.FALSE; + } + + return Boolean.TRUE; + } + + @Override + public void DefinedValidate(Object object) { + + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/declare/AmExchangeDeclare.java b/docus-common/src/main/java/com/docus/server/common/declare/AmExchangeDeclare.java new file mode 100644 index 0000000..d4452ec --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/declare/AmExchangeDeclare.java @@ -0,0 +1,100 @@ +package com.docus.server.common.declare; + +import com.docus.server.common.bean.MqExchange; +import com.docus.server.common.exception.RabbitMQException; +import com.docus.server.common.type.ExchangeTypeEnum; +import org.springframework.amqp.core.DirectExchange; +import org.springframework.amqp.core.Exchange; +import org.springframework.amqp.core.FanoutExchange; +import org.springframework.amqp.core.HeadersExchange; +import org.springframework.amqp.core.TopicExchange; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: AmExchangeDeclare + * @Package: com.docus.viewtaskcollect.common.declare + * @author: amos + * @Description: 交换机声明 + * @date: 2019/6/28 0028 下午 14:10 + * @Version: V1.0 + */ +@Component +public class AmExchangeDeclare extends AbstractDeclare { + + @Autowired + RabbitAdmin rabbitAdmin; + + /** + * 向rabbitMQ服务器注册指定的交换机以及交换机的类型 + * + * @param mqExchage + * @return + */ + public Exchange declareExchange(MqExchange mqExchage) { + this.logger.info("declare exchange is :" + mqExchage.toString()); + + Exchange exchange = null; + + super.validate(mqExchage); + exchange = this.initExchange(mqExchage); + this.rabbitAdmin.declareExchange(exchange); + + this.logger.info("declare exchange success"); + return exchange; + } + + + /** + * 从RabbitMQ服务端上删除指定的交换机 + * + * @param exchangeName + * @return + */ + public boolean deleteExchange(String exchangeName) { + this.logger.info("delete exchange is : " + exchangeName); + + if (StringUtils.isEmpty(exchangeName)) { + throw new RabbitMQException("the parameter exchangeName couldn't not be null"); + } + + return this.rabbitAdmin.deleteExchange(exchangeName); + } + + /** + * 根据不同类型初始化不同类型的交换机 + * + * @param mqExchage + * @return + */ + private Exchange initExchange(MqExchange mqExchage) { + ExchangeTypeEnum exchangeTypeEnum = mqExchage.getType(); + switch (exchangeTypeEnum) { + case DIRECT: + return new DirectExchange(mqExchage.getName(), mqExchage.isDurable(), mqExchage.isAutoDelete(), mqExchage.getArguments()); + case TOPIC: + return new TopicExchange(mqExchage.getName(), mqExchage.isDurable(), mqExchage.isAutoDelete(), mqExchage.getArguments()); + case FANOUT: + return new FanoutExchange(mqExchage.getName(), mqExchage.isDurable(), mqExchage.isAutoDelete(), mqExchage.getArguments()); + case HEADERS: + return new HeadersExchange(mqExchage.getName(), mqExchage.isDurable(), mqExchage.isAutoDelete(), mqExchage.getArguments()); + default: + return null; + } + } + + /** + * 自定义校验规则 + * + * @param object + */ + @Override + public void DefinedValidate(Object object) { + + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/declare/AmQueueDeclare.java b/docus-common/src/main/java/com/docus/server/common/declare/AmQueueDeclare.java new file mode 100644 index 0000000..ec7d034 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/declare/AmQueueDeclare.java @@ -0,0 +1,136 @@ +package com.docus.server.common.declare; + +import com.docus.server.common.bean.MqQueue; +import com.docus.server.common.exception.RabbitMQExceptionUtils; +import com.rabbitmq.client.AMQP; +import org.springframework.amqp.core.Queue; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +/** + * Copyright (C) 五月软件工作室 + * + * @Package com.docus.viewtaskcollect.common.declare + * @ClassName AmQueueDeclare + * @Description 队列管理 + * @Author Amos + * @Modifier + * @Date 2019/6/29 20:23 + * @Version 1.0 + **/ +@Component +public class AmQueueDeclare extends AbstractDeclare { + + /** + * 声明队列 + * 向rabbitMQ服务器声明一个队列 + * + * @param mqQueue + * @return + */ + public Queue declareQueue(MqQueue mqQueue) { +// this.logger.info("the parameter queue is : " + mqQueue.toString()); + + super.validate(mqQueue); + + Queue queue = new Queue(mqQueue.getName()); + BeanUtils.copyProperties(mqQueue, queue); + +// this.logger.info("declare queue is : " + queue.toString()); + + super.rabbitAdmin.declareQueue(queue); + +// this.logger.info("declare queue success"); + return queue; + } + + /** + * 清空队列中的消息 + * + * @param queueName + * @return 清楚队列中的消息的个数 + */ + public int purgeQueue(String queueName) { + if (StringUtils.isEmpty(queueName)) { + RabbitMQExceptionUtils.throwRabbitMQException(); + } + this.logger.info("purge queue is : " + queueName); + return super.rabbitAdmin.purgeQueue(queueName); + } + + /** + * 判断指定的队列是否存在 + * 1. 如果存在则返回该队列 + * 2. 如果不存在则返回null + * + * @param queueName + * @return true 存在, false 不存在 + */ + public boolean isQueueExist(String queueName) { + if (StringUtils.isEmpty(queueName)) { + RabbitMQExceptionUtils.throwRabbitMQException(); + } + +// this.logger.info("isQueueExist queue is : " + queueName); + + String isExist = super.rabbitAdmin.getRabbitTemplate().execute((channel -> { + try { + AMQP.Queue.DeclareOk declareOk = channel.queueDeclarePassive(queueName); + return declareOk.getQueue(); + } catch (Exception e) { + if (this.logger.isDebugEnabled()) { + RabbitMQExceptionUtils.throwRabbitMQException(e.getMessage()); + } + return null; + } + })); + +// this.logger.info("the queue " + queueName + " is exist : " + isExist); + return StringUtils.isEmpty(isExist) ? Boolean.FALSE : Boolean.TRUE; + } + + /** + * 从rabbitMQ服务器中删除指定的队列 + * + * @param queueName + * @return + */ + public boolean deleteQueue(String queueName) { + this.logger.info("delete queue is :" + queueName); + + if (StringUtils.isEmpty(queueName)) { + RabbitMQExceptionUtils.throwRabbitMQException(); + } + + return super.rabbitAdmin.deleteQueue(queueName); + } + + /** + * 从rabbitMQ服务器中删除指定的队列 + * + * @param queueName 队列名称 + * @param unused 队列是否在使用,如果设置为true则该队列只能在没有被使用的情况下才能删除 + * @param empty 队列是否为空,如果设置为true则该队列只能在该队列没有消息时才会被删除 + */ + public void deleteQueue(String queueName, boolean unused, boolean empty) { + this.logger.info("delete queue is : { queueName : '" + queueName + + "' , unused: '" + unused + "' , empty:'" + empty + "'}"); + + if (StringUtils.isEmpty(queueName)) { + RabbitMQExceptionUtils.throwRabbitMQException(); + } + + super.rabbitAdmin.deleteQueue(queueName, unused, empty); + } + + /** + * 自定义的校验 + * + * @param object + */ + @Override + public void DefinedValidate(Object object) { + + } +} diff --git a/common-collect/src/main/java/com/docus/server/collect/web/enums/EnumItemView.java b/docus-common/src/main/java/com/docus/server/common/enums/EnumItemView.java similarity index 92% rename from common-collect/src/main/java/com/docus/server/collect/web/enums/EnumItemView.java rename to docus-common/src/main/java/com/docus/server/common/enums/EnumItemView.java index 9efc446..94b65bf 100644 --- a/common-collect/src/main/java/com/docus/server/collect/web/enums/EnumItemView.java +++ b/docus-common/src/main/java/com/docus/server/common/enums/EnumItemView.java @@ -1,4 +1,4 @@ -package com.docus.server.collect.web.enums; +package com.docus.server.common.enums; public class EnumItemView { diff --git a/common-collect/src/main/java/com/docus/server/collect/web/enums/EnumTypeHandlerDispatch.java b/docus-common/src/main/java/com/docus/server/common/enums/EnumTypeHandlerDispatch.java similarity index 97% rename from common-collect/src/main/java/com/docus/server/collect/web/enums/EnumTypeHandlerDispatch.java rename to docus-common/src/main/java/com/docus/server/common/enums/EnumTypeHandlerDispatch.java index a22a1c4..45e3f22 100644 --- a/common-collect/src/main/java/com/docus/server/collect/web/enums/EnumTypeHandlerDispatch.java +++ b/docus-common/src/main/java/com/docus/server/common/enums/EnumTypeHandlerDispatch.java @@ -1,4 +1,4 @@ -package com.docus.server.collect.web.enums; +package com.docus.server.common.enums; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.EnumTypeHandler; diff --git a/common-collect/src/main/java/com/docus/server/collect/web/enums/FlagEnum.java b/docus-common/src/main/java/com/docus/server/common/enums/FlagEnum.java similarity index 92% rename from common-collect/src/main/java/com/docus/server/collect/web/enums/FlagEnum.java rename to docus-common/src/main/java/com/docus/server/common/enums/FlagEnum.java index d3391d7..5de85f3 100644 --- a/common-collect/src/main/java/com/docus/server/collect/web/enums/FlagEnum.java +++ b/docus-common/src/main/java/com/docus/server/common/enums/FlagEnum.java @@ -1,4 +1,4 @@ -package com.docus.server.collect.web.enums; +package com.docus.server.common.enums; public enum FlagEnum implements IIntegerEnum { INSERT(1, "新增"), diff --git a/common-collect/src/main/java/com/docus/server/collect/web/enums/IIntegerEnum.java b/docus-common/src/main/java/com/docus/server/common/enums/IIntegerEnum.java similarity index 95% rename from common-collect/src/main/java/com/docus/server/collect/web/enums/IIntegerEnum.java rename to docus-common/src/main/java/com/docus/server/common/enums/IIntegerEnum.java index 0e59172..be5e30e 100644 --- a/common-collect/src/main/java/com/docus/server/collect/web/enums/IIntegerEnum.java +++ b/docus-common/src/main/java/com/docus/server/common/enums/IIntegerEnum.java @@ -1,4 +1,4 @@ -package com.docus.server.collect.web.enums; +package com.docus.server.common.enums; import com.baomidou.mybatisplus.annotation.IEnum; diff --git a/common-collect/src/main/java/com/docus/server/collect/web/enums/IntegerEnumHandler.java b/docus-common/src/main/java/com/docus/server/common/enums/IntegerEnumHandler.java similarity index 97% rename from common-collect/src/main/java/com/docus/server/collect/web/enums/IntegerEnumHandler.java rename to docus-common/src/main/java/com/docus/server/common/enums/IntegerEnumHandler.java index fd263a0..fac3bfe 100644 --- a/common-collect/src/main/java/com/docus/server/collect/web/enums/IntegerEnumHandler.java +++ b/docus-common/src/main/java/com/docus/server/common/enums/IntegerEnumHandler.java @@ -1,4 +1,4 @@ -package com.docus.server.collect.web.enums; +package com.docus.server.common.enums; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; diff --git a/common-collect/src/main/java/com/docus/server/collect/web/enums/StateEnum.java b/docus-common/src/main/java/com/docus/server/common/enums/StateEnum.java similarity index 80% rename from common-collect/src/main/java/com/docus/server/collect/web/enums/StateEnum.java rename to docus-common/src/main/java/com/docus/server/common/enums/StateEnum.java index c9514ea..39a4dc2 100644 --- a/common-collect/src/main/java/com/docus/server/collect/web/enums/StateEnum.java +++ b/docus-common/src/main/java/com/docus/server/common/enums/StateEnum.java @@ -1,6 +1,4 @@ -package com.docus.server.collect.web.enums; - -import com.docus.server.collect.web.enums.IIntegerEnum; +package com.docus.server.common.enums; public enum StateEnum implements IIntegerEnum { OK(0, "成功"), diff --git a/docus-common/src/main/java/com/docus/server/common/exception/Assert.java b/docus-common/src/main/java/com/docus/server/common/exception/Assert.java new file mode 100644 index 0000000..b350be2 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/exception/Assert.java @@ -0,0 +1,58 @@ +package com.docus.server.common.exception; + +import org.springframework.util.StringUtils; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: Assert + * @Package: com.docus.viewtaskcollect.common.exception + * @author: zhuqb + * @Description: 自定义Assert + *

+ * 该接口封装了异常的基类,并且提供default方法来抛出异常 + * @date: 2019/7/9 0009 上午 8:14 + * @Version: V1.0 + */ +public interface Assert { + /** + * 创建异常 + * + * @param args 异常的信息 + * @return + */ + BaseException newException(Object... args); + + /** + * 创建异常 + * + * @param throwable 所有异常的父类 + * @param args 异常信息 + * @return + */ + BaseException newException(Throwable throwable, Object... args); + + /** + * 判断对象是否为空,如果为空的话就抛出异常 + * + * @param obj 待判断的对象 + */ + default void assertNotEmpty(Object obj) { + if (StringUtils.isEmpty(obj)) { + throw this.newException(obj); + } + } + + /** + * 判断对象是否为空,如果为空就抛出异常 + * + * @param object 待判断的对象 + * @param args 异常的信息 + */ + default void assertNotEmpty(Object object, Object... args) { + if (StringUtils.isEmpty(object)) { + throw this.newException(args); + } + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/exception/BaseException.java b/docus-common/src/main/java/com/docus/server/common/exception/BaseException.java new file mode 100644 index 0000000..303f7f1 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/exception/BaseException.java @@ -0,0 +1,58 @@ +package com.docus.server.common.exception; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: BaseException + * @Package: com.docus.viewtaskcollect.common.exception + * @author: zhuqb + * @Description: 自定义封装所有异常的基类 + *

+ * 该异常继承RuntimeException + * @date: 2019/7/9 0009 上午 8:15 + * @Version: V1.0 + */ +public class BaseException extends RuntimeException { + private static final long serialVersionUID = 1702524362131670363L; + /** + * 异常的返回的编码和信息 + */ + protected IResult result; + /** + * 异常消息参数 + */ + protected Object[] args; + + public BaseException(IResult result) { + super(result.getMsg()); + this.result = result; + } + + public BaseException(int code, String msg) { + super(msg); + this.result = new IResult() { + @Override + public int getCode() { + return code; + } + + @Override + public String getMsg() { + return msg; + } + }; + } + + public BaseException(IResult result, Object[] args, String msg) { + super(msg); + this.result = result; + this.args = args; + } + + public BaseException(IResult result, Object[] args, String message, Throwable cause) { + super(message, cause); + this.result = result; + this.args = args; + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/exception/GlobalExceptionHandler.java b/docus-common/src/main/java/com/docus/server/common/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..6cf6d58 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/exception/GlobalExceptionHandler.java @@ -0,0 +1,201 @@ +package com.docus.server.common.exception; + +import com.docus.server.common.bean.Result; +import com.docus.server.common.type.ResultEnum; +import com.docus.server.common.util.ValidatorResultUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.BindException; +import org.springframework.validation.BindingResult; +import org.springframework.validation.beanvalidation.MethodValidationPostProcessor; +import org.springframework.web.HttpMediaTypeNotSupportedException; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingServletRequestParameterException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; + +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.ValidationException; +import java.util.Set; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: GlobalExceptionHandler + * @Package: com.docus.viewtaskcollect.common.exception + * @author: zhuqb + * @Description: + * @date: 2019/7/10 0010 下午 17:19 + * @Version: V1.0 + */ +@RestControllerAdvice +@Slf4j +public class GlobalExceptionHandler { + + @Bean + public MethodValidationPostProcessor methodValidationPostProcessor() { + return new MethodValidationPostProcessor(); + } + + /** + * 400 - Bad Request 参数类型错误 + */ + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + public Result handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e) { + Result result = new Result(); + result.setCode(ResultEnum.error()); + result.setMsg("parameter type error :" + e.getMessage()); + return result; + } + + /** + * 400 - Bad Request 缺少请求参数 + */ + @ExceptionHandler(MissingServletRequestParameterException.class) + public Result handleMissingServletRequestParameterException(MissingServletRequestParameterException e) { + Result result = new Result(); + result.setCode(ResultEnum.error()); + result.setMsg("required parameter is not present"); + return result; + } + + /** + * 400 - Bad Request 参数解析失败 + */ + @ExceptionHandler(HttpMessageNotReadableException.class) + public Result handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { + Result result = new Result(); + result.setCode(ResultEnum.error()); + result.setMsg("could not read json"); + return result; + } + + /** + * 400 - Bad Request 参数验证失败 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + BindingResult bindingResult = e.getBindingResult(); + String errorMsg = ValidatorResultUtil.getMessage(bindingResult); + Result result = new Result(); + result.setCode(ResultEnum.error()); + result.setMsg(errorMsg); + return result; + } + + /** + * 400 - Bad Request 参数绑定失败 + */ + @ExceptionHandler(BindException.class) + public Result handleBindException(BindException e) { + BindingResult bindingResult = e.getBindingResult(); + String errorMsg = ValidatorResultUtil.getMessage(bindingResult); + Result result = new Result(); + result.setCode(ResultEnum.error()); + result.setMsg(errorMsg); + return result; + } + + /** + * 400 - Bad Request 参数验证失败 + */ + @ExceptionHandler(ConstraintViolationException.class) + public Result handleServiceException(ConstraintViolationException e) { + Set> violations = e.getConstraintViolations(); + ConstraintViolation violation = violations.iterator().next(); + String errorMsg = violation.getMessage(); + Result result = new Result(); + result.setCode(ResultEnum.error()); + result.setMsg("parameter:" + errorMsg); + return result; + } + + /** + * 400 - Bad Request 参数验证失败 + */ + @ExceptionHandler(ValidationException.class) + public Result handleValidationException(ValidationException e) { + Result result = new Result(); + result.setCode(ResultEnum.error()); + result.setMsg("validation exception"); + return result; + } + + /** + * 405 - Method Not Allowed 不支持当前请求方法 + */ + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public Result handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) { + Result result = new Result(); + result.setCode(ResultEnum.error()); + result.setMsg("request method not supported"); + return result; + } + + /** + * 415 - Unsupported Media Type 不支持当前媒体类型 + */ + @ExceptionHandler(HttpMediaTypeNotSupportedException.class) + public Result handleHttpMediaTypeNotSupportedException(Exception e) { + Result result = new Result(); + result.setCode(ResultEnum.error()); + result.setMsg("content type not supported"); + return result; + } + + /** + * 操作数据库出现异常:名称重复,外键关联等 + */ + @ExceptionHandler(DataIntegrityViolationException.class) + public Result handleException(DataIntegrityViolationException e) { + Result result = new Result(); + result.setCode(ResultEnum.error()); + result.setMsg("operating database exception"); + return result; + } + + /** + * 500 - Internal Server Error 通用异常 + */ + @ExceptionHandler(Exception.class) + public Result handleException(Exception e) { + Result result = new Result(); + result.setCode(ResultEnum.error()); + log.error(e.getMessage(), e); + if (e instanceof NullPointerException) { + result.setMsg(String.valueOf(e)); + } else { + result.setMsg(e.getMessage()); + } + return result; + } + + /** + * 应用异常 + */ + @ExceptionHandler(RabbitMQException.class) + public Result handleException(RabbitMQException e) { + Result result = new Result(); + result.setCode(e.getCode()); + result.setMsg(e.getMessage()); + return result; + } + + /** + * 断言异常 + */ + @ExceptionHandler(AssertionError.class) + public Result handleException(AssertionError e) { + Result result = new Result(); + result.setCode(ResultEnum.error()); + result.setMsg(e.getMessage()); + return result; + } + +} diff --git a/docus-common/src/main/java/com/docus/server/common/exception/IResult.java b/docus-common/src/main/java/com/docus/server/common/exception/IResult.java new file mode 100644 index 0000000..2f84468 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/exception/IResult.java @@ -0,0 +1,19 @@ +package com.docus.server.common.exception; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: IResult + * @Package: com.docus.viewtaskcollect.common.exception + * @author: zhuqb + * @Description: + * @date: 2019/7/9 0009 上午 8:28 + * @Version: V1.0 + */ +public interface IResult { + + int getCode(); + + String getMsg(); +} diff --git a/docus-common/src/main/java/com/docus/server/common/exception/RabbitMQException.java b/docus-common/src/main/java/com/docus/server/common/exception/RabbitMQException.java new file mode 100644 index 0000000..02f0d4b --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/exception/RabbitMQException.java @@ -0,0 +1,58 @@ +package com.docus.server.common.exception; + + +import com.docus.server.common.type.ResultEnum; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: RabbitMQException + * @Package: com.amos.producer + * @author: amos + * @Description: + * @date: 2019/6/28 0028 上午 9:23 + * @Version: V1.0 + */ +public class RabbitMQException extends BaseException { + private static final long serialVersionUID = 284587800137211341L; + + private int code; + private String msg; + + public RabbitMQException(int code, String msg) { + super(code, msg); + } + + public RabbitMQException(String msg) { + super(ResultEnum.error(), msg); + } + + public RabbitMQException(IResult result) { + super(result); + } + + public RabbitMQException(IResult result, Object[] args, String message) { + super(result, args, message); + } + + public RabbitMQException(IResult result, Object[] args, String message, Throwable cause) { + super(result, args, message, cause); + } + + public int getCode() { + return this.code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMsg() { + return this.msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/exception/RabbitMQExceptionAssert.java b/docus-common/src/main/java/com/docus/server/common/exception/RabbitMQExceptionAssert.java new file mode 100644 index 0000000..cd7390f --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/exception/RabbitMQExceptionAssert.java @@ -0,0 +1,31 @@ +package com.docus.server.common.exception; + +import java.text.MessageFormat; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: RabbitMQExceptionAssert + * @Package: com.docus.viewtaskcollect.common.exception + * @author: zhuqb + * @Description: + * @date: 2019/7/10 0010 下午 14:52 + * @Version: V1.0 + */ +public interface RabbitMQExceptionAssert extends IResult, Assert { + + @Override + default BaseException newException(Object... args) { + String msg = MessageFormat.format(this.getMsg(), args); + + return new RabbitMQException(this, args, msg); + } + + @Override + default BaseException newException(Throwable t, Object... args) { + String msg = MessageFormat.format(this.getMsg(), args); + + return new RabbitMQException(this, args, msg, t); + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/exception/RabbitMQExceptionUtils.java b/docus-common/src/main/java/com/docus/server/common/exception/RabbitMQExceptionUtils.java new file mode 100644 index 0000000..e1cfc4e --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/exception/RabbitMQExceptionUtils.java @@ -0,0 +1,35 @@ +package com.docus.server.common.exception; + +import com.docus.server.common.constants.Constants; + +/** + * Copyright (C) 五月软件工作室 + * + * @Package com.docus.viewtaskcollect.common.exception + * @ClassName RabbitMQExceptionUtils + * @Description 异常日志操作工具类 + * @Author Amos + * @Modifier + * @Date 2019/6/29 20:53 + * @Version 1.0 + **/ +public class RabbitMQExceptionUtils { + /** + * 实例化RabbitMQException的异常 + * + * @param errMsg + * @return + */ + public static RabbitMQException throwRabbitMQException(String errMsg) { + return new RabbitMQException(errMsg); + } + + /** + * 实例化默认的RabbitMQException的异常 + * + * @return + */ + public static RabbitMQException throwRabbitMQException() { + return new RabbitMQException(Constants.PARAMETER_DEFAULT_NOT_NULL_EXCEPTION_MSG); + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/listen/AbstractMessageHandler.java b/docus-common/src/main/java/com/docus/server/common/listen/AbstractMessageHandler.java new file mode 100644 index 0000000..bb747ec --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/listen/AbstractMessageHandler.java @@ -0,0 +1,152 @@ +package com.docus.server.common.listen; + +import com.alibaba.fastjson.JSONObject; +import com.docus.server.common.message.MqMessage; +import com.rabbitmq.client.Channel; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.amqp.core.AcknowledgeMode; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.retry.RecoveryCallback; +import org.springframework.retry.RetryCallback; +import org.springframework.retry.RetryContext; +import org.springframework.retry.policy.SimpleRetryPolicy; +import org.springframework.retry.support.RetryTemplate; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ConcurrentHashMap; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Package com.docus.viewtaskcollect.common.listen + * @ClassName AbstractMessageHandler + * @Description 消息接收处理类 + *

+ * 实现 ChannelAwareMessageListener接口 重写onMessage方法来实现业务的处理 + * @Author Amos + * @Modifier + * @Date 2019/7/1 20:09 + * @Version 1.0 + **/ +@Component +public abstract class AbstractMessageHandler implements ChannelAwareMessageListener { + + + public final Log logger = LogFactory.getLog(this.getClass()); + + @Value("${spring.message.queue.retryTimes:5}") + private Integer retryTimes; + + /** + * 用户自定义消息处理 + * + * @param message 消息 + */ + public abstract void handleMessage(String message, Channel channel); + + private ConcurrentHashMap ackMap = new ConcurrentHashMap<>(8); + + /** + * 消息处理 + * + * @param message 消息体 + * @param channel channel通道 + * @throws Exception + */ + @Override + public void onMessage(Message message, Channel channel) throws Exception { + this.logger.info("接收到发送的消息......."); + // 业务处理是否成功 + boolean handleResult = false; + // 消息处理标识 + long deliveryTag = message.getMessageProperties().getDeliveryTag(); + // 获取消费的队列名 + String queue = message.getMessageProperties().getConsumerQueue(); + + MqMessage mqMessage = null; + // TODO 进行自己的业务处理 比如记录日志 + try { + String msg = new String(message.getBody()); + mqMessage = JSONObject.parseObject(msg, MqMessage.class); + // 自定义业务处理 + this.handleMessage(JSONObject.toJSONString(mqMessage.getMessageBody()), channel); + } catch (Exception e) { + if (this.logger.isDebugEnabled()) { + e.printStackTrace(); + } + } + // TODO 如果消息处理失败,处理失败的采取措施, 确保消息不丢失 + this.onMessageCompleted(mqMessage, queue, channel, deliveryTag, handleResult); + } + + /** + * 消息处理结束后进行复处理 + * + * @param mqMessage 消息实体 + * @param queue + * @param channel + * @param deliveryTag + * @param handleResult 业务处理是否成功 + */ + private void onMessageCompleted(MqMessage mqMessage, String queue, Channel channel, long deliveryTag, boolean handleResult) { + this.logger.info("消息:" + mqMessage.toString() + "处理完成,等待事务提交和状态更新"); + if (!handleResult) { + // TODO 业务处理失败,需要更新状态 + return; + } + AcknowledgeMode ack = this.ackMap.get(queue); + if (ack.isManual()) { + //重试5次 + int retryTimes = 5; + //进行消息 + RetryTemplate oRetryTemplate = new RetryTemplate(); + SimpleRetryPolicy oRetryPolicy = new SimpleRetryPolicy(); + oRetryPolicy.setMaxAttempts(retryTimes); + oRetryTemplate.setRetryPolicy(oRetryPolicy); + try { + // obj为doWithRetry的返回结果,可以为任意类型 + Integer result = oRetryTemplate.execute(new RetryCallback() { + int count = 0; + + @Override + public Integer doWithRetry(RetryContext context) throws Exception {//开始重试 + channel.basicAck(deliveryTag, false); + AbstractMessageHandler.this.logger.info("消息" + mqMessage.toString() + "已签收"); + return ++this.count; + } + }, new RecoveryCallback() { + @Override + public Integer recover(RetryContext context) throws Exception { //重试多次后都失败了 + AbstractMessageHandler.this.logger.info("消息" + mqMessage.toString() + "签收失败"); + return Integer.MAX_VALUE; + } + }); + + if (result.intValue() <= retryTimes) { + //消息签收成功 更改状态 + } else { + //MQ服务器或网络出现问题,签收失败 更改状态 + } + } catch (Exception e) { + this.logger.error("消息" + mqMessage.toString() + "签收出现异常:" + e.getMessage()); + } + } else { + this.logger.info("消息自动签收"); + } + + } + + /** + * @param ack + * @Title: setAck + * @date: 2018年9月14日 上午11:17:41 + * @Description: 注入消息签收模式 + */ + public final void setAck(String queue, AcknowledgeMode ack) { + this.ackMap.put(queue, ack); + this.logger.info("注入队列 " + queue + " 消息签收模式: " + ack.name()); + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/listen/InitThreadLocalPoolListen.java b/docus-common/src/main/java/com/docus/server/common/listen/InitThreadLocalPoolListen.java new file mode 100644 index 0000000..e14608c --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/listen/InitThreadLocalPoolListen.java @@ -0,0 +1,40 @@ +package com.docus.server.common.listen; + + +import com.docus.server.common.thread.RequestThreadPool; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Package com.docus.viewtaskcollect.common.listener + * @ClassName InitThreadLocalPoolListen + * @Description 系统初始化监听器 初始队列 + * @Author Amos + * @Modifier + * @Date 2019/7/14 16:44 + * @Version 1.0 + **/ +public class InitThreadLocalPoolListen implements ServletContextListener { + /** + * 系统初始化队列 + * + * @param sce + */ + @Override + public void contextInitialized(ServletContextEvent sce) { + RequestThreadPool.getInstance(); + } + + /** + * 监听器销毁执行的逻辑 + * + * @param sce + */ + @Override + public void contextDestroyed(ServletContextEvent sce) { + + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/listen/MessageListen.java b/docus-common/src/main/java/com/docus/server/common/listen/MessageListen.java new file mode 100644 index 0000000..ba8791a --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/listen/MessageListen.java @@ -0,0 +1,54 @@ +package com.docus.server.common.listen; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.amqp.core.AcknowledgeMode; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; +import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Package com.docus.viewtaskcollect.common.listen + * @ClassName AbstractMessageHandle + * @Description 队列设置监听基类 + * @Author Amos + * @Modifier + * @Date 2019/7/1 20:21 + * @Version 1.0 + **/ +@Component +public class MessageListen { + + public final Log logger = LogFactory.getLog(this.getClass()); + + @Autowired + private ConnectionFactory connectionFactory; + + /** + * 在容器中加入消息监听 + * + * @param queue + * @param messageHandler + * @param isAck + * @throws Exception + */ + public void addMessageLister(String queue, AbstractMessageHandler messageHandler, boolean isAck) throws Exception { + SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); + container.setConnectionFactory(this.connectionFactory); + container.setQueueNames(queue); + AcknowledgeMode ack = AcknowledgeMode.NONE; + if (isAck) { + ack = AcknowledgeMode.MANUAL; + } + messageHandler.setAck(queue, ack); + container.setAcknowledgeMode(ack); + MessageListenerAdapter adapter = new MessageListenerAdapter(messageHandler); + container.setMessageListener(adapter); + container.start(); + this.logger.info("------ 已成功监听异步消息触发通知队列:" + queue + " ------"); + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/message/MessageData.java b/docus-common/src/main/java/com/docus/server/common/message/MessageData.java new file mode 100644 index 0000000..9894efd --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/message/MessageData.java @@ -0,0 +1,42 @@ +package com.docus.server.common.message; + +import lombok.Data; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: Message + * @Package: com.docus.viewtaskcollect.common.message + * @author: zhuqb + * @Description: 发送和接收的消息 + * @date: 2019/7/2 0002 下午 17:38 + * @Version: V1.0 + */ +@Data +public class MessageData { + /** + * 消息的内容 + */ + private Object content; + /** + * 发送方 + */ + private String sender; + /** + * 接收方 + */ + private String receiver; + /** + * 消息的类型(发布的内容/指令) + */ + private String msgType; + /** + * 唯一标志 + */ + private String tag; + /** + * 处理结果 + */ + private boolean handleResult; +} diff --git a/docus-common/src/main/java/com/docus/server/common/message/MqMessage.java b/docus-common/src/main/java/com/docus/server/common/message/MqMessage.java new file mode 100644 index 0000000..3e2750e --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/message/MqMessage.java @@ -0,0 +1,48 @@ +package com.docus.server.common.message; + +import lombok.Data; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Package com.docus.viewtaskcollect.common.message + * @ClassName MqMessage + * @Description 消息的封装类 + * @Author Amos + * @Modifier + * @Date 2019/7/1 15:15 + * @Version 1.0 + **/ +@Data +public class MqMessage { + /** + * 交换机名称 + */ + private String exchangeName; + /** + * 队列名称 + */ + private String queueName; + /** + * 消息Id + */ + private String messageId; + /** + * 消息体 + */ + private Object messageBody; + /** + * 路由键 + */ + private String routingKey; + /** + * 消息优先级 + */ + private String messagePriority; + /** + * 补偿次数 + */ + private Integer tryNum; + + +} diff --git a/docus-common/src/main/java/com/docus/server/common/register/AbstractRegisterQueue.java b/docus-common/src/main/java/com/docus/server/common/register/AbstractRegisterQueue.java new file mode 100644 index 0000000..2e23b5e --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/register/AbstractRegisterQueue.java @@ -0,0 +1,146 @@ +package com.docus.server.common.register; + +import com.docus.server.common.bean.MqExchange; +import com.docus.server.common.bean.MqQueue; +import com.docus.server.common.declare.AmBindDeclare; +import com.docus.server.common.declare.AmQueueDeclare; +import com.docus.server.common.listen.AbstractMessageHandler; +import com.docus.server.common.listen.MessageListen; +import lombok.Data; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.amqp.core.Binding; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.util.StringUtils; + +import java.util.Map; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: RegisterQueue + * @Package: com.docus.viewtaskcollect.common.register + * @author: zhuqb + * @Description: 注册队列并且设置监听 + * @date: 2019/7/2 0002 下午 15:32 + * @Version: V1.0 + */ +@Data +public abstract class AbstractRegisterQueue { + + public final Log logger = LogFactory.getLog(this.getClass()); + @Autowired + AmBindDeclare amBindDeclare; + @Autowired + AmQueueDeclare amQueueDeclare; + @Autowired + MessageListen messageListen; + + @Value("${spring.rabbitmq.queue.isAck:false}") + private Boolean isAck; + + /** + * 子类提供自定义的消息监听 + * + * @return + */ + public abstract AbstractMessageHandler messageHandler(); + + /** + * 实例化队列名 + * + * @param queue + * @return + */ + public AbstractRegisterQueue queue(String queue) { + this.queue = queue; + return this; + } + + /** + * 实例化交换机 + * + * @param exchange + * @return + */ + public AbstractRegisterQueue exchange(String exchange) { + this.exchange = exchange; + return this; + } + + /** + * 实例化路由键 + * + * @param routingKey + * @return + */ + public AbstractRegisterQueue routingKey(String routingKey) { + this.routingKey = routingKey; + return this; + } + + /** + * 实例化结构化属性 + * + * @param properties + * @return + */ + public AbstractRegisterQueue properties(Map properties) { + this.properties = properties; + return this; + } + + /** + * 队列名 + */ + private String queue; + /** + * 交换机 默认是 amq.direct 交换机 + */ + private String exchange = MqExchange.DEFAULT_DIRECT_EXCHANGE; + /** + * 路由键 默认是队列名 + */ + private String routingKey = this.getQueue(); + /** + * 结构化属性 + */ + private Map properties; + + public String getRoutingKey() { + if (StringUtils.isEmpty(this.routingKey)) { + return this.getQueue(); + } + return this.routingKey; + } + + /** + * 注册队列,并且监听队列 + * + * @return + */ + public boolean registerQueue() { + MqQueue mqQueue = new MqQueue().name(this.queue); + this.amQueueDeclare.declareQueue(mqQueue); + boolean tag = true; + if (!StringUtils.isEmpty(this.exchange)) { + tag = this.amBindDeclare.bind(this.queue, Binding.DestinationType.QUEUE, this.exchange, this.getRoutingKey(), this.properties); + } + if (tag) { + try { + this.messageListen.addMessageLister(this.queue, this.messageHandler(), this.isAck); + return Boolean.TRUE; + } catch (Exception e) { + if (this.logger.isDebugEnabled()) { + e.printStackTrace(); + } + return Boolean.FALSE; + } + + } + return tag; + } + +} diff --git a/docus-common/src/main/java/com/docus/server/common/request/Request.java b/docus-common/src/main/java/com/docus/server/common/request/Request.java new file mode 100644 index 0000000..3b89cf6 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/request/Request.java @@ -0,0 +1,20 @@ +package com.docus.server.common.request; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Package com.docus.viewtaskcollect.common.request + * @ClassName Request + * @Description 请求的接口 + * 该接口封装了请求的方法,实现类来实现具体的业务逻辑 + * @Author Amos + * @Modifier + * @Date 2019/7/14 17:34 + * @Version 1.0 + **/ +public interface Request { + /** + * 处理业务 + */ + void process(); +} diff --git a/docus-common/src/main/java/com/docus/server/common/request/RequestQueue.java b/docus-common/src/main/java/com/docus/server/common/request/RequestQueue.java new file mode 100644 index 0000000..ad57643 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/request/RequestQueue.java @@ -0,0 +1,89 @@ +package com.docus.server.common.request; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: RequestQueue + * @Package: com.docus.viewtaskcollect.common.request + * @author: zhuqb + * @Description: 请求的队列 + *

+ * 1. 这里需要使用单例模式来确保请求的队列的对象只有一个 + * @date: 2019/7/15 0015 下午 14:18 + * @Version: V1.0 + */ +public class RequestQueue { + /** + * 构造器私有化,这样就不能通过new来创建实例对象 + * 这里构造器私有化 这点跟枚举一样的,所以我们也可以通过枚举来实现单例模式,详见以后的博文 + */ + private RequestQueue() { + } + + /** + * 内存队列 + */ + private List> queues = new ArrayList>(); + /** + * 标志位 + */ + private Map tagMap = new ConcurrentHashMap<>(1); + + /** + * 私有的静态内部类来实现单例 + */ + private static class Singleton { + private static RequestQueue queue; + + static { + queue = new RequestQueue(); + } + + private static RequestQueue getInstance() { + return queue; + } + } + + /** + * 获取 RequestQueue 对象 + * + * @return + */ + public static RequestQueue getInstance() { + return Singleton.getInstance(); + } + + /** + * 向容器中添加队列 + * + * @param queue + */ + public void add(ArrayBlockingQueue queue) { + this.queues.add(queue); + } + + /** + * 获取队列大小 + * + * @return + */ + public int getSize() { + return this.queues.size(); + } + + /** + * 返回标志位 + * + * @return + */ + public Map getTagMap() { + return this.tagMap; + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/send/AbstractReceiveService.java b/docus-common/src/main/java/com/docus/server/common/send/AbstractReceiveService.java new file mode 100644 index 0000000..8608b2e --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/send/AbstractReceiveService.java @@ -0,0 +1,15 @@ +package com.docus.server.common.send; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Package com.docus.viewtaskcollect.common.send + * @ClassName AbstractReceiveService + * @Description 消息接受处理类 + * @Author Amos + * @Modifier + * @Date 2019/7/1 20:06 + * @Version 1.0 + **/ +public abstract class AbstractReceiveService { +} diff --git a/docus-common/src/main/java/com/docus/server/common/send/AbstractSendService.java b/docus-common/src/main/java/com/docus/server/common/send/AbstractSendService.java new file mode 100644 index 0000000..88b2881 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/send/AbstractSendService.java @@ -0,0 +1,197 @@ +package com.docus.server.common.send; + +import com.docus.server.common.bean.MqExchange; +import com.docus.server.common.exception.RabbitMQExceptionUtils; +import com.docus.server.common.message.MqMessage; +import com.docus.server.common.util.UUIDUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.amqp.AmqpException; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessagePostProcessor; +import org.springframework.amqp.rabbit.connection.CorrelationData; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.util.StringUtils; + +import javax.annotation.PostConstruct; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Package com.docus.viewtaskcollect.common.send + * @ClassName SendService + * @Description 发送消息的抽象类,子类可以实现该类来处理对应的业务逻辑 + *

+ * 抽象类实现了ConfirmCallback和ReturnCallback接口, + * confirmCallback来实现业务日志记录,并且自定义处理各自的业务处理逻辑 + * returnCallback来实现消息发送失败时的业务处理,并且自定义各自的业务处理逻辑 + * @Author Amos + * @Modifier + * @Date 2019/7/1 15:11 + * @Version 1.0 + **/ +public abstract class AbstractSendService implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback { + + public final Log logger = LogFactory.getLog(this.getClass()); + + public final static String DEFAULT_EXCHANGE = "amq.direct"; + + @Autowired + RabbitTemplate rabbitTemplate; + + /** + * 简单的发送消息 + * 发送的交换机是默认的 amq.direct交换机,该交换机的类型是DIRECT类型,开启持久化机制 + * 发送的队列即为RoutingKey,需要绑定队列时 + * + * @param queue 队列,默认是跟路由键是相同的 + * @param content 发送的内容 + */ + public void send(String queue, String content) { + if (StringUtils.isEmpty(queue)) { + RabbitMQExceptionUtils.throwRabbitMQException("发送的队列不能为空"); + } + if (StringUtils.isEmpty(content)) { + RabbitMQExceptionUtils.throwRabbitMQException("内容不能为空"); + } + this.send(MqExchange.DEFAULT_DIRECT_EXCHANGE, queue, content, null, UUIDUtils.generateUuid()); + } + + /** + * 发送一条有过期时间的消息 + * + * @param queue 队列,默认是跟路由键相同的 + * @param content 发送的内容 + * @param expireTime 过期时间 时间毫秒 + */ + public void send(String queue, String content, int expireTime) { + if (StringUtils.isEmpty(queue)) { + RabbitMQExceptionUtils.throwRabbitMQException("发送的队列不能为空"); + } + if (StringUtils.isEmpty(content)) { + RabbitMQExceptionUtils.throwRabbitMQException("内容不能为空"); + } + MessagePostProcessor messagePostProcessor = new MessagePostProcessor() { + @Override + public Message postProcessMessage(Message message) throws AmqpException { + // 设置消息的过期时间 + message.getMessageProperties().setExpiration(expireTime + ""); + return message; + } + }; + this.send(MqExchange.DEFAULT_DIRECT_EXCHANGE, queue, content, messagePostProcessor, UUIDUtils.generateUuid()); + } + + /** + * 按照给定的交换机、路由键、发送内容、发送的自定义属性来发送消息 + * TODO 待完善交互方式 + * + * @param exchange 交换机名称 + * @param routingKey 路由键 + * @param object 发送的内容 + * @param messagePostProcessor 发送消息自定义处理 + * @param messageId 消息ID + */ + public void send(String exchange, String routingKey, Object object, MessagePostProcessor messagePostProcessor, String messageId) { + if (StringUtils.isEmpty(exchange)) { + RabbitMQExceptionUtils.throwRabbitMQException("交换机不能为空"); + } + + if (StringUtils.isEmpty(routingKey)) { + RabbitMQExceptionUtils.throwRabbitMQException("路由键不能为空"); + } + + if (StringUtils.isEmpty(object)) { + RabbitMQExceptionUtils.throwRabbitMQException("发送的内容不能为空"); + } + + CorrelationData correlationData = new CorrelationData(); + correlationData.setId(StringUtils.isEmpty(messageId) ? UUIDUtils.generateUuid() : messageId); + MqMessage mqMessage = new MqMessage(); + mqMessage.setMessageBody(object); + mqMessage.setMessageId(correlationData.getId()); + mqMessage.setExchangeName(exchange); + mqMessage.setQueueName(routingKey); + mqMessage.setRoutingKey(routingKey); + if (StringUtils.isEmpty(messagePostProcessor)) { + this.rabbitTemplate.convertAndSend(exchange, routingKey, mqMessage, correlationData); + } else { + // 发送对应的消息 + this.rabbitTemplate.convertAndSend(exchange, routingKey, mqMessage, messagePostProcessor, correlationData); + } + } + + /** + * 默认实现发送确认的处理方法 + * 子类需要重写该方法,实现自己的业务处理逻辑 + * + * @param messageId 消息 + * @param ack + * @param cause + */ + public abstract void handleConfirmCallback(String messageId, boolean ack, String cause); + + /** + * 默认实现发送匹配不上队列时 回调函数的处理 + * + * @param message + * @param replyCode + * @param replyText + * @param routingKey + */ + public abstract void handleReturnCallback(Message message, int replyCode, String replyText, + String routingKey); + + /** + * 交换机如果根据自身的类型和路由键匹配上对应的队列时,是否调用returnCallback回调函数 + * true: 调用returnCallback回调函数 + * false: 不调用returnCallback回调函数 这样在匹配不上对应的队列时,会导致消息丢失 + */ + @Value("${spring.message.mandatory:false} ") + private Boolean mandatory; + /** + * 默认队列的优先级 + */ + public static final int MESSAGE_PRIORITY = 1; + + @PostConstruct + public final void init() { + this.logger.info("sendservice 初始化...... "); + + this.rabbitTemplate.setConfirmCallback(this); + this.rabbitTemplate.setReturnCallback(this); + } + + /** + * 确认后回调方法 + * + * @param correlationData + * @param ack + * @param cause + */ + @Override + public final void confirm(CorrelationData correlationData, boolean ack, String cause) { + this.logger.info("confirm-----correlationData:" + correlationData.toString() + "---ack:" + ack + "----cause:" + cause); + // TODO 记录日志(数据库或者es) + this.handleConfirmCallback(correlationData.getId(), ack, cause); + } + + /** + * 失败后回调方法 + * + * @param message + * @param replyCode + * @param replyText + * @param exchange + * @param routingKey + */ + @Override + public final void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) { + this.logger.info("return-----message:" + message.toString() + "---replyCode:" + replyCode + "----replyText:" + replyText + "----exchange:" + exchange + "----routingKey:" + routingKey); + // TODO 记录日志(数据库或者es) + this.handleReturnCallback(message, replyCode, replyText, routingKey); + } + +} diff --git a/docus-common/src/main/java/com/docus/server/common/service/IBaseService.java b/docus-common/src/main/java/com/docus/server/common/service/IBaseService.java index 136d81b..8b2aad5 100644 --- a/docus-common/src/main/java/com/docus/server/common/service/IBaseService.java +++ b/docus-common/src/main/java/com/docus/server/common/service/IBaseService.java @@ -2,7 +2,7 @@ package com.docus.server.common.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.IService; -import com.docus.server.common.Sort; +import com.docus.server.common.service.impl.Sort; import java.util.Collection; import java.util.List; diff --git a/docus-common/src/main/java/com/docus/server/common/service/RabbitMQApiService.java b/docus-common/src/main/java/com/docus/server/common/service/RabbitMQApiService.java new file mode 100644 index 0000000..e19b83f --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/service/RabbitMQApiService.java @@ -0,0 +1,18 @@ +package com.docus.server.common.service; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: RabbitMQApiService + * @Package: com.docus.viewtaskcollect.common.service + * @author: zhuqb + * @Description: RabbitMQ平台提供的一些典型的接口方法的整合 + *

+ * @date: 2019/7/5 0005 上午 11:56 + * @Version: V1.0 + */ +public interface RabbitMQApiService { + + +} diff --git a/docus-common/src/main/java/com/docus/server/common/service/impl/BaseServiceImpl.java b/docus-common/src/main/java/com/docus/server/common/service/impl/BaseServiceImpl.java index 2ab2802..7909899 100644 --- a/docus-common/src/main/java/com/docus/server/common/service/impl/BaseServiceImpl.java +++ b/docus-common/src/main/java/com/docus/server/common/service/impl/BaseServiceImpl.java @@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.docus.server.common.Sort; import com.docus.server.common.service.IBaseService; import java.lang.reflect.Field; diff --git a/docus-common/src/main/java/com/docus/server/common/service/impl/RabbitMQApiServiceImpl.java b/docus-common/src/main/java/com/docus/server/common/service/impl/RabbitMQApiServiceImpl.java new file mode 100644 index 0000000..bd3ff97 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/service/impl/RabbitMQApiServiceImpl.java @@ -0,0 +1,26 @@ +package com.docus.server.common.service.impl; + +import com.docus.server.common.service.RabbitMQApiService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: RabbitMQApiServiceImpl + * @Package: com.docus.viewtaskcollect.common.service.impl + * @author: zhuqb + * @Description: + * @date: 2019/7/5 0005 下午 12:01 + * @Version: V1.0 + */ +@Service +public class RabbitMQApiServiceImpl implements RabbitMQApiService { + + public List> listExchanges() { + return null; + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/Sort.java b/docus-common/src/main/java/com/docus/server/common/service/impl/Sort.java similarity index 96% rename from docus-common/src/main/java/com/docus/server/common/Sort.java rename to docus-common/src/main/java/com/docus/server/common/service/impl/Sort.java index 85f242e..86afad9 100644 --- a/docus-common/src/main/java/com/docus/server/common/Sort.java +++ b/docus-common/src/main/java/com/docus/server/common/service/impl/Sort.java @@ -1,4 +1,4 @@ -package com.docus.server.common; +package com.docus.server.common.service.impl; import java.util.ArrayList; import java.util.Collections; diff --git a/docus-common/src/main/java/com/docus/server/common/thread/RequestThread.java b/docus-common/src/main/java/com/docus/server/common/thread/RequestThread.java new file mode 100644 index 0000000..aaf4be4 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/thread/RequestThread.java @@ -0,0 +1,42 @@ +package com.docus.server.common.thread; + +import com.docus.server.common.request.Request; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.Callable; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: RequestThread + * @Package: com.docus.viewtaskcollect.common.thread + * @author: zhuqb + * @Description: 执行请求的工作线程 + *

+ * 线程和队列进行绑定,然后再线程中处理对应的业务逻辑 + * @date: 2019/7/15 0015 下午 14:34 + * @Version: V1.0 + */ +public class RequestThread implements Callable { + /** + * 队列 + */ + private ArrayBlockingQueue queue; + + public RequestThread(ArrayBlockingQueue queue) { + this.queue = queue; + } + + /** + * 方法中执行具体的业务逻辑 + * TODO + * + * @return + * @throws Exception + */ + @Override + public Boolean call() throws Exception { + return true; + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/thread/RequestThreadPool.java b/docus-common/src/main/java/com/docus/server/common/thread/RequestThreadPool.java new file mode 100644 index 0000000..35545f6 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/thread/RequestThreadPool.java @@ -0,0 +1,118 @@ +package com.docus.server.common.thread; + +import com.docus.server.common.request.Request; +import com.docus.server.common.request.RequestQueue; +import org.springframework.beans.factory.annotation.Value; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Package com.docus.viewtaskcollect.common.thread + * @ClassName RequestThreadPool + * @Description 请求线程池 + * 1. 使用线程池来管理线程,该线程池必须是单例的 + * 2. 线程池初始化成功后,创建缓存队列,并且和线程池进行绑定 + * @Author Amos + * @Modifier + * @Date 2019/7/14 16:47 + * @Version 1.0 + **/ +public class RequestThreadPool { + /** + * 核心线程数 + */ + @Value("${request.queue.corePoolSize:10}") + private Integer corePoolSize = 10; + /** + * 线程池最大线程数 + */ +// @Value("${request.queue.maximumPoolSize:20}") + private Integer maximumPoolSize = 20; + + /** + * 线程最大存活时间 + */ +// @Value("${request.queue.keepAliveTime:60}") + private Long keepAliveTime = 60L; + + /** + * 初始化线程池 这里我们不使用Executors.newFixedThreadPool()方式,该种方式不推荐使用, + * 主要是因为默认允许的队列的长度是Integer.MAX_VALUE,可能会造成OOM + * 第一个参数:corePoolSize: 线程中核心线程数的最大值(能同时运行的最大的线程数) + * 第二个参数:maximumPoolSize: 线程池中线程数的最大值 + * 第三个参数:keepAliveTime: 线程存活时间 + * 第四个参数:unit:时间单位 + * 第五个参数:BlockingQueue: 用于缓存任务的队列 这里使用 ArrayBlockingQueue 这个是有界队列 + */ + private ExecutorService threadPool = new ThreadPoolExecutor(this.corePoolSize, this.maximumPoolSize, + this.keepAliveTime, TimeUnit.SECONDS, + new ArrayBlockingQueue(this.corePoolSize)); + + + /** + * 构造器私有化,这样就不能通过new来创建实例对象 + *

+ * 类实例化的时候 ,初始化队列的大小,并且绑定队列和线程池以及队列与线程的关系 + *

+ * 初始化指定数量的队列 + */ + public RequestThreadPool() { + /** + *缓存队列集合来管理所有的缓存队列 + */ + RequestQueue requestQueue = RequestQueue.getInstance(); + for (int i = 0; i < this.corePoolSize; i++) { + /** + * 缓存队列使用Request 接口来作为泛型,将可以将队列的类型添加定义,同时也可以通过多态的特性来实现子类的扩展 + * 目前Request只是定义,业务可以之后实现 + */ + ArrayBlockingQueue queue = new ArrayBlockingQueue<>(this.corePoolSize); + requestQueue.add(queue); + // 线程池和缓存队列通过线程来绑定 + // 每个线程对应一个队列 + this.threadPool.submit(new RequestThread(queue)); + } + } + + /** + * 使用静态内部类来实现单例的模式(绝对的线程安全) + */ + private static class Singleton { + /** + * 私有的静态变量,确保该变量不会被外部调用 + */ + private static RequestThreadPool requestThreadPool; + + /** + * 静态代码块在类初始化时执行一次 + */ + static { + requestThreadPool = new RequestThreadPool(); + } + + /** + * 静态内部类对外提供实例的获取方法 + * + * @return + */ + public static RequestThreadPool getInstance() { + return requestThreadPool; + } + } + + /** + * 请求线程池类对外提供获取实例的方法 由于外部类没有RequestThreadPool的实例对象,所以除了该方法,外部类无法创建额外的RequestThreadPool对象 + * + * @return + */ + public static RequestThreadPool getInstance() { + return Singleton.getInstance(); + } + + +} diff --git a/docus-common/src/main/java/com/docus/server/common/type/AmExcepitonEnum.java b/docus-common/src/main/java/com/docus/server/common/type/AmExcepitonEnum.java new file mode 100644 index 0000000..40aaf99 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/type/AmExcepitonEnum.java @@ -0,0 +1,35 @@ +package com.docus.server.common.type; + +import com.docus.server.common.exception.RabbitMQExceptionAssert; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: AmExcepitonEnum + * @Package: com.docus.viewtaskcollect.common.type + * @author: zhuqb + * @Description: + * @date: 2019/7/10 0010 下午 17:12 + * @Version: V1.0 + */ +public enum AmExcepitonEnum implements RabbitMQExceptionAssert { + NOT_NULL(0, "参数不能为空"); + private int code; + private String msg; + + private AmExcepitonEnum(int code, String msg) { + this.code = code; + this.msg = msg; + } + + @Override + public int getCode() { + return this.code; + } + + @Override + public String getMsg() { + return this.msg; + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/type/ExchangeTypeEnum.java b/docus-common/src/main/java/com/docus/server/common/type/ExchangeTypeEnum.java new file mode 100644 index 0000000..caa35e5 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/type/ExchangeTypeEnum.java @@ -0,0 +1,46 @@ +package com.docus.server.common.type; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: ExchangeTypeEnum + * @Package: com.docus.viewtaskcollect.common.type + * @author: amos + * @Description: + * @date: 2019/6/28 0028 下午 14:42 + * @Version: V1.0 + */ +public enum ExchangeTypeEnum { + /** + * direct + */ + DIRECT("direct"), + /** + * topic + */ + TOPIC("topic"), + /** + * fanout + */ + FANOUT("fanout"), + /** + * headers + */ + HEADERS("headers"); + + private String code; + + private ExchangeTypeEnum(String code) { + this.code = code; + } + + public String getCode() { + return this.code; + } + + public void setCode(String code) { + this.code = code; + } + +} diff --git a/docus-common/src/main/java/com/docus/server/common/type/ResultEnum.java b/docus-common/src/main/java/com/docus/server/common/type/ResultEnum.java new file mode 100644 index 0000000..cfd0d32 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/type/ResultEnum.java @@ -0,0 +1,53 @@ +package com.docus.server.common.type; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: ResultEnum + * @Package: com.docus.viewtaskcollect.common.type + * @author: amos + * @Description: + * @date: 2019/6/28 0028 上午 9:45 + * @Version: V1.0 + */ +public enum ResultEnum { + SUCCESS(1, "ok"), + FAIL(0, "校验错误"), + ERROR(-1, "系统错误"); + private Integer code; + private String desc; + + private ResultEnum(Integer code, String desc) { + this.code = code; + this.desc = desc; + } + + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getDesc() { + return this.desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public static Integer success() { + return SUCCESS.getCode(); + } + + public static Integer fail() { + return FAIL.getCode(); + } + + public static Integer error() { + return ERROR.getCode(); + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/util/ClassUtils.java b/docus-common/src/main/java/com/docus/server/common/util/ClassUtils.java new file mode 100644 index 0000000..acbccc8 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/util/ClassUtils.java @@ -0,0 +1,40 @@ +package com.docus.server.common.util; + +import com.docus.server.common.exception.RabbitMQExceptionUtils; +import org.apache.commons.lang3.reflect.FieldUtils; +import org.springframework.util.StringUtils; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: ClassUtils + * @Package: com.docus.viewtaskcollect.common.util + * @author: amos + * @Description: 操作类的工具方法 + * @date: 2019/6/28 0028 下午 15:49 + * @Version: V1.0 + */ +public class ClassUtils { + /** + * 获取类中所有的field + * + * @param clazz + * @return + */ + public static List getAllField(Class clazz) { + if (StringUtils.isEmpty(clazz)) { + RabbitMQExceptionUtils.throwRabbitMQException(); + } + Field[] fields = FieldUtils.getAllFields(clazz); + if (fields != null && fields.length > 0) { + return Arrays.asList(fields); + } + return new ArrayList<>(); + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/util/RabbitMQUtils.java b/docus-common/src/main/java/com/docus/server/common/util/RabbitMQUtils.java new file mode 100644 index 0000000..2fc9dc7 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/util/RabbitMQUtils.java @@ -0,0 +1,49 @@ +package com.docus.server.common.util; + +import okhttp3.Call; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: RabbitMQUtils + * @Package: com.docus.viewtaskcollect.common.util + * @author: zhuqb + * @Description: + * @date: 2019/7/5 0005 下午 13:41 + * @Version: V1.0 + */ +@Service +public class RabbitMQUtils { + @Value("${rabbitmq.api-baseUrl:http://192.168.56.105:15672/api/}") + private String apiBaseUrl; + + public static final String LIST_EXCHANGES = "exchanges"; + + public List> listExchanges() { + OkHttpClient okHttpClient = new OkHttpClient(); + Request request = new Request.Builder().url(this.apiBaseUrl + LIST_EXCHANGES).get().build(); + Call call = okHttpClient.newCall(request); + Response response = null; + try { + response = call.execute(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (!StringUtils.isEmpty(request)) { + response.close(); + } + } + return null; + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/util/ResultWapper.java b/docus-common/src/main/java/com/docus/server/common/util/ResultWapper.java new file mode 100644 index 0000000..13901a7 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/util/ResultWapper.java @@ -0,0 +1,68 @@ +package com.docus.server.common.util; + +import com.docus.server.common.bean.Result; +import com.docus.server.common.type.ResultEnum; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: ResultWapper + * @Package: com.docus.viewtaskcollect.common.util + * @author: amos + * @Description: + * @date: 2019/6/28 0028 上午 9:58 + * @Version: V1.0 + */ +public class ResultWapper { + /** + * 初始化Result + * + * @param code + * @param msg + * @param data + * @return + */ + public static Result result(Integer code, String msg, Object data) { + return new Result(code, msg, data); + } + + /** + * 返回成功(附带数据) + * + * @param data + * @return + */ + public static Result success(Object data) { + return result(ResultEnum.success(), ResultEnum.SUCCESS.getDesc(), data); + } + + /** + * 返回成功 没有数据 + * + * @return + */ + public static Result success() { + return result(ResultEnum.success(), ResultEnum.SUCCESS.getDesc(), null); + } + + /** + * 返回校验失败 + * + * @param msg + * @return + */ + public static Result fail(String msg) { + return result(ResultEnum.fail(), ResultEnum.FAIL.getDesc(), null); + } + + /** + * 返回失败信息 + * + * @param msg + * @return + */ + public static Result error(String msg) { + return result(ResultEnum.error(), ResultEnum.ERROR.getDesc(), null); + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/util/UUIDUtils.java b/docus-common/src/main/java/com/docus/server/common/util/UUIDUtils.java new file mode 100644 index 0000000..99fe835 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/util/UUIDUtils.java @@ -0,0 +1,25 @@ +package com.docus.server.common.util; + +import java.util.UUID; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Package com.docus.viewtaskcollect.common.util + * @ClassName UUIDUtils + * @Description uuid 操作类 + * @Author Amos + * @Modifier + * @Date 2019/7/1 19:07 + * @Version 1.0 + **/ +public class UUIDUtils { + /** + * 生成随机的uuid + * + * @return + */ + public static String generateUuid() { + return UUID.randomUUID().toString().replaceAll("-", ""); + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/util/ValidateUtils.java b/docus-common/src/main/java/com/docus/server/common/util/ValidateUtils.java new file mode 100644 index 0000000..b7f6f6e --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/util/ValidateUtils.java @@ -0,0 +1,71 @@ +package com.docus.server.common.util; + +import com.docus.server.common.bean.Result; +import com.docus.server.common.exception.RabbitMQExceptionUtils; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import javax.validation.constraints.NotNull; +import java.lang.reflect.Field; +import java.util.List; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: ValidateUtils + * @Package: com.docus.viewtaskcollect.common.util + * @author: amos + * @Description: 校验工具类 + * @date: 2019/6/28 0028 下午 15:46 + * @Version: V1.0 + */ +public class ValidateUtils { + /** + * 校验对象

+ * 根据对象中的@NotNull注解来判断 + * + * @param object + * @return + */ + public static Result validate(Object object) { + if (StringUtils.isEmpty(object)) { + RabbitMQExceptionUtils.throwRabbitMQException(); + } + + List fields = ClassUtils.getAllField(object.getClass()); + return validateFields(fields, object); + } + + /** + * 校验属性中是否存在空的数据 + * + * @param list + * @param data + * @return + */ + public static Result validateFields(List list, Object data) { + if (CollectionUtils.isEmpty(list)) { + RabbitMQExceptionUtils.throwRabbitMQException("获取不到对象的属性"); + } + for (Field field : list) { + if (!field.isAnnotationPresent(NotNull.class)) { + continue; + } + NotNull notNull = field.getAnnotation(NotNull.class); + boolean isAccessable = field.isAccessible(); + try { + field.setAccessible(Boolean.TRUE); + Object value = field.get(data); + if (StringUtils.isEmpty(value)) { + return ResultWapper.fail(notNull.message()); + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } finally { + field.setAccessible(isAccessable); + } + } + return ResultWapper.success(); + } +} diff --git a/docus-common/src/main/java/com/docus/server/common/util/ValidatorResultUtil.java b/docus-common/src/main/java/com/docus/server/common/util/ValidatorResultUtil.java new file mode 100644 index 0000000..1d179c0 --- /dev/null +++ b/docus-common/src/main/java/com/docus/server/common/util/ValidatorResultUtil.java @@ -0,0 +1,31 @@ +package com.docus.server.common.util; + +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * Copyright © 2018 五月工作室. All rights reserved. + * + * @Project: rabbitmq + * @ClassName: ValidatorResultUtil + * @Package: com.docus.viewtaskcollect.common.util + * @author: zhuqb + * @Description: + * @date: 2019/7/10 0010 下午 17:22 + * @Version: V1.0 + */ +public class ValidatorResultUtil { + + public static String getMessage(BindingResult result) { + List fieldErrorList = null; + String errorMsg = null; + if (result.hasErrors()) { + fieldErrorList = result.getFieldErrors(); + errorMsg = fieldErrorList.stream().map(fieldError -> fieldError.getDefaultMessage()).collect(Collectors.joining(";")).replace("\"", ""); + } + return errorMsg; + } +} diff --git a/docus-common/src/main/resources/application.properties b/docus-common/src/main/resources/application.properties new file mode 100644 index 0000000..d58204b --- /dev/null +++ b/docus-common/src/main/resources/application.properties @@ -0,0 +1 @@ +mybatis-plus.typeEnumsPackage=com.docus.server.common.enums; \ No newline at end of file diff --git a/docus-sys/src/main/java/com/docus/server/sys/service/impl/PowerUserServiceImpl.java b/docus-sys/src/main/java/com/docus/server/sys/service/impl/PowerUserServiceImpl.java index 9ef6176..0bf1014 100644 --- a/docus-sys/src/main/java/com/docus/server/sys/service/impl/PowerUserServiceImpl.java +++ b/docus-sys/src/main/java/com/docus/server/sys/service/impl/PowerUserServiceImpl.java @@ -2,7 +2,7 @@ package com.docus.server.sys.service.impl; import com.docus.core.util.Func; import com.docus.infrastructure.redis.service.IdService; -import com.docus.server.common.UserProperties; +import com.docus.server.common.config.UserProperties; import com.docus.server.common.service.impl.BaseServiceImpl; import com.docus.server.sys.common.pojo.dto.UserDTO; import com.docus.server.sys.common.pojo.dto.UserModifyParam; diff --git a/lis-sysem/src/main/java/com/docus/server/lis/infrastructure/mapper/LisDeptMapper.java b/lis-sysem/src/main/java/com/docus/server/lis/infrastructure/mapper/LisDeptMapper.java index c5c0f68..abe05f4 100644 --- a/lis-sysem/src/main/java/com/docus/server/lis/infrastructure/mapper/LisDeptMapper.java +++ b/lis-sysem/src/main/java/com/docus/server/lis/infrastructure/mapper/LisDeptMapper.java @@ -2,21 +2,21 @@ package com.docus.server.lis.infrastructure.mapper; import com.baomidou.dynamic.datasource.annotation.DS; import com.docus.server.lis.common.DSKeyConstants; -import com.docus.server.sys.common.pojo.dto.DeptDTO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.Date; import java.util.List; +import java.util.Map; @Mapper @DS(DSKeyConstants.DS_KEY) public interface LisDeptMapper { - List getDeptListView(@Param("startDate") Date startDate, - @Param("endDate") Date endDate, - @Param("offset") int offset, - @Param("pageSize") int pageSize); + List> list(@Param("startDate") Date startDate, + @Param("endDate") Date endDate, + @Param("offset") int offset, + @Param("pageSize") int pageSize); } diff --git a/lis-sysem/src/main/java/com/docus/server/lis/service/ILisService.java b/lis-sysem/src/main/java/com/docus/server/lis/service/ILisService.java index 3181181..5970842 100644 --- a/lis-sysem/src/main/java/com/docus/server/lis/service/ILisService.java +++ b/lis-sysem/src/main/java/com/docus/server/lis/service/ILisService.java @@ -1,14 +1,14 @@ package com.docus.server.lis.service; import com.docus.server.record.common.pojo.dto.TBasicDTO; -import com.docus.server.sys.common.pojo.dto.DeptDTO; import com.docus.server.sys.common.pojo.dto.UserDTO; import java.util.Date; import java.util.List; +import java.util.Map; public interface ILisService { - List getDeptListView(Date startDate, Date endDate, int pageNum, int pageSize); + List> list(Date startDate, Date endDate, int pageNum, int pageSize); List getUserListView(Date startDate, Date endDate, int pageNum, int pageSize); diff --git a/lis-sysem/src/main/java/com/docus/server/lis/service/impl/LisServiceImpl.java b/lis-sysem/src/main/java/com/docus/server/lis/service/impl/LisServiceImpl.java index 3b07400..adcff95 100644 --- a/lis-sysem/src/main/java/com/docus/server/lis/service/impl/LisServiceImpl.java +++ b/lis-sysem/src/main/java/com/docus/server/lis/service/impl/LisServiceImpl.java @@ -5,13 +5,13 @@ import com.docus.server.lis.infrastructure.mapper.LisTBasicMapper; import com.docus.server.lis.infrastructure.mapper.LisUserMapper; import com.docus.server.lis.service.ILisService; import com.docus.server.record.common.pojo.dto.TBasicDTO; -import com.docus.server.sys.common.pojo.dto.DeptDTO; import com.docus.server.sys.common.pojo.dto.UserDTO; import lombok.AllArgsConstructor; import org.springframework.stereotype.Component; import java.util.Date; import java.util.List; +import java.util.Map; @Component @AllArgsConstructor @@ -22,8 +22,8 @@ public class LisServiceImpl implements ILisService { private final LisTBasicMapper hisTBasicMapper; @Override - public List getDeptListView(Date startDate, Date endDate, int pageNum, int pageSize) { - return hisDeptMapper.getDeptListView(startDate, endDate, (pageNum - 1) * pageSize, pageSize); + public List> list(Date startDate, Date endDate, int pageNum, int pageSize) { + return hisDeptMapper.list(startDate, endDate, (pageNum - 1) * pageSize, pageSize); } diff --git a/lis-sysem/src/main/resources/mapper/LisDeptMapper.xml b/lis-sysem/src/main/resources/mapper/LisDeptMapper.xml index 88b2cc2..55b9477 100644 --- a/lis-sysem/src/main/resources/mapper/LisDeptMapper.xml +++ b/lis-sysem/src/main/resources/mapper/LisDeptMapper.xml @@ -4,16 +4,36 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + SELECT DISTINCT + '6' AS SYS_CODE, + ZYH AS ZYH, + JZH AS FVISIT_ID, + FILE_NAME AS REPORT_NAME, + '' AS BGLX, + '1503577916225949698' AS ASSORTID, + EXAM_NO AS RP_EXAM_NO, + 1 AS PATH_TYPE, + FILE_PATHFILE_PATH AS FILE_PATH, + 0 AS ISDELETE, + 0 AS state, + '' AS jch, + '' AS checktime, + AFFIRM_TIME AS MODIFYTIME + FROM + V_JSWZH_LISRECORD + WHERE + 1 = 1 + AND AFFIRM_TIME ]]> #{startDate} + AND AFFIRM_TIME #{endDate} + ORDER BY + AFFIRM_TIME DESC LIMIT #{offset}, #{pageSize}