消息通知系统是业务系统中常见的功能模块,主要用于向用户或系统内部传递各类状态变更、操作提醒等信息。使用Java构建这类系统时,需要先明确核心需求,再设计合理的消息模型,最后实现对应的发送逻辑。

核心消息模型设计
消息模型是整个通知系统的基础,需要覆盖消息的核心属性,保证不同场景的通知都能被统一处理。我们可以抽象出如下基础消息类:
// 基础消息抽象类
public abstract class BaseMessage {
// 消息唯一标识
private String messageId;
// 消息接收者标识,比如用户ID、邮箱地址、手机号等
private String receiver;
// 消息标题
private String title;
// 消息内容
private String content;
// 消息类型,比如1-系统通知,2-订单通知,3-告警通知
private Integer messageType;
// 消息发送渠道,比如1-站内信,2-短信,3-邮件
private Integer channel;
// 消息创建时间
private Long createTime;
// 省略getter、setter方法
// 抽象方法:校验消息参数是否合法
public abstract boolean validate();
}
不同渠道的消息子类实现
针对不同通知渠道,我们可以继承基础消息类实现对应的子类,补充渠道特有的属性:
// 邮件消息子类
public class EmailMessage extends BaseMessage {
// 邮件抄送人列表
private List<String> ccList;
// 邮件附件路径列表
private List<String> attachmentPaths;
@Override
public boolean validate() {
// 校验邮件消息必须有接收者邮箱和标题内容
return getReceiver() != null && getTitle() != null && getContent() != null;
}
// 省略getter、setter方法
}
// 短信消息子类
public class SmsMessage extends BaseMessage {
// 短信签名
private String signName;
// 短信模板编码
private String templateCode;
@Override
public boolean validate() {
// 校验短信消息必须有手机号、签名和模板编码
return getReceiver() != null && signName != null && templateCode != null;
}
// 省略getter、setter方法
}
消息发送核心逻辑实现
我们可以定义一个消息发送器接口,不同渠道的发送逻辑实现该接口,再通过工厂模式获取对应的发送器实例,降低代码耦合度。
发送器接口定义
// 消息发送器接口
public interface MessageSender {
// 发送消息,返回是否发送成功
boolean send(BaseMessage message);
}
不同渠道发送器实现
以站内信和邮件发送为例,实现对应的发送逻辑:
// 站内信发送器实现
public class InboxMessageSender implements MessageSender {
@Override
public boolean send(BaseMessage message) {
if (!message.validate()) {
return false;
}
// 这里模拟将站内信存入数据库的逻辑
System.out.println("存储站内信成功,接收者:" + message.getReceiver() + ",内容:" + message.getContent());
return true;
}
}
// 邮件发送器实现,模拟调用邮件服务
public class EmailMessageSender implements MessageSender {
@Override
public boolean send(BaseMessage message) {
if (!message.validate()) {
return false;
}
EmailMessage emailMessage = (EmailMessage) message;
// 这里模拟调用邮件发送接口的逻辑
System.out.println("发送邮件成功,收件人:" + emailMessage.getReceiver() + ",标题:" + emailMessage.getTitle());
return true;
}
}
发送器工厂类
通过工厂类根据消息渠道获取对应的发送器实例:
// 消息发送器工厂类
public class MessageSenderFactory {
public static MessageSender getSender(Integer channel) {
if (channel == null) {
return null;
}
switch (channel) {
case 1:
return new InboxMessageSender();
case 3:
return new EmailMessageSender();
default:
return null;
}
}
}
消息状态管理
为了跟踪消息的发送状态,我们需要设计消息状态表,记录消息从创建到发送完成的全流程状态。常见的状态包括待发送、发送中、发送成功、发送失败等。
可以定义一个消息状态枚举类:
// 消息状态枚举
public enum MessageStatusEnum {
WAIT_SEND(0, "待发送"),
SENDING(1, "发送中"),
SEND_SUCCESS(2, "发送成功"),
SEND_FAIL(3, "发送失败");
private Integer code;
private String desc;
MessageStatusEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
// 省略getter方法
}
在消息发送逻辑中,需要先更新消息状态为发送中,发送完成后再更新为对应的成功或失败状态,保证状态的一致性。
完整调用示例
以下是一个发送邮件通知的完整调用示例:
public class MessageNotifyDemo {
public static void main(String[] args) {
// 构建邮件消息
EmailMessage emailMessage = new EmailMessage();
emailMessage.setMessageId("msg_001");
emailMessage.setReceiver("user@ipipp.com");
emailMessage.setTitle("订单支付成功通知");
emailMessage.setContent("您的订单已支付成功,预计3天内发货");
emailMessage.setMessageType(2);
emailMessage.setChannel(3);
emailMessage.setCreateTime(System.currentTimeMillis());
emailMessage.setSignName("电商平台");
// 获取邮件发送器
MessageSender sender = MessageSenderFactory.getSender(emailMessage.getChannel());
if (sender != null) {
boolean result = sender.send(emailMessage);
System.out.println("消息发送结果:" + result);
}
}
}
扩展建议
如果业务量较大,还可以引入消息队列做异步发送,避免发送逻辑阻塞主业务流程。同时可以添加消息重试机制,当发送失败时按照设定的策略进行重试,提升消息送达率。另外还可以做消息模板管理,将不同场景的消息内容抽象为模板,方便后续统一维护和修改。