JeeSite 4.x 消息管理、消息推送、消息提醒

原创
2019/03/20 21:50
阅读数 1.3W

实现统一的消息推送接口,包含PC消息、短信消息、邮件消息、微信消息等,无需让所有开发者了解消息是怎么发送出去的,只需了解消息发送接口即可。

所有推送消息均通过 MsgPushUtils 工具类发送。

消息表

1、消息待推送表(js_sys_msg_push): 实时监测待推送的消息数据表,检测到消息后调用推送接口。

2、消息已推送表(js_sys_msg_pushed):推送完成后,存入到这个历史表里,作为日后查询消息推送历史用。

消息配置

# 消息提醒中心(专业版)
msg:
  enabled: true
  
  # 是否开启实时发送消息(保存消息后立即检查未读消息并发送),分布式部署下请单独配置消息发送服务,不建议开启此选项。
  realtime:
    # 是否开启
    enabled: true
  
  # 推送失败次数,如果推送次数超过了设定次数,仍不成功,则放弃并保存到历史
  pushFailNumber: 3

  # 邮件发送参数
  email:
    beanName: emailSendService
    fromAddress: jeesite_demo@163.com
    fromPassword: jeesite_xxxx
    fromHostName: smtp.163.com
    sslOnConnect: false
    sslSmtpPort: 994

  # 短信网关
  sms:
    beanName: smsSendService
    url: http://localhost:80/msg/sms/send
    data: username=jeesite&password=jeesite.com
    prefix: 【JeeSite】
    suffix: ~

注意 “定时消息” 和 “延迟推送” 必须从 “系统监控->作业监控” 菜单里开启消息推送服务才可使用。如果此服务开启,可关闭 “实时发送消息” 开关。

消息推送实现

目前JeeSite中只实现了PC和Email的推送服务,其余的推送服务(如:短信、微信、APP等)你需要自己去实现。

短信推送其实调用的是 com.jeesite.common.msg.SmsUtils.send(String content, String mobile) 静态方法(该类在jeesite-common项目中),你可以实现此方法。

下面还是以短信推送为例,自定一个推送类:

package com.jeesite.modules.msg.send.impl;

import java.util.Date;
import java.util.Map;

import org.springframework.stereotype.Service;

import com.jeesite.common.lang.ExceptionUtils;
import com.jeesite.common.lang.ObjectUtils;
import com.jeesite.common.mapper.JsonMapper;
import com.jeesite.common.msg.SmsUtils;
import com.jeesite.common.service.BaseService;
import com.jeesite.modules.msg.entity.MsgPush;
import com.jeesite.modules.msg.entity.content.SmsMsgContent;
import com.jeesite.modules.msg.send.MsgSendService;

/**
 * SMS发送服务
 * @author ThinkGem
 * @version 2018年5月13日
 */
@Service
public class CustomSmsSendService extends BaseService implements MsgSendService{

	@Override
	public void sendMessage(MsgPush msgPush) {
		try{
		    
			// 发送短信
			SmsMsgContent content = msgPush.parseMsgContent(SmsMsgContent.class);
			String result = SmsUtils.send(content.getContent(), msgPush.getReceiveCode());
			Map<String, Object> map = JsonMapper.fromJson(result, Map.class);
			
			// 发送成功
			if (ObjectUtils.toInteger(map.get("result")) == 0){
				msgPush.setPushStatus(MsgPush.PUSH_STATUS_SUCCESS);
				msgPush.addPushReturnContent(result);
			}
			// 发送失败
			else{
				throw new RuntimeException(result);
			}
			
		} catch (Exception ex) {
			logger.error("发送短信失败! ", ex);
			msgPush.setPushDate(new Date());
			msgPush.setPushStatus(MsgPush.PUSH_STATUS_FAIL);
			msgPush.addPushReturnContent(ExceptionUtils.getStackTraceAsString(ex));
		}
	}

}

该类已通过 @Service 注册到了 Spring Bean 中,注册的 Bean 名称是 customSmsSendService

下面我们可去修改 jeeiste.yml 的配置如下,指定该 Bean 名称:

# 消息提醒中心(专业版)
msg:
  # 短信网关
  sms:
    beanName: customSmsSendService

这样消息推送服务实现就可以工作了。

使用方法:

上面配置好了,那如何使用呢,我们可以打开 com.jeesite.test.MsgPushTest 单元测试类(该类在jeesite-module-core项目中),里面基本涵盖了所有的推送消息例子。

MsgPushUtils API:

/**
 * 推送消息(即时推送)
 * @param type 		消息类型(MsgPush.TYPE_PC、TYPE_APP、TYPE_SMS、TYPE_EMAIL)
 * @param title		消息标题
 * @param content	消息内容
 * @param bizKey	关联业务主键
 * @param bizType	关联业务类型
 * @param receiveUserCodes	接受者用户编码
 * @author ThinkGem
 */
