被动消息 根据id重试和根据搜索条件重试

segment2.0
linrf 2 years ago
parent ec5bf55d30
commit 14bb1b5d7e

@ -5,9 +5,6 @@ spring:
active: dev
application:
name: @artifactId@
jackson:
date-format: yyyy-MM-dd hh:mm:ss
time-zone: GMT+8
datasource:
dynamic:
primary: master #设置默认的数据源默认值为master
@ -16,92 +13,92 @@ spring:
#公司病案的文件服务数据库
master:
url: jdbc:log4jdbc:mysql://db.docus.cn:3306/docus_archivefile?autoReconnect=true&allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
username: docus
password: docus702
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
type: com.alibaba.druid.pool.DruidDataSource
#公司病案的系统服务数据库
system:
url: jdbc:log4jdbc:mysql://db.docus.cn:3306/docus_system?autoReconnect=true&allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
username: docus
password: docus702
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
type: com.alibaba.druid.pool.DruidDataSource
#公司病案的基础服务数据库
record:
url: jdbc:log4jdbc:mysql://db.docus.cn:3306/docus_medicalrecord?autoReconnect=true&allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
username: docus
password: docus702
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
type: com.alibaba.druid.pool.DruidDataSource
#医院的用户/科室/基础数据的数据库
his:
url: jdbc:log4jdbc:mysql://127.0.0.1:3306/his?autoReconnect=true&allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
password: root@123456
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
type: com.alibaba.druid.pool.DruidDataSource
#病理数据
bl:
url: jdbc:log4jdbc:mysql://127.0.0.1:3306/his?autoReconnect=true&allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
password: root@123456
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
type: com.alibaba.druid.pool.DruidDataSource
#电生理系统数据
ecg:
url: jdbc:log4jdbc:mysql://127.0.0.1:3306/his?autoReconnect=true&allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
password: root@123456
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
type: com.alibaba.druid.pool.DruidDataSource
#电子病历系统数据
emr:
url: jdbc:log4jdbc:mysql://127.0.0.1:3306/his?autoReconnect=true&allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
password: root@123456
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
type: com.alibaba.druid.pool.DruidDataSource
#护理文书系统数据
hl:
url: jdbc:log4jdbc:mysql://127.0.0.1:3306/his?autoReconnect=true&allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
password: root@123456
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
type: com.alibaba.druid.pool.DruidDataSource
#手麻系统数据
issubmit:
url: jdbc:log4jdbc:mysql://127.0.0.1:3306/his?autoReconnect=true&allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
password: root@123456
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
type: com.alibaba.druid.pool.DruidDataSource
#lis系统数据
lis:
url: jdbc:log4jdbc:mysql://127.0.0.1:3306/lis?autoReconnect=true&allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
password: root@123456
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
type: com.alibaba.druid.pool.DruidDataSource
#Pacs系统数据视图
pacs:
url: jdbc:log4jdbc:mysql://127.0.0.1:3306/his?autoReconnect=true&allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
password: root@123456
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
type: com.alibaba.druid.pool.DruidDataSource
#vte静脉血栓栓塞症
vte:
url: jdbc:log4jdbc:mysql://127.0.0.1:3306/his?autoReconnect=true&allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
password: root@123456
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
type: com.alibaba.druid.pool.DruidDataSource
#重症系统数据
zz:
url: jdbc:log4jdbc:mysql://127.0.0.1:3306/his?autoReconnect=true&allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
password: root@123456
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
type: com.alibaba.druid.pool.DruidDataSource
# rabbitmq:
@ -111,7 +108,7 @@ spring:
# password: guest
redis:
host: redis.docus.cn
# password: JSdocus@702
password: JSdocus@702
cloud:
nacos:
discovery:

@ -1,8 +1,8 @@
package com.docus.server.collect.web.job;
import com.docus.server.entity.TaskMessage;
import com.docus.server.archivefile.service.ITaskMessageService;
import com.docus.server.collect.web.service.TrackRetryService;
import com.docus.server.archivefile.service.impl.TrackRetryService;
import com.docus.server.entity.TaskMessage;
import com.docus.server.enums.StateEnum;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;

