使用jar:hutool,json,google的event 消息实体类:
package com.winsea.iboot.eventbus.model;
/**
* @description:
* @author: nice
* @created: 2023/06/07 10:13
*/
import lombok.*;
import java.util.List;
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class EnterpriseWxRobotMessageRequest {
private String msgtype;
private Markdown markdown;
private Text text;
private File file;
private News news;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public static class Markdown {
private String content;
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public static class Text {
private String content;
private List<String> mentioned_list;
private List<String> mentioned_mobile_list;
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public static class File {
private String media_id;
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class News{
private List<Articles> articlesList;
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class Articles{
private String title;
private String description;
private String url;
private String picurl;
}
public static class Image{
private String base64;
private String md5;
}
}
实体类
package com.ruoyi.common.core.eventbus.event;
import com.ruoyi.common.core.eventbus.core.Event;
import com.ruoyi.common.core.eventbus.vo.EnterpriseWxRobotMessageRequest;
import lombok.*;
import java.util.List;
/**
* @description: 企业微信机器人消息
* @author: nice
* @created: 2022/11/23 13:50
*/
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class EnterpriseWxSendEvent implements Event {
//消息类型
private String msgType;
//消息
private String message;
//图文消息
private List<EnterpriseWxRobotMessageRequest.Articles> articlesList;
//接收者类型
private String type;
//接收者
private List<String> idList;
//文件id,通过下文的文件上传接口获取
private String mediaId;
// 机器人id
private String robotKey;
}
推送方法
package com.ruoyi.common.core.eventbus.listener;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.google.common.eventbus.Subscribe;
import com.ruoyi.common.core.eventbus.annotation.EventBusListener;
import com.ruoyi.common.core.eventbus.event.EnterpriseWxSendEvent;
import com.ruoyi.common.core.eventbus.vo.EnterpriseWxRobotMessageRequest;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 推送消息类型:文本、markdown、图文、文件
*/
@Component
@EventBusListener
@Log4j2
public class EnterpriseWxSendListener {
private static final String url = "http://qyapi.weixin.qq.com/cgi-bin/webhook/send?key="; // 机器人id 笑脸
private static final String finalRobotKey = "10086"; // 机器人id 笑脸
public static final String TYPE_ALL = "ALL"; //接收者 所有人
public static final String TYPE_MOBILE = "MOBILE";//根据手机号选择接收人
public static final String TYPE_USER = "USER";//根据企业微信的用户Id选择接收人
public static final String MSG_TYPE_TEXT = "text";
public static final String MSG_TYPE_MARKDOWN = "markdown";
public static final String MSG_TYPE_NEWS = "news";
public static final String MSG_TYPE_FILE = "file";
@Subscribe
private void send(EnterpriseWxSendEvent enterpriseWxSendEvent) {
EnterpriseWxRobotMessageRequest feignCropRobotMessageBody = new EnterpriseWxRobotMessageRequest();
String msgType = enterpriseWxSendEvent.getMsgType();
String message = enterpriseWxSendEvent.getMessage();
if (StrUtil.isBlank(msgType)) {
return;
}
// 传入消息类型
feignCropRobotMessageBody.setMsgtype(msgType);
// 获取接收者类型
String type = enterpriseWxSendEvent.getType();
if (EnterpriseWxSendListener.MSG_TYPE_MARKDOWN.equals(msgType)) {
EnterpriseWxRobotMessageRequest.Markdown markdown = new EnterpriseWxRobotMessageRequest.Markdown();
markdown.setContent(message);
feignCropRobotMessageBody.setMarkdown(markdown);
if (StrUtil.isBlank(message)) {
return;
}
} else if (EnterpriseWxSendListener.MSG_TYPE_TEXT.equals(msgType)) {
if (StrUtil.isBlank(message)) {
return;
}
EnterpriseWxRobotMessageRequest.Text feignText = new EnterpriseWxRobotMessageRequest.Text();
feignText.setContent(message);
if (EnterpriseWxSendListener.TYPE_USER.equals(type)) {
feignText.setMentioned_list(enterpriseWxSendEvent.getIdList());
} else if (EnterpriseWxSendListener.TYPE_MOBILE.equals(type)) {
feignText.setMentioned_mobile_list(enterpriseWxSendEvent.getIdList());
} else if (EnterpriseWxSendListener.TYPE_ALL.equals(type)) {
feignText.setMentioned_list(Arrays.asList("@all"));
//feignText.setMentioned_mobile_list(Arrays.asList("@all"));
}
feignCropRobotMessageBody.setText(feignText);
} else if (EnterpriseWxSendListener.MSG_TYPE_NEWS.equals(msgType)) {
List<EnterpriseWxRobotMessageRequest.Articles> articlesList = enterpriseWxSendEvent.getArticlesList();
if (CollUtil.isNotEmpty(articlesList)) {
List<EnterpriseWxRobotMessageRequest.Articles> articlesNewList = articlesList.stream()
.filter(articles -> StrUtil.isNotBlank(articles.getTitle()) && StrUtil.isNotBlank(articles.getUrl()))
.limit(8)
.collect(Collectors.toList());
if (CollUtil.isNotEmpty(articlesNewList)) {
EnterpriseWxRobotMessageRequest.News feignNews = new EnterpriseWxRobotMessageRequest.News();
feignNews.setArticlesList(articlesNewList);
feignCropRobotMessageBody.setNews(feignNews);
} else {
return;
}
} else {
return;
}
} else if (EnterpriseWxSendListener.MSG_TYPE_FILE.equals(msgType)) {
String mediaId = enterpriseWxSendEvent.getMediaId();
if (StrUtil.isBlank(mediaId)) {
return;
} else {
EnterpriseWxRobotMessageRequest.File feignFile = new EnterpriseWxRobotMessageRequest.File();
feignFile.setMedia_id(mediaId);
feignCropRobotMessageBody.setFile(feignFile);
}
}
String robotKey = enterpriseWxSendEvent.getRobotKey();
if(StrUtil.isBlank(robotKey)){
robotKey = finalRobotKey;
}
sendRobotMessage(feignCropRobotMessageBody, robotKey);
}
/**
* 请求企业微信
* */
private void sendRobotMessage(EnterpriseWxRobotMessageRequest feignEnterpriseWxRobotMessage,String robotKey){
String requestUrl = url + robotKey;
String body = JSON.toJSONString(feignEnterpriseWxRobotMessage);
String response = HttpRequest.post(requestUrl)
.body(body)
.setFollowRedirects(true)
.timeout(30 * 1000)
.execute()
.body();
log.error("企业微信消息推送 = " + response);
}
}
注入:
package com.ruoyi.framework.config;
import com.google.common.eventbus.AsyncEventBus;
import com.google.common.eventbus.EventBus;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.*;
/**
* @description: 事件总线
* @author: nice
* @created: 2022/06/06 10:03
*/
@Configuration
public class EventBusConfig {
/**
* 单进程同步事件总线
* 同步方式 : 此事件总线承担业务通信及解耦 替换java的
*/
@Bean("syncEventBus")
public EventBus syncEventBus() {
EventBus eventBus = new EventBus();
return eventBus;
}
/**
* 单进程事件总线
* 异步方式
*/
@Bean("asyncEventBus")
public AsyncEventBus asyncEventBus() {
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("asyncEventBus").build();
ExecutorService executorService = new ThreadPoolExecutor(3, 10,
10000L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(64), namedThreadFactory, new ThreadPoolExecutor.CallerRunsPolicy());
return new AsyncEventBus(executorService);
}
}