商业报告保存业务实现异步处理
一、概要设计与需要分析

二、详细设计



三、具体代码实现

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);
}
}
本文使用 文章同步助手 同步