@ -4,14 +4,13 @@ import com.docus.infrastructure.web.request.SearchRequest;
import com.docus.infrastructure.web.response.PageResult;
import com.docus.server.api.archivefile.TaskMessageApi;
import com.docus.server.archivefile.convert.TaskMessageConvert;
import com.docus.server.archivefile.convert.TaskMessageConverter;
import com.docus.server.archivefile.service.ITaskMessageRetryLogService;
import com.docus.server.archivefile.service.ITaskMessageService;
import com.docus.server.entity.TaskMessage;
import com.docus.server.vo.TaskMessageVO;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
* Controller
@ -21,10 +20,6 @@ import javax.annotation.Resource;
public class TaskMessageController implements TaskMessageApi {
@Resource
private ITaskMessageService taskMessageService;
@Resource
private ITaskMessageRetryLogService taskMessageRetryLogService;
@Resource
private TaskMessageConverter taskMessageConverter;
/**
*
@ -48,4 +43,22 @@ public class TaskMessageController implements TaskMessageApi {
public PageResult<TaskMessageVO> search(SearchRequest searchRequest) {
return taskMessageService.search(searchRequest);
}
/**
*
*
* @param searchRequest
*/
@Override
public void searchRetry(SearchRequest searchRequest) {
taskMessageService.searchRetry(searchRequest);
}
/**
*
*/
@Override
public void findRetry(List<Long> ids) {
taskMessageService.findRetry(ids);
}
}

@ -1,6 +1,5 @@
package com.docus.server.archivefile.convert;
import com.docus.core.util.DateUtil;
import com.docus.infrastructure.web.response.PageResult;
import com.docus.server.entity.TaskMessage;
import com.docus.server.enums.CollectTypeEnum;
@ -36,8 +35,6 @@ public interface TaskMessageConvert {
taskOriginalMessage.setJsonStr(json);
taskOriginalMessage.setSource(xml);
taskOriginalMessage.setState(StateEnum.OK);
taskOriginalMessage.setCreateTime(DateUtil.now());
taskOriginalMessage.setUpdateTime(DateUtil.now());
return taskOriginalMessage;
}
}

@ -1,31 +0,0 @@
package com.docus.server.archivefile.convert;
import com.docus.core.util.DateUtil;
import com.docus.infrastructure.redis.service.IdService;
import com.docus.server.entity.TaskMessage;
import com.docus.server.enums.CollectTypeEnum;
import com.docus.server.enums.StateEnum;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class TaskMessageConverter {
@Resource
private IdService idService;
public TaskMessage toConvertTaskOriginalMessageDO(String json, String xml, CollectTypeEnum collectType, String retryKey) {
TaskMessage taskOriginalMessage = new TaskMessage();
taskOriginalMessage.setId(idService.getDateSeq());
taskOriginalMessage.setName(collectType.name());
taskOriginalMessage.setMemo(collectType.getDesc());
taskOriginalMessage.setCollectType(collectType);
taskOriginalMessage.setRetryKey(retryKey);
taskOriginalMessage.setJsonStr(json);
taskOriginalMessage.setSource(xml);
taskOriginalMessage.setState(StateEnum.OK);
taskOriginalMessage.setCreateTime(DateUtil.now());
taskOriginalMessage.setUpdateTime(DateUtil.now());
return taskOriginalMessage;
}
}

