您的位置:首页 > 健康 > 美食 > 若依线程池多线程并发 ruoyi-vue SpringBoot 实战批量发送微信小程序订阅消息

若依线程池多线程并发 ruoyi-vue SpringBoot 实战批量发送微信小程序订阅消息

2025/1/11 18:26:55 来源:https://blog.csdn.net/qq_43751489/article/details/141173529  浏览:    关键词:若依线程池多线程并发 ruoyi-vue SpringBoot 实战批量发送微信小程序订阅消息

业务代码

    private final ThreadPoolTaskExecutor executorService = SpringUtils.getBean("threadPoolTaskExecutor");@Overridepublic void batchSendWxMsgByDiy(sendDiyWxMsgVo entity) {if (CollectionUtils.isEmpty(entity.getAcceptIds())) {throw new TipUserException("接收人不能为空");}if (StringUtils.isBlank(entity.getDataType())) {throw new TipUserException("类型不能为空");}List<TrainSignupMan> signupManList = signupManMapper.selectByIds(entity.getAcceptIds());if (CollectionUtils.isEmpty(signupManList)) {throw new TipUserException("人员删除或不可见");}Map<String, SysDictData> templateConfig = dictTypeService.selectDictDataByType("train_wx_learn_notice").stream().collect(Collectors.toMap(SysDictData::getDictLabel, o -> o));if (MapUtils.isEmpty(templateConfig)) {throw new TipUserException("请联系管理员配置微信消息模板-培训学习通知");}List<Long> lyUserIdIds = signupManList.stream().map(TrainSignupMan::getLyUserId).collect(Collectors.toList());if (CollectionUtils.isEmpty(lyUserIdIds)) {return;}Map<Long, TzLyUser> tzLyUserMap = tzLyUserService.selectOpenIdListByUserIds(lyUserIdIds).stream().collect(Collectors.toMap(TzLyUser::getId, o -> o));if (MapUtils.isEmpty(tzLyUserMap)) {return;}String className = entity.getClassName();String dataTip = null;Date dataTime = null;if (StringUtils.equals(entity.getDataType(), "diy")) {dataTip = entity.getDataTip();dataTime = entity.getDataTime();if (StringUtils.isBlank(dataTip)) {throw new TipUserException("温馨提示不能为空");}if (ObjectUtils.isEmpty(dataTime)) {throw new TipUserException("时间不能为空");}} else if (StringUtils.equals(entity.getDataType(), "dict")) {dataTime = DateUtils.getNowDate();SysDictData defaultSysDictData = templateConfig.get("default");SysDictData trainSysDictData = templateConfig.get(entity.getTrainingCourseId());if (ObjectUtils.isEmpty(defaultSysDictData)) {throw new TipUserException("请配置该培训班-培训学习通知默认模板");}dataTip = defaultSysDictData.getDictValue();if (ObjectUtils.isNotEmpty(trainSysDictData)) {dataTip = trainSysDictData.getDictValue();}} else {throw new TipUserException("请携带类型参数");}// 创建 final 变量副本用于 lambda 表达式final String finalDataTip = dataTip;final Date finalDataTime = dataTime;ConcurrentLinkedQueue<SmsPreventBody> smsPreventBodyQueue = new ConcurrentLinkedQueue<>();CountDownLatch latch = new CountDownLatch(signupManList.size());for (TrainSignupMan signupMan : signupManList) {TzLyUser tzLyUser = tzLyUserMap.get(signupMan.getLyUserId());if (ObjectUtils.isEmpty(tzLyUser)) {latch.countDown();} else {try {executorService.execute(()->{SmsPreventBody smsPreventBody = sendNoticeWxMsg(signupMan, templateConfig, tzLyUser.getOpenId(), className, finalDataTip, finalDataTime);smsPreventBodyQueue.add(smsPreventBody);latch.countDown();});} catch (Exception e) {latch.countDown();}}}try {latch.await();} catch (InterruptedException e) {log.error(e.getMessage());}executorService.shutdown();List<SmsPreventBody> smsPreventBodyList = new ArrayList<>(smsPreventBodyQueue);smsPreventService.saveBatch(smsPreventBodyList);}

微信发送消息工具类

   private SmsPreventBody sendNoticeWxMsg(TrainSignupMan signupMan, Map<String, SysDictData> templateConfig, String openId, String className, String dataTip, Date dataTime) {String env_version = ConfigUtils.getString("wx.mp.is.env.version", "release");SendMessageTemplateVo messageTemplateVo = new SendMessageTemplateVo();messageTemplateVo.setMiniprogram_state(env_version);messageTemplateVo.setTemplate_id(templateConfig.get("template_id").getDictValue());messageTemplateVo.setPage(templateConfig.get("page").getDictValue());messageTemplateVo.setTouser(openId);// 培训班messageTemplateVo.putParam("thing1", className);// 时间String dateFormat = DateUtil.format(dataTime, "yyyy年MM月dd日");messageTemplateVo.putParam("time2", dateFormat);// 温馨提示messageTemplateVo.putParam("thing3", dataTip);// 消息发送成功SmsPreventBody smsPreventBody = new SmsPreventBody();smsPreventBody.setMobile(signupMan.getTel());smsPreventBody.setType("train-notice");smsPreventBody.setTipStr("微信订阅消息-培训学习通知");com.alibaba.fastjson.JSONObject jsonObject = WeChatUtils.sendWxMessage(messageTemplateVo);String errcode = jsonObject.getString("errcode");String errmsg = jsonObject.getString("errmsg");if (StringUtils.equals(errcode, "0")) {smsPreventBody.setState("success");smsPreventBody.setContent(errmsg);} else {smsPreventBody.setState("error");smsPreventBody.setContent(errcode + ":" + errmsg);}return smsPreventBody;}

消息实体

package com.huida.tzly.domain.vo;import com.alibaba.fastjson.JSONObject;
import lombok.Data;import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;/*** 微信发送订阅消息**/
@Data
public class SendMessageTemplateVo implements Serializable {//接收者(用户)的 openidprivate String touser;//所需下发的订阅模板idprivate String template_id;//点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转private String page;//模板内容,格式形如 { "key1": { "value": any }, "key2": { "value": any } }的objectprivate JSONObject data = new JSONObject();// 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版private String miniprogram_state;//进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN
//    private String lang;public void putParam(String key, String value) {Map<String, Object> temp = new HashMap<>();temp.put("value", value);this.data.put(key, temp);}}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com