From e8c4f1594e06ffd8e4ce5755d4b0d5e6ca4b0da5 Mon Sep 17 00:00:00 2001 From: xueye Date: Sat, 3 Jul 2021 20:01:58 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E5=AE=8C=E5=96=84=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E7=AE=A1=E7=90=86=E5=99=A8=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../template/AbstractTemplateManager.java | 79 +++++++++++-------- .../notify/template/TemplateManager.java | 45 ++++++++--- 2 files changed, 80 insertions(+), 44 deletions(-) diff --git a/notify-core/src/main/java/com/cicdi/notify/template/AbstractTemplateManager.java b/notify-core/src/main/java/com/cicdi/notify/template/AbstractTemplateManager.java index a18af76..fd9f7f8 100644 --- a/notify-core/src/main/java/com/cicdi/notify/template/AbstractTemplateManager.java +++ b/notify-core/src/main/java/com/cicdi/notify/template/AbstractTemplateManager.java @@ -1,63 +1,78 @@ package com.cicdi.notify.template; +import com.cicdi.notify.DefaultNotifyType; import com.cicdi.notify.NotifyType; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** - * 模板管理器 + * 通知模板管理器抽象实现 + *

在SpringBoot框架中,可以实现BeanPostProcessor接口实现服务商的自动注册

* * @author xueye + * @see Template + * @see TemplateProvider */ public abstract class AbstractTemplateManager implements TemplateManager { + /** + * 所有注册支持的服务商 + *

使用{@link #register(TemplateProvider)}方法进行注册

+ */ protected Map> providers = new ConcurrentHashMap<>(); + /** + * 通知模板 + */ protected Map templates = new ConcurrentHashMap<>(); + /** + * 根据ID获取通知模板配置属性 + * + * @param type 通知类型 {@link DefaultNotifyType} + * @param id 通知模板属性ID + * @return 通知模板属性 + * @see DefaultNotifyType + */ protected abstract TemplateProperties getProperties(NotifyType type, String id); - /** - * 注册模板提供商 - * - * @param provider 模板提供商 - */ @Override - public void register(TemplateProvider provider) { - providers.computeIfAbsent(provider.getType().getId(), ignore -> new ConcurrentHashMap<>()).put(provider.getProvider().getId(), provider); - } - - @Override - public Template createTemplate(NotifyType type, TemplateProperties prop) { - Map providerMap = providers.get(type.getId()); - if (null == providerMap) { - throw new UnsupportedOperationException("不支持的通知类型: " + prop.getType()); - } - TemplateProvider templateProvider = providerMap.get(prop.getProvider()); - if (null == templateProvider) { - throw new UnsupportedOperationException("不支持的提供商: " + prop.getProvider()); - } - return templateProvider.createTemplate(prop); - } - - - @Override - public Template getTemplate(NotifyType type, String id) { - Template template = templates.get(id); - if (null == template) { - TemplateProperties properties = this.getProperties(type, id); - template = this.createTemplate(type, properties); + public Template getTemplate(NotifyType type, String templateId) { + Template template; + if (null != templates.get(templateId)) { + template = templates.get(templateId); + } else { + template = createTemplate(type, getProperties(type, templateId)); if (null == template) { - throw new UnsupportedOperationException("通知类型不支持: " + type.getId()); + throw new UnsupportedOperationException("不支持的通知类型: " + type.getId()); } - templates.put(id, template); + templates.put(templateId, template); } return template; } + @Override + public Template createTemplate(NotifyType type, TemplateProperties properties) { + Map providerTypes = providers.get(type.getId()); + if (null == providerTypes) { + throw new UnsupportedOperationException("不支持的通知类型: " + properties.getType()); + } + TemplateProvider templateProvider = providerTypes.get(properties.getProvider()); + if (null == templateProvider) { + throw new UnsupportedOperationException("不支持的服务商: " + properties.getProvider()); + } + return templateProvider.createTemplate(properties); + } + @Override public void reload(String templateId) { templates.remove(templateId); } + + @Override + public void register(TemplateProvider provider) { + providers.computeIfAbsent(provider.getType().getId(), ignore -> new ConcurrentHashMap<>()).put(provider.getProvider().getId(), provider); + } + } diff --git a/notify-core/src/main/java/com/cicdi/notify/template/TemplateManager.java b/notify-core/src/main/java/com/cicdi/notify/template/TemplateManager.java index b7067c9..2ade4ce 100644 --- a/notify-core/src/main/java/com/cicdi/notify/template/TemplateManager.java +++ b/notify-core/src/main/java/com/cicdi/notify/template/TemplateManager.java @@ -2,33 +2,54 @@ package com.cicdi.notify.template; import com.cicdi.notify.NotifyType; +import java.util.concurrent.ConcurrentHashMap; + /** - * 通知模板管理器,用于模板的转换 + * 通知模板管理器 + *

通知模板的转换在不同的通知服务商{@link TemplateProvider}中实现

* * @author xueye + * @see Template + * @see TemplateProvider */ public interface TemplateManager { /** - * @param type 模板类型 - * @param id 模板ID - * @return 模板 + * 根据ID获取通知模板 + *

使用容器缓存模板,如果不存在调用{@link #createTemplate(NotifyType, TemplateProperties)}方法创建, + * 并添加到容器中,容器建议使用线程安全的{@link ConcurrentHashMap}集合

+ * + * @param type 通知类型 + * @param templateId 通知模板ID + * @return 通知模板 */ - Template getTemplate(NotifyType type, String id); + Template getTemplate(NotifyType type, String templateId); /** - * @param type 模板类型 - * @param properties 模板属性 - * @return 模板 + * 使用提供的模板配置属性创建通知模板 + *

根据不同的通知类型处理对应的模板

+ * + * @param type 通知类型 + * @param properties 通知模板属性 + * @return 通知模板 */ Template createTemplate(NotifyType type, TemplateProperties properties); /** - * 重新加载模板 + * 注册通知服务商 + *

服务商经过注册之后才可以使用, 如果通知模板配置的服务商不在已注册集合中, 将会抛出{@link UnsupportedOperationException}

* - * @param id 模板ID + * @param provider 通知服务商 + * @see UnsupportedOperationException */ - void reload(String id); - void register(TemplateProvider provider); + + /** + * 重新加载通知模板 + *

如果通知模板属性有变更,调用此方法更新容器缓存中的通知模板

+ * + * @param templateId 通知模板ID + */ + void reload(String templateId); + }