@ -0,0 +1,29 @@
package com.docus.server.archivefile.convert;
import com.docus.server.entity.TaskMessage;
import com.docus.server.entity.TaskMessageRetryLog;
import com.docus.server.enums.StateEnum;
import org.mapstruct.Mapper;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
@Mapper
public interface TaskMessageRetryLogConvert {
TaskMessageRetryLogConvert INSTANCE = Mappers.getMapper(TaskMessageRetryLogConvert.class);
@Mappings({})
TaskMessageRetryLog convert(TaskMessage taskMessage);
default TaskMessageRetryLog toConvertRetryLog(TaskMessage message, Long id) {
TaskMessageRetryLog taskMessageRetryLog = convert(message);
taskMessageRetryLog.setId(id);
taskMessageRetryLog.setMessageId(message.getId());
return taskMessageRetryLog;
}
default void afterThrowingProcess(String errorMsg, TaskMessageRetryLog taskMessageRetryLog) {
taskMessageRetryLog.setErrorMsg(errorMsg);
taskMessageRetryLog.setState(StateEnum.FAIL);
}
}

@ -1,8 +0,0 @@
package com.docus.server.archivefile.convert;
import org.springframework.stereotype.Component;
@Component
public class TaskMessageRetryLogConverter {
}

@ -33,7 +33,7 @@ public class TaskMessageDaoImpl extends BaseDaoImpl<TaskMessageMapper, TaskMessa
query.eq(TaskMessage::getState, searchRequest.getParams("state"));
}
if (Func.isNotBlank(searchRequest.getKeyword())) {
query.like(TaskMessage::getName, String.format("%s%s%s", "%", searchRequest.getKeyword(), "%"));
query.like(TaskMessage::getMemo, String.format("%s%s%s", "%", searchRequest.getKeyword(), "%"));
}
if (searchRequest.getParams("collectType") != null) {
query.eq(TaskMessage::getCollectType, searchRequest.getParams("collectType"));

@ -12,4 +12,6 @@ public interface ITaskMessageRetryLogService {
TaskMessageRetryLog findById(String id);
PageResult<TaskMessageRetryLog> search(SearchRequest searchRequest);
void saveTaskMessageRetryLog(TaskMessageRetryLog taskMessageRetryLog);
}

@ -20,4 +20,8 @@ public interface ITaskMessageService {
TaskMessage findById(String id);
PageResult<TaskMessageVO> search(SearchRequest searchRequest);
void searchRetry(SearchRequest searchRequest);
void findRetry(List<Long> ids);
}

@ -2,19 +2,17 @@ package com.docus.server.archivefile.service.impl;
import com.docus.infrastructure.web.request.SearchRequest;
import com.docus.infrastructure.web.response.PageResult;
import com.docus.server.archivefile.convert.TaskMessageRetryLogConverter;
import com.docus.server.archivefile.infrastructure.dao.ITaskMessageRetryLogDao;
import com.docus.server.archivefile.service.ITaskMessageRetryLogService;
import com.docus.server.entity.TaskMessageRetryLog;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
@Service
public class TaskMessageRetryLogServiceImpl implements ITaskMessageRetryLogService {
@Resource
private TaskMessageRetryLogConverter taskMessageRetryLogConverter;
@Resource
private ITaskMessageRetryLogDao taskMessageRetryLogDao;
@ -32,4 +30,10 @@ public class TaskMessageRetryLogServiceImpl implements ITaskMessageRetryLogServi
public PageResult<TaskMessageRetryLog> search(SearchRequest searchRequest) {
return taskMessageRetryLogDao.search(searchRequest);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void saveTaskMessageRetryLog(TaskMessageRetryLog taskMessageRetryLog) {
taskMessageRetryLogDao.save(taskMessageRetryLog);
}
}

@ -8,7 +8,6 @@ import com.docus.infrastructure.redis.service.IdService;
import com.docus.infrastructure.web.request.SearchRequest;
import com.docus.infrastructure.web.response.PageResult;
import com.docus.server.archivefile.convert.TaskMessageConvert;
import com.docus.server.archivefile.convert.TaskMessageConverter;
import com.docus.server.archivefile.infrastructure.dao.ITaskMessageDao;
import com.docus.server.archivefile.infrastructure.dao.ITaskMessageRetryLogDao;
import com.docus.server.archivefile.service.ITaskMessageService;
@ -17,6 +16,7 @@ import com.docus.server.entity.TaskMessageRetryLog;
import com.docus.server.enums.CollectTypeEnum;
import com.docus.server.enums.StateEnum;
import com.docus.server.vo.TaskMessageVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
@ -25,16 +25,17 @@ import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
@Slf4j
@Service
public class TaskMessageServiceImpl implements ITaskMessageService {
@Resource
private TaskMessageConverter converter;
@Resource
private ITaskMessageDao taskMessageDao;
@Resource
private ITaskMessageRetryLogDao taskMessageRetryLogDao;
@Resource
private IdService idService;
@Resource
private TrackRetryService trackRetryService;
/**
* ws xml
@ -43,7 +44,6 @@ public class TaskMessageServiceImpl implements ITaskMessageService {
@Override
public Long insertTaskMessage(String json, String xml, CollectTypeEnum collectType, String retryKey) {
TaskMessage taskOriginalMessage = TaskMessageConvert.INSTANCE.convert(json, xml, collectType, retryKey, idService.getDateSeq());
// TaskMessage taskOriginalMessage = converter.toConvertTaskOriginalMessageDO(json, xml, collectType, retryKey);
taskMessageDao.save(taskOriginalMessage);
return taskOriginalMessage.getId();
}
@ -76,7 +76,7 @@ public class TaskMessageServiceImpl implements ITaskMessageService {
@Override
public PageResult<TaskMessageVO> search(SearchRequest request) {
PageResult<TaskMessageVO> result = TaskMessageConvert.INSTANCE.convert(taskMessageDao.searchTaskMessage(request));
PageResult<TaskMessageVO> result = TaskMessageConvert.INSTANCE.convert(searchTaskMessage(request));
if (CollectionUtils.isEmpty(result.getList())) {
return new PageResult<>();
@ -93,4 +93,34 @@ public class TaskMessageServiceImpl implements ITaskMessageService {
return result;
}
public PageResult<TaskMessage> searchTaskMessage(SearchRequest request) {
return taskMessageDao.searchTaskMessage(request);
}
@Override
public void searchRetry(SearchRequest searchRequest) {
PageResult<TaskMessage> result = searchTaskMessage(searchRequest);
actionRetry(result.getList());
}
@Override
public void findRetry(List<Long> ids) {
List<TaskMessage> taskMessages = taskMessageDao.findBy("id", ids);
actionRetry(taskMessages);
}
private void actionRetry(List<TaskMessage> taskMessages) {
if (CollectionUtils.isEmpty(taskMessages)) {
return;
}
for (TaskMessage message : taskMessages) {
trackRetryService.doRetry(message);
}
}
}

@ -1,18 +1,16 @@
package com.docus.server.collect.web.service;
package com.docus.server.archivefile.service.impl;
import com.docus.core.util.DateUtil;
import com.docus.core.util.json.JSON;
import com.docus.infrastructure.redis.service.IdService;
import com.docus.log.executor.TrackRetrySpringExecutor;
import com.docus.log.handler.IJobHandler;
import com.docus.log.handler.impl.MethodJobHandler;
import com.docus.server.archivefile.convert.TaskMessageRetryLogConvert;
import com.docus.server.archivefile.infrastructure.dao.ITaskMessageRetryLogDao;
import com.docus.server.entity.TaskMessage;
import com.docus.server.entity.TaskMessageRetryLog;
import com.docus.server.enums.StateEnum;
import com.docus.server.util.ExceptionUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.scheduling.annotation.Async;
@ -33,36 +31,24 @@ public class TrackRetryService {
@Async("recordMessage")
@Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000L, multiplier = 1.5))
public void doRetry(TaskMessage message) throws Exception {
TaskMessageRetryLog taskMessageRetryLog = beforeProcess(message);
public void doRetry(TaskMessage message) {
TaskMessageRetryLogConvert retryLogConvert = TaskMessageRetryLogConvert.INSTANCE;
TaskMessageRetryLog taskMessageRetryLog = retryLogConvert.toConvertRetryLog(message, idService.getDateSeq());
try {
IJobHandler jobHandler = TrackRetrySpringExecutor.loadJobHandler(message.getRetryKey());
String name = ((MethodJobHandler) jobHandler).getMethod().getParameterTypes()[0].getName();
Object o = JSON.fromJSON(message.getJsonStr(), Class.forName(name));
jobHandler.execute(o);
} catch (Exception e) {
log.error(e.getMessage(), e);
afterThrowingProcess(ExceptionUtils.getExceptionMessage(e), taskMessageRetryLog);
retryLogConvert.afterThrowingProcess(ExceptionUtils.getExceptionMessage(e), taskMessageRetryLog);
}
taskMessageRetryLogDao.save(taskMessageRetryLog);
}
private void afterThrowingProcess(String errorMsg, TaskMessageRetryLog taskMessageRetryLog) {
taskMessageRetryLog.setErrorMsg(errorMsg);
taskMessageRetryLog.setState(StateEnum.FAIL);
}
private TaskMessageRetryLog beforeProcess(TaskMessage message) {
TaskMessageRetryLog taskMessageRetryLog = new TaskMessageRetryLog();
BeanUtils.copyProperties(message, taskMessageRetryLog);
taskMessageRetryLog.setMessageId(message.getId());
taskMessageRetryLog.setId(idService.getDateSeq());
taskMessageRetryLog.setCreateTime(DateUtil.now());
taskMessageRetryLog.setUpdateTime(DateUtil.now());
return taskMessageRetryLog;
}
}

@ -6,7 +6,13 @@ import com.docus.server.vo.TaskMessageVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
/**
@ -38,4 +44,19 @@ public interface TaskMessageApi {
@PostMapping("/search")
PageResult<TaskMessageVO> search(@RequestBody SearchRequest searchRequest);
/**
*
*
* @param searchRequest
*/
@ApiOperation("查询范围批量重试")
@PostMapping("/search/retry")
void searchRetry(@RequestBody SearchRequest searchRequest);
/**
*
*/
@ApiOperation("根据主键批量重试")
@PostMapping("/find/retry")
void findRetry(@RequestBody List<Long> ids);
}

@ -223,21 +223,21 @@
</dependency>
<!-- 实体映射转换 start -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.mapstruct</groupId>-->
<!-- <artifactId>mapstruct</artifactId>-->
<!-- <version>${org.mapstruct.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.mapstruct</groupId>-->
<!-- <artifactId>mapstruct-jdk8</artifactId>-->
<!-- <version>${org.mapstruct.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.mapstruct</groupId>-->
<!-- <artifactId>mapstruct-processor</artifactId>-->
<!-- <version>${org.mapstruct.version}</version>-->
<!-- </dependency>-->
<!-- 实体映射转换 end -->
</dependencies>
@ -254,27 +254,27 @@
</profiles>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
<!-- <build>-->
<!-- <plugins>-->
<!-- <plugin>-->
<!-- <groupId>org.apache.maven.plugins</groupId>-->
<!-- <artifactId>maven-compiler-plugin</artifactId>-->
<!-- <configuration>-->
<!-- <annotationProcessorPaths>-->
<!-- <path>-->
<!-- <groupId>org.projectlombok</groupId>-->
<!-- <artifactId>lombok</artifactId>-->
<!-- <version>${lombok.version}</version>-->
<!-- </path>-->
<!-- <path>-->
<!-- <groupId>org.mapstruct</groupId>-->
<!-- <artifactId>mapstruct-processor</artifactId>-->
<!-- <version>${org.mapstruct.version}</version>-->
<!-- </path>-->
<!-- </annotationProcessorPaths>-->
<!-- </configuration>-->
<!-- </plugin>-->
<!-- </plugins>-->
<!-- </build>-->
</project>

Loading…
Cancel
Save