diff --git a/pom.xml b/pom.xml index 72a353b2..a6c58dae 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,15 @@ spring-cloud-starter-netflix-eureka-client 2.0.0.RELEASE + + + org.springframework + spring-context-support + + + org.springframework.boot + spring-boot-starter-amqp + org.springframework.cloud diff --git a/src/main/java/com/ydw/bat/wkflow/business_mq/service/CreateMQService.java b/src/main/java/com/ydw/bat/wkflow/business_mq/service/CreateMQService.java new file mode 100644 index 00000000..ad6b7359 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_mq/service/CreateMQService.java @@ -0,0 +1,38 @@ +package com.ydw.bat.wkflow.business_mq.service; + +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import org.apache.commons.lang3.StringUtils; +import org.springframework.amqp.core.AmqpTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +@Component +public class CreateMQService { + @Autowired + private AmqpTemplate rabbitTemplate; + + /** + * @author: super_liu + * @date: 2021年09月17日 14:40 + **/ + public void setTodoDoneMq(BusProcessNew object) throws Exception{ + + //发送消息队列 + this.rabbitTemplate.convertAndSend("sendDone-exchange_MQ_GSAR", "sendDone-key_MQ_GSAR", object); + } + + /** + * @author: super_liu + * @date: 2021年09月17日 14:40 + **/ + public void sendTodoMq(BusProcessNew object){ + + //发送消息队列 + this.rabbitTemplate.convertAndSend("send-exchange_MQ_GSAR", "send-key_MQ_GSAR", object); + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_mq/service/SendMQService.java b/src/main/java/com/ydw/bat/wkflow/business_mq/service/SendMQService.java new file mode 100644 index 00000000..8530a921 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_mq/service/SendMQService.java @@ -0,0 +1,105 @@ +package com.ydw.bat.wkflow.business_mq.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.rabbitmq.client.Channel; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_oa.sendTodoLog.entity.SendTodoLog; +import com.ydw.bat.wkflow.business_oa.sendTodoLog.service.ISendTodoLogService; +import com.ydw.bat.wkflow.business_oa.sendTodoLog.service.impl.SendTodoLogServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.amqp.support.AmqpHeaders; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.Message; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class SendMQService { + + private static final Logger logger = LoggerFactory.getLogger(SendMQService.class); + + @Autowired + private CreateMQService convertMq; + + @Autowired + private ISendTodoLogService iSendTodoLogService; + + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(value = "createMQ_SQ_GSAR", durable = "true"), + exchange = @Exchange(value = "send-exchange_MQ_GSAR", ignoreDeclarationExceptions = "true"), + key = "send-key_MQ_GSAR")) + public void createMQ(BusProcessNew object, Message message, Channel channel) throws Exception{ + try{ + try{ + Thread.sleep(5000); + insertOrUpdateInfo(object); + }catch(InterruptedException e){ + logger.error(e.toString()); + Thread.currentThread().interrupt(); + } + } catch (Exception e) { + logger.error("消息队列进入添加数据方法前失败!"); + logger.error(e.getMessage(),e); + }finally { + Long tag = (Long) message.getHeaders().get(AmqpHeaders.DELIVERY_TAG); + channel.basicAck(tag,false); + logger.debug("消息确认成功!!!!!!!!!"); + } + + } + + public void insertOrUpdateInfo(BusProcessNew object) throws Exception { + try { + + }catch (Exception e){ + logger.error(e.getMessage(),e); + this.restartSendMq(object); + } + } + + public void restartSendMq(BusProcessNew object) throws Exception{ + SendTodoLog sendTodoLog = new SendTodoLog(); + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("TODO_ID",object.getId()); + List list = iSendTodoLogService.list(wrapper); + if(!list.isEmpty()){ + sendTodoLog = list.get(0); + } + if(sendTodoLog != null){ + int againNumNew = Integer.valueOf(sendTodoLog.getErrNum()); + if(againNumNew >= 9){ + // 发送待办 或 发送给管理员邮箱 + logger.info("发送失败9次,发送给管理员邮箱"); + + }else { + // 发送失败连续持续3次, 如果在失败等待1个小时后重试3次 + if(againNumNew == 3 || againNumNew == 6){ + Thread.sleep(3600000); + logger.info("发送失败连续持续3次,等待1个小时后重试3次!!!!!!!!!"); + + }else { + logger.info("发送失败连续持续"+againNumNew+"次!!"); + } + sendTodoLog.setErrNum(sendTodoLog.getErrNum()+1); + iSendTodoLogService.save(sendTodoLog); + convertMq.sendTodoMq(object); + logger.info("已重新加入转换"); + } + }else { + sendTodoLog.setMsgType("0"); + sendTodoLog.setTodoId(object.getId()); + sendTodoLog.setUserId(object.getUserId()); +// sendTodoLog.set + } + + + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_oa/sendTodoLog/controller/SendTodoLogController.java b/src/main/java/com/ydw/bat/wkflow/business_oa/sendTodoLog/controller/SendTodoLogController.java new file mode 100644 index 00000000..234745f6 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_oa/sendTodoLog/controller/SendTodoLogController.java @@ -0,0 +1,21 @@ +package com.ydw.bat.wkflow.business_oa.sendTodoLog.controller; + + +import org.springframework.web.bind.annotation.RequestMapping; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * OA日志表 前端控制器 + *

+ * + * @author super_liu + * @since 2021-09-17 + */ +@RestController +@RequestMapping("/sendTodoLog") +public class SendTodoLogController { + +} + diff --git a/src/main/java/com/ydw/bat/wkflow/business_oa/sendTodoLog/entity/SendTodoLog.java b/src/main/java/com/ydw/bat/wkflow/business_oa/sendTodoLog/entity/SendTodoLog.java new file mode 100644 index 00000000..89a62f57 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_oa/sendTodoLog/entity/SendTodoLog.java @@ -0,0 +1,83 @@ +package com.ydw.bat.wkflow.business_oa.sendTodoLog.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * OA日志表 + *

+ * + * @author super_liu + * @since 2021-09-17 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SendTodoLog对象", description="OA日志表") +public class SendTodoLog implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "主键") + @TableId("ID") + private String id; + + @ApiModelProperty(value = "类型 0 待办, 1已办, 2 取消, 3 删除") + @TableField("MSG_TYPE") + private String msgType; + + @ApiModelProperty(value = "待办ID") + @TableField("TODO_ID") + private String todoId; + + @ApiModelProperty(value = "待办用户ID") + @TableField("USER_ID") + private String userId; + + @ApiModelProperty(value = "邮箱用户ID") + @TableField("EMAIL_USER_ID") + private String emailUserId; + + @ApiModelProperty(value = "待办对象JSON") + @TableField("MESG") + private String mesg; + + @ApiModelProperty(value = "状态 1 待发送 2 成功 3 失败 4 无需发送") + @TableField("MSG_STATUS") + private String msgStatus; + + @ApiModelProperty(value = "失败次数") + @TableField("ERR_NUM") + private int errNum; + + @ApiModelProperty(value = "创建时间") + @TableField("CREATE_TIME") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private String createTime; + + @ApiModelProperty(value = "更新时间") + @TableField("UPDATE_TIME") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private String updateTime; + + @ApiModelProperty(value = "参数1") + @TableField("PARAM1") + private String param1; + + @ApiModelProperty(value = "参数2") + @TableField("PARAM2") + private String param2; + + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_oa/sendTodoLog/mapper/SendTodoLogMapper.java b/src/main/java/com/ydw/bat/wkflow/business_oa/sendTodoLog/mapper/SendTodoLogMapper.java new file mode 100644 index 00000000..6629bea1 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_oa/sendTodoLog/mapper/SendTodoLogMapper.java @@ -0,0 +1,16 @@ +package com.ydw.bat.wkflow.business_oa.sendTodoLog.mapper; + +import com.ydw.bat.wkflow.business_oa.sendTodoLog.entity.SendTodoLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * OA日志表 Mapper 接口 + *

+ * + * @author super_liu + * @since 2021-09-17 + */ +public interface SendTodoLogMapper extends BaseMapper { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_oa/sendTodoLog/service/ISendTodoLogService.java b/src/main/java/com/ydw/bat/wkflow/business_oa/sendTodoLog/service/ISendTodoLogService.java new file mode 100644 index 00000000..f61dbb39 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_oa/sendTodoLog/service/ISendTodoLogService.java @@ -0,0 +1,16 @@ +package com.ydw.bat.wkflow.business_oa.sendTodoLog.service; + +import com.ydw.bat.wkflow.business_oa.sendTodoLog.entity.SendTodoLog; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * OA日志表 服务类 + *

+ * + * @author super_liu + * @since 2021-09-17 + */ +public interface ISendTodoLogService extends IService { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_oa/sendTodoLog/service/impl/SendTodoLogServiceImpl.java b/src/main/java/com/ydw/bat/wkflow/business_oa/sendTodoLog/service/impl/SendTodoLogServiceImpl.java new file mode 100644 index 00000000..94a939aa --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_oa/sendTodoLog/service/impl/SendTodoLogServiceImpl.java @@ -0,0 +1,20 @@ +package com.ydw.bat.wkflow.business_oa.sendTodoLog.service.impl; + +import com.ydw.bat.wkflow.business_oa.sendTodoLog.entity.SendTodoLog; +import com.ydw.bat.wkflow.business_oa.sendTodoLog.mapper.SendTodoLogMapper; +import com.ydw.bat.wkflow.business_oa.sendTodoLog.service.ISendTodoLogService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * OA日志表 服务实现类 + *

+ * + * @author super_liu + * @since 2021-09-17 + */ +@Service +public class SendTodoLogServiceImpl extends ServiceImpl implements ISendTodoLogService { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/standardLibrary/CountersignBefore.java b/src/main/java/com/ydw/bat/wkflow/listener/standardLibrary/CountersignBefore.java index e0c06f65..d50835c5 100644 --- a/src/main/java/com/ydw/bat/wkflow/listener/standardLibrary/CountersignBefore.java +++ b/src/main/java/com/ydw/bat/wkflow/listener/standardLibrary/CountersignBefore.java @@ -3,6 +3,7 @@ package com.ydw.bat.wkflow.listener.standardLibrary; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_mq.service.CreateMQService; import com.ydw.bat.wkflow.business_oa.webService.service.WebServiceOAService; import com.ydw.bat.wkflow.util.SpringContextUtil; import org.activiti.engine.delegate.DelegateTask; @@ -17,7 +18,7 @@ public class CountersignBefore implements TaskListener{ @Override public void notify(DelegateTask delegateTask) { IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); - WebServiceOAService oaService = SpringContextUtil.getBean(WebServiceOAService.class); + CreateMQService oaService = SpringContextUtil.getBean(CreateMQService.class); QueryWrapper queryWrapper1 = new QueryWrapper(); queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); queryWrapper1.eq("USER_ID",delegateTask.getAssignee()); @@ -30,7 +31,7 @@ public class CountersignBefore implements TaskListener{ // 发送 oa 待办 设置 跳转页面 router ? 后面流程类型 one1.setLink("bzrkStep3?prcType=1"); - oaService.sendTodo(one1); + oaService.sendTodoMq(one1); } } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index c536fd6a..ff43a3ab 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -40,6 +40,23 @@ spring: check-process-definitions: false profiles: active: dev + # 相关服务配置同业务系统 + rabbitmq: + host: 127.0.0.1 + port: 5672 + username: guest + password: guest + listener: + simple: + acknowledge-mode: manual + #消费失败消息干掉 + default-requeue-rejected: true + retry: + #5秒 + initial-interval: 5000 + enabled: true + #最大重试9次 + max-attempts: 9 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl @@ -50,3 +67,4 @@ ribbon: # 配置前端服务全路径地址 如下 /#/ webUrl: http://127.0.0.1:10088/#/ + diff --git a/src/main/resources/mapper/sendTodoLog/SendTodoLogMapper.xml b/src/main/resources/mapper/sendTodoLog/SendTodoLogMapper.xml new file mode 100644 index 00000000..1a6763b3 --- /dev/null +++ b/src/main/resources/mapper/sendTodoLog/SendTodoLogMapper.xml @@ -0,0 +1,5 @@ + + + + +