多线程多批次处理业务逻辑代码
private static final ExecutorService threadPool = Executors.newFixedThreadPool(10);
public void sendNewsJob() throws Exception {
// 查询需要推送的咨讯消息
List<NewsInfoDto> newsInfoDtos = newsInfoService.findWaitPushNews();
if (CollectionUtils.isEmpty(newsInfoDtos)) {
HelpUtils.log_info(getClass(), "【咨讯推送】查询需要推送的咨讯为空");
return;
}
List<List<NewsInfoDto>> lists = new ArrayList<List<NewsInfoDto>>();
int pageNo = (int) Math.ceil(newsInfoDtos.size() / FscConstant.PUSH_COUNT);
if (newsInfoDtos.size() < FscConstant.PUSH_COUNT) {
lists.add(newsInfoDtos);
} else {
for (int i = 0; i < pageNo; i++) {
if (i == pageNo - 1) {
lists.add(newsInfoDtos.subList(FscConstant.PUSH_COUNT * i, newsInfoDtos.size() - 1));
} else {
lists.add(newsInfoDtos.subList(i * FscConstant.PUSH_COUNT, (i + 1) * FscConstant.PUSH_COUNT - 1));
}
}
}
final CountDownLatch countDownNum = new CountDownLatch(lists.size());
for (int i = 0; i < lists.size(); i++) {
final List<NewsInfoDto> newInfos = lists.get(i);
//多线程处理资讯推送
threadPool.execute(new Runnable() {
@Override
public void run() {
try {
for (NewsInfoDto news : newInfos) {
// 查询推送设备
PushMessage pushMessage = new PushMessage();
pushMessage.setUserId(news.getUserId());
List<PushMessage> pushMessages = appPushService.selectByPrimaryKey(pushMessage);
if (!CollectionUtils.isEmpty(pushMessages)) {
List<String> pushList = new ArrayList<String>();
for (PushMessage message : pushMessages) {
pushList.add(message.getRegistrationId());
}
String content = news.getContent();
//处理推送的内容
if (!StringUtils.isEmpty(content)) {
//详情是一个富文本,去掉html标签和回车符制表符
content = content.replaceAll("</?[^>]+>", "");
content = content.replaceAll("\\s*|\t|\r|\n", "");
content = content.length() > 20 ? content.substring(0, 20) : content;
} else if (!StringUtils.isEmpty(news.getH5url())) {
content = news.getH5url();
}
// 发送咨询推送消息给家长
appPushService.sendAppPush(PushTypeEnum.NEWS.code, news.getId(), content, pushList);
// 更新推送状态
NewsInfo record = new NewsInfo();
record.setId(news.getId());
record.setIsPushed(1);
newsInfoService.updateByPrimaryKeySelective(record);
}
}
} catch (Exception e) {
HelpUtils.log_error(getClass(), "【咨讯推送】推送咨讯消息异常", e);
} finally {
countDownNum.countDown();
}
}
});
}
countDownNum.await();
}