public static MsgPush push(String type, String title, String content, String bizKey, String bizType, String receiveUserCodes){
	BaseMsgContent msgContent = null;
	if (MsgPush.TYPE_PC.equals(type)){
		msgContent = new PcMsgContent();
	}else if (MsgPush.TYPE_APP.equals(type)){
		msgContent = new AppMsgContent();
	}else if (MsgPush.TYPE_SMS.equals(type)){
		msgContent = new SmsMsgContent();
	}else if (MsgPush.TYPE_EMAIL.equals(type)){
		msgContent = new EmailMsgContent();
	}
	if (msgContent != null){
		msgContent.setTitle(title);
		msgContent.setContent(content);
		return push(msgContent, bizKey, bizType, receiveUserCodes, new Date(), Global.NO);
	}
	return null;
}

/**
 * 推送消息(即时推送)
 * @param msgContent 消息内容实体:PcMsgContent、AppMsgContent、SmsMsgContent、EmailMsgContent、WeicxinMsgContent
 * @param bizKey	关联业务主键
 * @param bizType	关联业务类型
 * @param receiveUserCodes	接受者用户编码
 * @author ThinkGem
 */
public static MsgPush push(BaseMsgContent msgContent, String bizKey, String bizType, String receiveUserCodes){
	return push(msgContent, bizKey, bizType, receiveUserCodes, new Date(), Global.NO);
}

/**
 * 推送消息
 * @param msgContent 消息内容实体:PcMsgContent、AppMsgContent、SmsMsgContent、EmailMsgContent、WeicxinMsgContent
 * @param bizKey	关联业务主键
 * @param bizType	关联业务类型
 * @param receiveUserCodes	接受者用户编码,多个用逗号隔开,用[CODE]作为前缀,可直接指定接受者手机号或邮箱地址等
 * @param planPushDate  计划推送时间(指定推送时间,延迟推送)
 * @param isMergePush	是否是合并推送(将消息合并为一条,延迟推送,用于不重要的提醒),默认:Global.NO
 * @author ThinkGem
 */
public static MsgPush push(BaseMsgContent msgContent, String bizKey, String bizType, String receiveUserCodes, Date planPushDate, String isMergePush) {
	boolean isNone = StringUtils.startsWith(receiveUserCodes, "[CODE]");
	if (isNone){
		receiveUserCodes = StringUtils.substringAfter(receiveUserCodes, "[CODE]");
	}
	MsgPush msgPush = null;
	for (String receiveUserCode : StringUtils.split(receiveUserCodes, ",")){
		msgPush = new MsgPush();
		msgPush.setMsgContentEntity(msgContent);
		msgPush.setBizKey(bizKey);
		msgPush.setBizType(bizType);
		if (isNone){
			msgPush.setReceiveCode(receiveUserCode);
		}else{
			msgPush.setReceiveUserCode(receiveUserCode);
		}
		msgPush.setPlanPushDate(planPushDate);
		msgPush.setIsMergePush(isMergePush);
		push(msgPush);
	}
	return msgPush;
}

/**
 * 推送消息
 * @param msgPush 推送对象
 * @example 
 * 		MsgPush msgPush = new MsgPush();
 * 		SmsMsgContent msgContent = new SmsMsgContent();
 * 		msgContent.setTitle(title);
 * 		msgContent.setContent(content);
 * 		msgPush.setMsgContentEntity(msgContent);
 * 		msgPush.setBizKey(bizKey);
 * 		msgPush.setBizType(bizType);
 * 		msgPush.setReceiveUserCode(receiveUserCode);
 * 		msgPush.setPlanPushDate(planPushDate);
 * 		msgPush.setIsMergePush(isMergePush);
 * @author ThinkGem
 */
public static void push(MsgPush msgPush) {
	Static.msgPushService.save(msgPush);
}

/**
 * 读取消息(业务处理完成后调用,自动处理对应业务的消息)
 * @param bizKey 业务主键
 * @param bizType 业务类型
 * @param receiveUserCode 接受者用户编码(必填)
 * @author ThinkGem
 */
public static void readMsgByBiz(String bizKey, String bizType, String receiveUserCode) {
	MsgPush mp = new MsgPush();
	mp.setBizKey(bizKey);
	mp.setBizType(bizType);
	if(StringUtils.isBlank(receiveUserCode)){
		return;
	}
	mp.setReceiveUserCode(receiveUserCode);
	List<MsgPush> list = Static.msgPushService.findList(mp);
	for (MsgPush msgPush : list){
		msgPush.setReadDate(new Date());
		msgPush.setReadStatus(MsgPush.READ_STATUS_READ);
		Static.msgPushService.updateMsgPush(msgPush);
	}
}
展开阅读全文
打赏
2
6 收藏
分享
加载中
请问jeesite的短信推送怎么做。求指教
2019/09/05 09:34
回复
举报
更多评论
打赏
1 评论
6 收藏
2
分享
返回顶部
顶部