(2条消息) Java实现商业报告保存业务实现异步处理_学习微站的博客-CSDN博客

88 阅读2分钟

商业报告保存业务实现异步处理
一、概要设计与需要分析
在这里插入图片描述
二、详细设计
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
三、具体代码实现
在这里插入图片描述
1、yml配置文件

rocketmq:
  accessKey: ====
  secretKey: ====
  nameSrvAddr: localhost:8100
  consumerGroups:
    - groupId: GID-SAAS-REPORT
      consumers:
        - topic: TOPIC-SAAS-REPORT
          tag: OPERATORLOG-REPORT
          beanName: generateReportOperatorLogListener
    - groupId: GID-SAAS-NEW-REPORT
      consumers:
        - topic: TOPIC-SAAS-REPORT
          tag: TAG_RUN_REPORT
          beanName: reportListener

2、pom

 <dependency>
            <groupId>com.shuwei.lego</groupId>
            <artifactId>lego-common-rocketmq</artifactId>
        </dependency>

3、IMqSend

public interface IMqSend {

    /**
     * 发送生成报告日志
     *
     * @param reportOperatorLog
     */
    void sendReportOperatorLog(ReportOperatorLog reportOperatorLog);

    /**
     * 引入mq中间件调用报告:发送消息
     */
    void newReportInstance(Long reportInstanceId);

}

4、MqSendImpl

@SuppressWarnings("PMD")
@Service
public class MqSendImpl implements IMqSend {

    private static final LegoLogger LOGGER = LegoLogger.getLogger(MqSendImpl.class);

    @Autowired
    private ProducerUtil producerUtil;

    @Autowired
    private MqTopicConfig mqTopicConfig;

    @Override
    public void sendReportOperatorLog(ReportOperatorLog reportOperatorLog) {
        String message = JSON.toJSONString(reportOperatorLog);
        LOGGER.info("sendReportOperatorLog to mq message = {}", message);
        producerUtil.sendAsyncMsg(mqTopicConfig.getSaasReportTopic(), mqTopicConfig.getSaasReportTopicOperatorLog(),
            message, String.valueOf(reportOperatorLog.getId()));
    }

    @Override
    public void newReportInstance(Long reportInstanceId) {
        LOGGER.info("reportInstanceId:{}", reportInstanceId);
        String body = String.valueOf(reportInstanceId);
        String key = String.valueOf(reportInstanceId);
        //短信通知,消息或报告推送采用同步
        SendResult sendResult = producerUtil
                .sendMsg(mqTopicConfig.getSaasReportTopic(), mqTopicConfig.getSaasTopicTagRunReport(), body, key);
        LOGGER.info("event=SEND_MSG:RUN_REPORT_INSTANCE; " + sendResult.toString());
    }

}

5、ReportListener

@Slf4j
@Component
@Api(value = "报告监听器", tags = "报告监听器")
public class ReportListener extends MessageListener {

    private static final LegoLogger LOGGER = LegoLogger.getLogger(ReportListener.class);

    @Resource
    private ReportInstanceDaoMapper reportInstanceDaoMapper;

    @Autowired
    private IReportProcessor reportProcessor;

