docs: 完善通知器文档

This commit is contained in:
椰子 2021-07-03 22:13:26 +08:00
parent 2a9d07e35e
commit 98969de136
15 changed files with 143 additions and 64 deletions

View File

@ -6,10 +6,16 @@ import com.cicdi.notify.template.TemplateManager;
import java.util.Map; import java.util.Map;
/** /**
* 通知器抽象实现
* <p>实现了通用的发送方法还需要具体服务商继承此类实现全部的方法</p>
*
* @author xueye * @author xueye
*/ */
public abstract class AbstractNotifier<T extends Template> implements Notifier<T> { public abstract class AbstractNotifier<T extends Template> implements Notifier<T> {
/**
* 通知模板管理器用于获取当前通知类型使用的通知模板
*/
private final TemplateManager templateManager; private final TemplateManager templateManager;
public AbstractNotifier(TemplateManager templateManager) { public AbstractNotifier(TemplateManager templateManager) {
@ -20,8 +26,10 @@ public abstract class AbstractNotifier<T extends Template> implements Notifier<T
public void send(String templateId, Map<String, Object> context) { public void send(String templateId, Map<String, Object> context) {
Template template = templateManager.getTemplate(this.getType(), templateId); Template template = templateManager.getTemplate(this.getType(), templateId);
if (null == template) { if (null == template) {
throw new UnsupportedOperationException("模版不存在:" + templateId); throw new UnsupportedOperationException("指定的模版不存在:" + templateId);
} }
this.send((T) template, context); this.send((T) template, context);
} }
} }

View File

@ -6,14 +6,18 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
/** /**
* 通知器管理器抽象实现
* <p>实现了全部的接口抽象的目的是为了方便实现Spring的自动装配回接口实现服务商的自动注册</p>
*
* @author xueye * @author xueye
*/ */
public abstract class AbstractNotifierManager implements NotifierManager { public abstract class AbstractNotifierManager implements NotifierManager {
private final Map<String, Map<String, NotifierProvider>> providers = new ConcurrentHashMap<>(); private final Map<String, Map<String, NotifierProvider>> providers = new ConcurrentHashMap<>();
private Map<String, Notifier> notifiers = new ConcurrentHashMap<>(); private final Map<String, Notifier> notifiers = new ConcurrentHashMap<>();
private NotifyConfigManager configManager; private final NotifyConfigManager configManager;
// private EventBus eventBus; // private EventBus eventBus;
@ -22,10 +26,24 @@ public abstract class AbstractNotifierManager implements NotifierManager {
// this.eventBus = eventBus; // this.eventBus = eventBus;
} }
protected NotifierProperties getProperties(NotifyType notifyType, String id) { @Override
return configManager.getNotifyConfig(notifyType, id); public <T extends Template> Notifier<T> getNotifier(NotifyType type, String id) {
Notifier notifier;
if (null == notifiers.get(id)) {
notifier = createNotifier(getProperties(type, id));
} else {
notifier = notifiers.get(id);
}
return notifier;
} }
@Override
public void register(NotifierProvider provider) {
providers.computeIfAbsent(provider.getType().getId(), ignore -> new ConcurrentHashMap<>())
.put(provider.getProvider().getId(), provider);
}
@Override
public void reload(String id) { public void reload(String id) {
Notifier notifier = notifiers.remove(id); Notifier notifier = notifiers.remove(id);
if (null != notifier) { if (null != notifier) {
@ -33,6 +51,23 @@ public abstract class AbstractNotifierManager implements NotifierManager {
} }
} }
/**
* 根据通知配置属性ID获取通知配置属性
*
* @param notifyType 通知类型
* @param id 通知配置属性ID
* @return 通知配置属性
*/
protected NotifierProperties getProperties(NotifyType notifyType, String id) {
return configManager.getNotifyConfig(notifyType, id);
}
/**
* 根据配置创建通知器
*
* @param properties 通知器配置属性
* @return 通知器
*/
protected Notifier createNotifier(NotifierProperties properties) { protected Notifier createNotifier(NotifierProperties properties) {
Map<String, NotifierProvider> providerMap = providers.get(properties.getType()); Map<String, NotifierProvider> providerMap = providers.get(properties.getType());
if (null == providerMap) { if (null == providerMap) {
@ -42,7 +77,7 @@ public abstract class AbstractNotifierManager implements NotifierManager {
if (null == provider) { if (null == provider) {
throw new UnsupportedOperationException("不支持的服务商: " + properties.getProvider()); throw new UnsupportedOperationException("不支持的服务商: " + properties.getProvider());
} }
Notifier<? extends Template> notifier1 = provider.createNotifier(properties); Notifier notifier1 = provider.createNotifier(properties);
Notifier notifier2 = notifiers.put(properties.getId(), notifier1); Notifier notifier2 = notifiers.put(properties.getId(), notifier1);
if (null != notifier2) { if (null != notifier2) {
notifier2.close(); notifier2.close();
@ -50,19 +85,4 @@ public abstract class AbstractNotifierManager implements NotifierManager {
return notifier1; return notifier1;
} }
@Override
public Notifier getNotifier(NotifyType type, String id) {
Notifier notifier = notifiers.get(id);
if (null == notifier) {
notifier = createNotifier(getProperties(type, id));
}
return notifier;
}
@Override
public void registerProvider(NotifierProvider provider) {
providers.computeIfAbsent(provider.getType().getId(), ignore -> new ConcurrentHashMap<>())
.put(provider.getProvider().getId(), provider);
}
} }

View File

@ -1,7 +1,7 @@
package com.cicdi.notify; package com.cicdi.notify;
/** /**
* 默认通知类型 * 默认支持的通知类型
* *
* @author xueye * @author xueye
*/ */
@ -12,6 +12,9 @@ public enum DefaultNotifyType implements NotifyType {
wechat("微信"), wechat("微信"),
dingTalk("钉钉"); dingTalk("钉钉");
/**
* 通知类型名称
*/
private final String name; private final String name;
DefaultNotifyType(String name) { DefaultNotifyType(String name) {

View File

@ -5,42 +5,49 @@ import com.cicdi.notify.template.Template;
import java.util.Map; import java.util.Map;
/** /**
* 通知器 * 消息通知器
* *
* @param <T> 通知模板
* @author xueye * @author xueye
*/ */
public interface Notifier<T extends Template> { public interface Notifier<T extends Template> {
/** /**
* 获取通知器唯一标识
*
* @return 通知器唯一标识 * @return 通知器唯一标识
*/ */
String getNotifierId(); String getNotifierId();
/** /**
* @return 通知器类型 * 获取通知类型
*
* @return 通知类型
* @see NotifyType * @see NotifyType
*/ */
NotifyType getType(); NotifyType getType();
/** /**
* @return 通知提供商 * 获取服务商
*
* @return 通知服务商
*/ */
Provider getProvider(); Provider getProvider();
/** /**
* 指定模板ID进行发送 * 指定通知模板ID进行发送
* <p>用于一些固定模板的消息发送例如验证码定时消息</p>
* *
* @param templateId 模板唯一标识 * @param templateId 通知模板ID
* @param context 上下文 * @param context 模板上下文参数
*/ */
void send(String templateId, Map<String, Object> context); void send(String templateId, Map<String, Object> context);
/** /**
* 指定模板进行发送 * 指定通知模板进行发送
* <p>提供一个通知模板进行消息发送比较灵活适用于一些一次性的消息推送<p/>
* *
* @param template 通知模板 * @param template 通知模板
* @param context 上下文 * @param context 模板上下文参数
*/ */
void send(T template, Map<String, Object> context); void send(T template, Map<String, Object> context);
@ -49,7 +56,15 @@ public interface Notifier<T extends Template> {
*/ */
void close(); void close();
/**
* 将此通知器转换成特定类型通知器
*
* @param type 目标类型类
* @param <R> 目标类型
* @return 目标类型通知器
*/
default <R extends Notifier<T>> R unwrap(Class<R> type) { default <R extends Notifier<T>> R unwrap(Class<R> type) {
return type.cast(this); return type.cast(this);
} }
} }

View File

@ -3,7 +3,7 @@ package com.cicdi.notify;
import com.cicdi.notify.template.Template; import com.cicdi.notify.template.Template;
/** /**
* 通知器管理 * 通知器管理用于获取获取通知器
* *
* @author xueye * @author xueye
*/ */
@ -11,12 +11,22 @@ public interface NotifierManager {
/** /**
* @param type 通知类型 {@link NotifyType} * @param type 通知类型 {@link NotifyType}
* @param id 唯一标识 * @param id 通知器唯一标识
* @param <T> 模板类型 * @param <T> 通知模板类型
* @return 通知器 * @return 通知器
* @see NotifierProvider
*/ */
<T extends Template> Notifier<T> getNotifier(NotifyType type, String id); <T extends Template> Notifier<T> getNotifier(NotifyType type, String id);
/**
* 注册通知服务商
* <p>服务商经过注册之后才可以使用, 如果通知模板配置的服务商不在已注册集合中, 将会抛出{@link UnsupportedOperationException}</p>
*
* @param provider 通知服务商
* @see UnsupportedOperationException
*/
void register(NotifierProvider provider);
/** /**
* 重新加载通知管理器 * 重新加载通知管理器
* *
@ -24,5 +34,4 @@ public interface NotifierManager {
*/ */
void reload(String id); void reload(String id);
void registerProvider(NotifierProvider provider);
} }

View File

@ -1,51 +1,63 @@
package com.cicdi.notify; package com.cicdi.notify;
import java.io.Serializable;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
/** /**
* 通知属性 * 通知配置属性
* *
* @author xueye * @author xueye
*/ */
public class NotifierProperties { public class NotifierProperties implements Serializable {
/** /**
* 唯一标识 * 通知配置属性唯一标识
*/ */
private String id; private String id;
/** /**
* 通知类型标识 * 通知类型
* *
* @see NotifyType * @see NotifyType
*/ */
private String type; private String type;
/** /**
* 通知服务提供商标识,: aliyun ... * 通知服务商标识
*/ */
private String provider; private String provider;
/** /**
* 配置名称 * 通知配置名称
*/ */
private String name; private String name;
/** /**
* 配置内容,不同的服务提供商,配置不同. * 通知配置内容
* *
* @see NotifierProvider * @see NotifierProvider
*/ */
private Map<String, Object> configuration; private Map<String, Object> configuration;
/**
* 获取通知配置值
*
* @param key 通知配置项
* @return 通知配置项值
*/
public Optional<Object> getConfig(String key) { public Optional<Object> getConfig(String key) {
return Optional.ofNullable(configuration) return Optional.ofNullable(configuration)
.map(conf -> conf.get(key)); .map(conf -> conf.get(key));
} }
/**
* 获取通知配置值
*
* @param key 通知配置项
* @return 通知配置项值
*/
public Object getConfigOrNull(String key) { public Object getConfigOrNull(String key) {
return Optional.ofNullable(configuration) return Optional.ofNullable(configuration)
.map(conf -> conf.get(key)) .map(conf -> conf.get(key))
@ -91,4 +103,5 @@ public class NotifierProperties {
public void setConfiguration(Map<String, Object> configuration) { public void setConfiguration(Map<String, Object> configuration) {
this.configuration = configuration; this.configuration = configuration;
} }
} }

View File

@ -3,7 +3,7 @@ package com.cicdi.notify;
import com.cicdi.notify.template.Template; import com.cicdi.notify.template.Template;
/** /**
* 通知器提供 * 通知服务
* *
* @author xueye * @author xueye
*/ */
@ -17,17 +17,19 @@ public interface NotifierProvider {
NotifyType getType(); NotifyType getType();
/** /**
* @return 服务商 * 获取通知器服务商
*
* @return 服务商标识
*/ */
Provider getProvider(); Provider getProvider();
/** /**
* 根据配置创建通知器 * 根据通知器配置属性创建通知器
* *
* @param properties 通知配置 * @param properties 通知配置属性
* @return 创建结果 * @return 通知器
*/ */
Notifier<? extends Template> createNotifier(NotifierProperties properties); Notifier<? extends Template> createNotifier(NotifierProperties properties);
// /** // /**
// * 获取通知配置元数据,通过元数据可以知道此通知所需要的配置信息 // * 获取通知配置元数据,通过元数据可以知道此通知所需要的配置信息

View File

@ -1,18 +1,18 @@
package com.cicdi.notify; package com.cicdi.notify;
/** /**
* 通知配置管理 * 通知配置属性管理用于统一管理通知配置属性
* *
* @author xueye * @author xueye
*/ */
public interface NotifyConfigManager { public interface NotifyConfigManager {
/** /**
* 根据类型和配置ID获取通知器配置 * 根据类型和配置ID获取通知器配置属性
* *
* @param notifyType 通知类型 {@link NotifyType} * @param notifyType 通知类型 {@link NotifyType}
* @param configId 通知配置ID * @param configId 通知配置ID
* @return 通知配置 * @return 通知配置属性
*/ */
NotifierProperties getNotifyConfig(NotifyType notifyType, String configId); NotifierProperties getNotifyConfig(NotifyType notifyType, String configId);

View File

@ -1,19 +1,23 @@
package com.cicdi.notify; package com.cicdi.notify;
/** /**
* 通知类型 * 通知类型通常使用枚举实现枚举支持的通知类型
* *
* @author xueye * @author xueye
*/ */
public interface NotifyType { public interface NotifyType {
/** /**
* 通知类型唯一标识
*
* @return 唯一标识 * @return 唯一标识
*/ */
String getId(); String getId();
/** /**
* @return 通知器名称 * 获取通知类型
*
* @return 通知类型名称
*/ */
String getName(); String getName();

View File

@ -1,19 +1,24 @@
package com.cicdi.notify; package com.cicdi.notify;
/** /**
* 提供商标识 * 服务商标识通常使用枚举实现枚举支持的服务商
* *
* @author xueye * @author xueye
*/ */
public interface Provider { public interface Provider {
/** /**
* 获取服务商ID
*
* @return 唯一标识 * @return 唯一标识
*/ */
String getId(); String getId();
/** /**
* @return 提供商名称 * 获取服务商名称
*
* @return 服务商名称
*/ */
String getName(); String getName();

View File

@ -58,7 +58,7 @@ public class DingTalkTest {
// register // register
DingTalkNotifierProvider provider = new DingTalkNotifierProvider(templateManager); DingTalkNotifierProvider provider = new DingTalkNotifierProvider(templateManager);
notifierManager.registerProvider(provider); notifierManager.register(provider);
templateManager.register(provider); templateManager.register(provider);
Notifier<Template> notifier = notifierManager.getNotifier(DefaultNotifyType.dingTalk, "123"); Notifier<Template> notifier = notifierManager.getNotifier(DefaultNotifyType.dingTalk, "123");

View File

@ -64,7 +64,7 @@ public class DefaultEmailTest {
NotifierManager notifierManager = new AbstractNotifierManager(notifyConfigManager){}; NotifierManager notifierManager = new AbstractNotifierManager(notifyConfigManager){};
DefaultEmailNotifierProvider defaultEmailNotifierProvider = new DefaultEmailNotifierProvider(templateManager); DefaultEmailNotifierProvider defaultEmailNotifierProvider = new DefaultEmailNotifierProvider(templateManager);
// register // register
notifierManager.registerProvider(defaultEmailNotifierProvider); notifierManager.register(defaultEmailNotifierProvider);
templateManager.register(defaultEmailNotifierProvider); templateManager.register(defaultEmailNotifierProvider);
Notifier<Template> notifier = notifierManager.getNotifier(DefaultNotifyType.email, "123"); Notifier<Template> notifier = notifierManager.getNotifier(DefaultNotifyType.email, "123");

View File

@ -55,7 +55,7 @@ public class AliyunSmsTest {
NotifierManager notifierManager = new AbstractNotifierManager(notifyConfigManager){}; NotifierManager notifierManager = new AbstractNotifierManager(notifyConfigManager){};
AliyunSmsNotifierProvider aliyunSmsNotifierProvider = new AliyunSmsNotifierProvider(templateManager); AliyunSmsNotifierProvider aliyunSmsNotifierProvider = new AliyunSmsNotifierProvider(templateManager);
// register // register
notifierManager.registerProvider(aliyunSmsNotifierProvider); notifierManager.register(aliyunSmsNotifierProvider);
templateManager.register(aliyunSmsNotifierProvider); templateManager.register(aliyunSmsNotifierProvider);
Notifier<Template> notifier = notifierManager.getNotifier(DefaultNotifyType.sms, "123"); Notifier<Template> notifier = notifierManager.getNotifier(DefaultNotifyType.sms, "123");

View File

@ -58,8 +58,8 @@ public class TelecomSmsTest {
AliyunSmsNotifierProvider aliyunSmsNotifierProvider = new AliyunSmsNotifierProvider(templateManager); AliyunSmsNotifierProvider aliyunSmsNotifierProvider = new AliyunSmsNotifierProvider(templateManager);
TelecomSmsNotifierProvider telecomSmsNotifierProvider = new TelecomSmsNotifierProvider(templateManager); TelecomSmsNotifierProvider telecomSmsNotifierProvider = new TelecomSmsNotifierProvider(templateManager);
notifierManager.registerProvider(aliyunSmsNotifierProvider); notifierManager.register(aliyunSmsNotifierProvider);
notifierManager.registerProvider(telecomSmsNotifierProvider); notifierManager.register(telecomSmsNotifierProvider);
templateManager.register(aliyunSmsNotifierProvider); templateManager.register(aliyunSmsNotifierProvider);
templateManager.register(telecomSmsNotifierProvider); templateManager.register(telecomSmsNotifierProvider);

View File

@ -58,7 +58,7 @@ public class WechatTest {
// register // register
WechatNotifierProvider provider = new WechatNotifierProvider(templateManager); WechatNotifierProvider provider = new WechatNotifierProvider(templateManager);
notifierManager.registerProvider(provider); notifierManager.register(provider);
templateManager.register(provider); templateManager.register(provider);
Notifier<Template> notifier = notifierManager.getNotifier(DefaultNotifyType.wechat, "123"); Notifier<Template> notifier = notifierManager.getNotifier(DefaultNotifyType.wechat, "123");