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

View File

@ -6,14 +6,18 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 通知器管理器抽象实现
* <p>实现了全部的接口抽象的目的是为了方便实现Spring的自动装配回接口实现服务商的自动注册</p>
*
* @author xueye
*/
public abstract class AbstractNotifierManager implements NotifierManager {
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;
@ -22,10 +26,24 @@ public abstract class AbstractNotifierManager implements NotifierManager {
// this.eventBus = eventBus;
}
protected NotifierProperties getProperties(NotifyType notifyType, String id) {
return configManager.getNotifyConfig(notifyType, id);
@Override
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) {
Notifier notifier = notifiers.remove(id);
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) {
Map<String, NotifierProvider> providerMap = providers.get(properties.getType());
if (null == providerMap) {
@ -42,7 +77,7 @@ public abstract class AbstractNotifierManager implements NotifierManager {
if (null == provider) {
throw new UnsupportedOperationException("不支持的服务商: " + properties.getProvider());
}
Notifier<? extends Template> notifier1 = provider.createNotifier(properties);
Notifier notifier1 = provider.createNotifier(properties);
Notifier notifier2 = notifiers.put(properties.getId(), notifier1);
if (null != notifier2) {
notifier2.close();
@ -50,19 +85,4 @@ public abstract class AbstractNotifierManager implements NotifierManager {
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;
/**
* 默认通知类型
* 默认支持的通知类型
*
* @author xueye
*/
@ -12,6 +12,9 @@ public enum DefaultNotifyType implements NotifyType {
wechat("微信"),
dingTalk("钉钉");
/**
* 通知类型名称
*/
private final String name;
DefaultNotifyType(String name) {

View File

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

View File

@ -3,7 +3,7 @@ package com.cicdi.notify;
import com.cicdi.notify.template.Template;
/**
* 通知器管理
* 通知器管理用于获取获取通知器
*
* @author xueye
*/
@ -11,12 +11,22 @@ public interface NotifierManager {
/**
* @param type 通知类型 {@link NotifyType}
* @param id 唯一标识
* @param <T> 模板类型
* @param id 通知器唯一标识
* @param <T> 通知模板类型
* @return 通知器
* @see NotifierProvider
*/
<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 registerProvider(NotifierProvider provider);
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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