    @Override
    public Action consume(Message message, ConsumeContext consumeContext) {
        try {
            //测试 TODO
            Thread.sleep(10000);
            System.out.println("heeloo2");
            //获取消息 body即为reportId
            String body = new String(message.getBody(), StandardCharsets.UTF_8);
            Long reportId = Long.valueOf(body);
            LOGGER.info("ReportListener body:{}, reportId:{}", body, reportId);
            try {
                reportProcessor.newReportInstance(reportId);
                return Action.CommitMessage;
            } catch (Exception e) {
                LOGGER.error("ReportListener fail: body = {} e = {}", body, e);
                //该报告更新为失败
                reportInstanceDaoMapper.updateReportStatus(reportId, ReportConstant.REPORT_STATUS_GENERAING_FAIL);
                return Action.ReconsumeLater;
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return Action.CommitMessage;

//        //获取消息 body即为reportId
//        String body = new String(message.getBody(), StandardCharsets.UTF_8);
//        Long reportId = Long.valueOf(body);
//        LOGGER.info("ReportListener body:{}, reportId:{}", body, reportId);
//        try {
//            reportProcessor.newReportInstance(reportId);
//            return Action.CommitMessage;
//        } catch (Exception e) {
//            LOGGER.error("ReportListener fail: body = {} e = {}", body, e);
//            //该报告更新为失败
//            reportInstanceDaoMapper.updateReportStatus(reportId, ReportConstant.REPORT_STATUS_GENERAING_FAIL);
//            return Action.ReconsumeLater;
//        }
    }
}

6、IReportProcessor

public interface IReportProcessor {
    /**
     * 创建报告
     * @param reportId
     */
    void newReportInstance(Long reportId);
}

7、AbstractOrderProcessor

public abstract class AbstractOrderProcessor implements IReportProcessor {
    @Override
    public void newReportInstance(Long reportId) {

    }
}

8、ReportProcessor

@Service
public class ReportProcessor extends AbstractOrderProcessor {
    private static final LegoLogger LOGGER = LegoLogger.getLogger(ReportProcessor.class);

    @Resource
    private ReportInstanceDaoMapper reportInstanceDaoMapper;

    @Resource
    private ISysAnnounceRemoteService sysAnnounceRemoteService;

    @Resource
    private ReportInstanceContentDaoMapper reportInstanceContentDaoMapper;

    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void newReportInstance(Long reportId) {
        LOGGER.info("reportId:{}", reportId);
        ReportInstance reportInstance = reportInstanceDaoMapper.getById(reportId);
        //1、report_instance状态改为生成中
        reportInstanceDaoMapper.updateReportStatus(reportId, ReportConstant.REPORT_STATUS_GENERAINGING);
        //2、其他人service接口(选址评估)
        //未来其他报告从这里加进来实现异步
        switch (reportInstance.getType()) {
            //位置评估
            case 10:
                doLocationEvaluationReportInstance(reportInstance);
                break;
            default:
                //测试用 TODO
                doLocationEvaluationReportInstance(reportInstance);
                LOGGER.warn("do not have this work reportInstance = {}", reportInstance);
                break;
        }
        //3、report_instance状态改为已生成
        reportInstanceDaoMapper.updateReportStatus(reportId, ReportConstant.REPORT_STATUS_GENERAING_OK);
        //4、消息推送
        SysAnnounce sysAnnounce = new SysAnnounce();
        sysAnnounce.setTitle(reportInstance.getName() + ReportConstant.MESSAGE_REPORT_TITLE);
        sysAnnounce.setContent(ReportConstant.MESSAGE_REPORT_CONTENT);
        sysAnnounce.setStatus(1);
        BeanUtils.copyProperties(sysAnnounce, reportInstance);
        sysAnnounce.setReleaseTime(DateUtils.getNow());
        sysAnnounce.setUserId(reportInstance.getGmtModifiedUid());
        sysAnnounce.setType(ReportConstant.SYS_ANNOUNCE_TYPE_ERPORT);
        KeyValue keyValue = new KeyValue();
        keyValue.setKey(ReportConstant.MATADATA_KEY);
        keyValue.setValue(String.valueOf(reportId));
        String jsonString = JSON.toJSONString(keyValue);
        sysAnnounce.setMetadata(jsonString);
        sysAnnounceRemoteService.save(sysAnnounce);
        //5、权益
        //TODO
    }

    /**
     * 获取位置评估
     * @param reportInstance
     */
    private void doLocationEvaluationReportInstance(ReportInstance reportInstance) {
        //给input---》output report_instance--->report_instance_content
        //TODO req暂定
        KeyValue locationEvaluationReq =
                JSONObject.parseObject(reportInstance.getInput(), KeyValue.class);
        //resp = reportCompeteDataService.***(locationEvaluationReq);
        //更新报告内容的output
        ReportInstanceContent content = new ReportInstanceContent();
//        content.setOutput(JSONObject.toJSONString(resp));
        content.setOutput("测试成功");
        content.setReportId(reportInstance.getId());
        content.setGmtModified(DateUtils.getNow());
        reportInstanceContentDaoMapper.update(content);

    }
}

本文使用 文章同步助手 同步