转至元数据结尾
转至元数据起始

不关注逻辑,单看下面调用链路中的 jobParameter 参数。

@Slf4j
@DubboService
public class CloudCaringYqfCertConsumeNoticeJobImpl implements CloudCaringYqfCertConsumeNoticeJob {

    @Autowired
    private YqfCertConsumeNoticeBizService yqfCertConsumeNoticeBizService;

    @Override
    @Async
    public void execute(String jobParameter) {
        log.info("平安移企服消费通知补偿-请求参数:{}", jobParameter);
        try {
            yqfCertConsumeNoticeBizService.yqfCertConsumeNoticeHandler(jobParameter);
        } catch (Exception e) {
            log.error("平安移企服消费通知补偿执行异常:", e);
        }
    }
}

来看其中调用的 YqfCertConsumeNoticeBizService#yqfCertConsumeNoticeHandler

@Service
@Slf4j
public class YqfCertConsumeNoticeBizService {

	...

    public void yqfCertConsumeNoticeHandler(String jobParameter){
        List<YqfCertConsumeNotice> yqfCertConsumeNotices = yqfCertConsumeNoticeManager.listByDateAndProcessing(jobParameter);
        if(CollectionUtils.isEmpty(yqfCertConsumeNotices)){
            return;
        }
        for(YqfCertConsumeNotice yqfCertConsumeNotice : yqfCertConsumeNotices) {
            consumeNoticeHandler(yqfCertConsumeNotice.getId());
        }
    }

    public void consumeNoticeHandler(Long noticeId) {
		...
	}
}

来看其中调用的  yqfCertConsumeNoticeManager#listByDateAndProcessing

@Service
public class YqfCertConsumeNoticeManager extends ServiceImpl<YqfCertConsumeNoticeMapper, YqfCertConsumeNotice> implements IService<YqfCertConsumeNotice> {

    public List<YqfCertConsumeNotice> listByDateAndProcessing(String jobParameter) {
        int offset = StringUtils.isBlank(jobParameter) ? -3 : Integer.parseInt(jobParameter);

        Date date = DateUtil.now();
        Date startDate = DateUtil.offsetDay(date, offset);
        Date endDate = DateUtil.offsetMinute(date, -3);
        return list(new LambdaQueryWrapper<YqfCertConsumeNotice>()
                .eq(YqfCertConsumeNotice::getStatus, OperationStatusEnum.UN_OPERATION)
                .between(YqfCertConsumeNotice::getCreateTime, startDate, endDate));
    }
}


这个 jobParameter 参数,从定时任务入口程序 下传到 业务处理service类,再下传到 数据处理Manager类。

这有什么问题吗?


没问题,代码可运行,不会因为这个 参数一传到底,而存在bug。

老实讲,也不排除会存在潜在问题。 关于这种”程序入口参数一传到底“的编码风格,我来分享一个刺激的case,>>click here,来看看由这种编码风格引起的程序OOM  。



有问题。从编码层面来讲,是有问题!

程序内的service和Manager应该定义明确的参数。 以本案为例,它们关注 jobParameter 吗? 应该关注 jobParameter 吗?- - - - 不应该。




这段代码应该怎么重构?







编写评论...