feat: 核心模块实现
This commit is contained in:
parent
5c34975b81
commit
216a059169
@ -0,0 +1,27 @@
|
||||
package com.cicdi.notify;
|
||||
|
||||
import com.cicdi.notify.template.Template;
|
||||
import com.cicdi.notify.template.TemplateManager;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author xueye
|
||||
*/
|
||||
public abstract class AbstractNotifier<T extends Template> implements Notifier<T> {
|
||||
|
||||
private final TemplateManager templateManager;
|
||||
|
||||
public AbstractNotifier(TemplateManager templateManager) {
|
||||
this.templateManager = templateManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void send(String templateId, Map<String, Object> context) {
|
||||
Template template = templateManager.getTemplate(this.getType(), templateId);
|
||||
if (null == template) {
|
||||
throw new UnsupportedOperationException("模版不存在:" + templateId);
|
||||
}
|
||||
this.send((T) template, context);
|
||||
}
|
||||
}
|
@ -0,0 +1,68 @@
|
||||
package com.cicdi.notify;
|
||||
|
||||
import com.cicdi.notify.template.Template;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
/**
|
||||
* @author xueye
|
||||
*/
|
||||
public class DefaultNotifierManager implements NotifierManager {
|
||||
private final Map<String, Map<String, NotifierProvider>> providers = new ConcurrentHashMap<>();
|
||||
|
||||
private Map<String, Notifier> notifiers = new ConcurrentHashMap<>();
|
||||
|
||||
private NotifyConfigManager configManager;
|
||||
|
||||
// private EventBus eventBus;
|
||||
|
||||
public DefaultNotifierManager(NotifyConfigManager manager/*, EventBus eventBus*/) {
|
||||
this.configManager = manager;
|
||||
// this.eventBus = eventBus;
|
||||
}
|
||||
|
||||
protected NotifierProperties getProperties(NotifyType notifyType, String id) {
|
||||
return configManager.getNotifyConfig(notifyType, id);
|
||||
}
|
||||
|
||||
public void reload(String id) {
|
||||
Notifier notifier = notifiers.remove(id);
|
||||
if (null != notifier) {
|
||||
notifier.close();
|
||||
}
|
||||
}
|
||||
|
||||
protected Notifier createNotifier(NotifierProperties properties) {
|
||||
Map<String, NotifierProvider> providerMap = providers.get(properties.getType());
|
||||
if (null == providerMap) {
|
||||
throw new UnsupportedOperationException("不支持的通知类型: " + properties.getType());
|
||||
}
|
||||
NotifierProvider provider = providerMap.get(properties.getProvider());
|
||||
if (null == provider) {
|
||||
throw new UnsupportedOperationException("不支持的服务商: " + properties.getProvider());
|
||||
}
|
||||
Notifier<? extends Template> notifier1 = provider.createNotifier(properties);
|
||||
Notifier notifier2 = notifiers.put(properties.getId(), notifier1);
|
||||
if (null != notifier2) {
|
||||
notifier2.close();
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package com.cicdi.notify;
|
||||
|
||||
/**
|
||||
* 默认通知类型
|
||||
*
|
||||
* @author xueye
|
||||
*/
|
||||
public enum DefaultNotifyType implements NotifyType {
|
||||
|
||||
email("邮件"),
|
||||
;
|
||||
|
||||
private final String name;
|
||||
|
||||
DefaultNotifyType(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getId() {
|
||||
return name();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
}
|
55
notify-core/src/main/java/com/cicdi/notify/Notifier.java
Normal file
55
notify-core/src/main/java/com/cicdi/notify/Notifier.java
Normal file
@ -0,0 +1,55 @@
|
||||
package com.cicdi.notify;
|
||||
|
||||
import com.cicdi.notify.template.Template;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 通知器
|
||||
*
|
||||
* @param <T> 通知模板
|
||||
* @author xueye
|
||||
*/
|
||||
public interface Notifier<T extends Template> {
|
||||
|
||||
/**
|
||||
* @return 通知器唯一标识
|
||||
*/
|
||||
String getNotifierId();
|
||||
|
||||
/**
|
||||
* @return 通知器类型
|
||||
* @see NotifyType
|
||||
*/
|
||||
NotifyType getType();
|
||||
|
||||
/**
|
||||
* @return 通知提供商
|
||||
*/
|
||||
Provider getProvider();
|
||||
|
||||
/**
|
||||
* 指定模板ID进行发送
|
||||
*
|
||||
* @param templateId 模板唯一标识
|
||||
* @param context 上下文
|
||||
*/
|
||||
void send(String templateId, Map<String, Object> context);
|
||||
|
||||
/**
|
||||
* 指定模板进行发送
|
||||
*
|
||||
* @param template 通知模板
|
||||
* @param context 上下文
|
||||
*/
|
||||
void send(T template, Map<String, Object> context);
|
||||
|
||||
/**
|
||||
* 关闭通知器
|
||||
*/
|
||||
void close();
|
||||
|
||||
default <R extends Notifier<T>> R unwrap(Class<R> type) {
|
||||
return type.cast(this);
|
||||
}
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package com.cicdi.notify;
|
||||
|
||||
import com.cicdi.notify.template.Template;
|
||||
|
||||
/**
|
||||
* 通知器管理
|
||||
*
|
||||
* @author xueye
|
||||
*/
|
||||
public interface NotifierManager {
|
||||
|
||||
/**
|
||||
* @param type 通知类型 {@link NotifyType}
|
||||
* @param id 唯一标识
|
||||
* @param <T> 模板类型
|
||||
* @return 通知器
|
||||
*/
|
||||
<T extends Template> Notifier<T> getNotifier(NotifyType type, String id);
|
||||
|
||||
/**
|
||||
* 重新加载通知管理器
|
||||
*
|
||||
* @param id 通知管理器ID
|
||||
*/
|
||||
void reload(String id);
|
||||
|
||||
void registerProvider(NotifierProvider provider);
|
||||
}
|
@ -0,0 +1,94 @@
|
||||
package com.cicdi.notify;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* 通知器属性
|
||||
*
|
||||
* @author xueye
|
||||
*/
|
||||
public class NotifierProperties {
|
||||
|
||||
/**
|
||||
* 唯一标识
|
||||
*/
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* 通知类型标识
|
||||
*
|
||||
* @see NotifyType
|
||||
*/
|
||||
private String type;
|
||||
|
||||
/**
|
||||
* 通知服务提供商标识,如: aliyun ...
|
||||
*/
|
||||
private String provider;
|
||||
|
||||
/**
|
||||
* 配置名称
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 配置内容,不同的服务提供商,配置不同.
|
||||
*
|
||||
* @see NotifierProvider
|
||||
*/
|
||||
private Map<String, Object> configuration;
|
||||
|
||||
|
||||
|
||||
public Optional<Object> getConfig(String key) {
|
||||
return Optional.ofNullable(configuration)
|
||||
.map(conf -> conf.get(key));
|
||||
}
|
||||
|
||||
public Object getConfigOrNull(String key) {
|
||||
return Optional.ofNullable(configuration)
|
||||
.map(conf -> conf.get(key))
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public String getProvider() {
|
||||
return provider;
|
||||
}
|
||||
|
||||
public void setProvider(String provider) {
|
||||
this.provider = provider;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public Map<String, Object> getConfiguration() {
|
||||
return configuration;
|
||||
}
|
||||
|
||||
public void setConfiguration(Map<String, Object> configuration) {
|
||||
this.configuration = configuration;
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package com.cicdi.notify;
|
||||
|
||||
import com.cicdi.notify.template.Template;
|
||||
|
||||
/**
|
||||
* 通知器提供商
|
||||
*
|
||||
* @author xueye
|
||||
*/
|
||||
public interface NotifierProvider {
|
||||
/**
|
||||
* 获取通知类型
|
||||
*
|
||||
* @return 通知类型
|
||||
* @see NotifyType
|
||||
*/
|
||||
NotifyType getType();
|
||||
|
||||
/**
|
||||
* @return 服务商
|
||||
*/
|
||||
Provider getProvider();
|
||||
|
||||
/**
|
||||
* 根据配置创建通知器
|
||||
*
|
||||
* @param properties 通知配置
|
||||
* @return 创建结果
|
||||
*/
|
||||
Notifier<? extends Template> createNotifier(NotifierProperties properties);
|
||||
|
||||
// /**
|
||||
// * 获取通知配置元数据,通过元数据可以知道此通知所需要的配置信息
|
||||
// *
|
||||
// * @return 配置元数据
|
||||
// */
|
||||
// default ConfigMetadata getNotifierConfigMetadata() {
|
||||
// return null;
|
||||
// }
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package com.cicdi.notify;
|
||||
|
||||
/**
|
||||
* 通知器配置管理
|
||||
*
|
||||
* @author xueye
|
||||
*/
|
||||
public interface NotifyConfigManager {
|
||||
|
||||
/**
|
||||
* 根据类型和配置ID获取通知器配置
|
||||
*
|
||||
* @param notifyType 通知器类型 {@link NotifyType}
|
||||
* @param configId 通知器配置ID
|
||||
* @return 通知器配置
|
||||
*/
|
||||
NotifierProperties getNotifyConfig(NotifyType notifyType, String configId);
|
||||
|
||||
}
|
20
notify-core/src/main/java/com/cicdi/notify/NotifyType.java
Normal file
20
notify-core/src/main/java/com/cicdi/notify/NotifyType.java
Normal file
@ -0,0 +1,20 @@
|
||||
package com.cicdi.notify;
|
||||
|
||||
/**
|
||||
* 通知器类型
|
||||
*
|
||||
* @author xueye
|
||||
*/
|
||||
public interface NotifyType {
|
||||
|
||||
/**
|
||||
* @return 唯一标识
|
||||
*/
|
||||
String getId();
|
||||
|
||||
/**
|
||||
* @return 通知器名称
|
||||
*/
|
||||
String getName();
|
||||
|
||||
}
|
20
notify-core/src/main/java/com/cicdi/notify/Provider.java
Normal file
20
notify-core/src/main/java/com/cicdi/notify/Provider.java
Normal file
@ -0,0 +1,20 @@
|
||||
package com.cicdi.notify;
|
||||
|
||||
/**
|
||||
* 提供商标识
|
||||
*
|
||||
* @author xueye
|
||||
*/
|
||||
public interface Provider {
|
||||
|
||||
/**
|
||||
* @return 唯一标识
|
||||
*/
|
||||
String getId();
|
||||
|
||||
/**
|
||||
* @return 提供商名称
|
||||
*/
|
||||
String getName();
|
||||
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
package com.cicdi.notify.template;
|
||||
|
||||
import com.cicdi.notify.NotifyType;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
/**
|
||||
* 模板管理器
|
||||
*
|
||||
* @author xueye
|
||||
*/
|
||||
public abstract class AbstractTemplateManager implements TemplateManager {
|
||||
|
||||
protected Map<String, Map<String, TemplateProvider>> providers = new ConcurrentHashMap<>();
|
||||
|
||||
protected Map<String, Template> templates = new ConcurrentHashMap<>();
|
||||
|
||||
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<String, TemplateProvider> 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);
|
||||
if (null == template) {
|
||||
throw new UnsupportedOperationException("通知类型不支持: " + type.getId());
|
||||
}
|
||||
templates.put(id, template);
|
||||
}
|
||||
return template;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reload(String templateId) {
|
||||
templates.remove(templateId);
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package com.cicdi.notify.template;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 通知模板
|
||||
*
|
||||
* @author xueye
|
||||
*/
|
||||
public interface Template extends Serializable {
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
package com.cicdi.notify.template;
|
||||
|
||||
import com.cicdi.notify.NotifyType;
|
||||
|
||||
/**
|
||||
* 通知模板管理器,用于模板的转换
|
||||
*
|
||||
* @author xueye
|
||||
*/
|
||||
public interface TemplateManager {
|
||||
|
||||
/**
|
||||
* @param type 模板类型
|
||||
* @param id 模板ID
|
||||
* @return 模板
|
||||
*/
|
||||
Template getTemplate(NotifyType type, String id);
|
||||
|
||||
/**
|
||||
* @param type 模板类型
|
||||
* @param properties 模板属性
|
||||
* @return 模板
|
||||
*/
|
||||
Template createTemplate(NotifyType type, TemplateProperties properties);
|
||||
|
||||
/**
|
||||
* 重新加载模板
|
||||
*
|
||||
* @param id 模板ID
|
||||
*/
|
||||
void reload(String id);
|
||||
|
||||
void register(TemplateProvider provider);
|
||||
}
|
@ -0,0 +1,50 @@
|
||||
package com.cicdi.notify.template;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 模板属性
|
||||
*
|
||||
* @author xueye
|
||||
*/
|
||||
public class TemplateProperties implements Serializable {
|
||||
|
||||
/**
|
||||
* 模板类型
|
||||
*/
|
||||
private String type;
|
||||
|
||||
/**
|
||||
* 模板提供商
|
||||
*/
|
||||
private String provider;
|
||||
|
||||
/**
|
||||
* 模板
|
||||
*/
|
||||
private String template;
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public String getProvider() {
|
||||
return provider;
|
||||
}
|
||||
|
||||
public void setProvider(String provider) {
|
||||
this.provider = provider;
|
||||
}
|
||||
|
||||
public String getTemplate() {
|
||||
return template;
|
||||
}
|
||||
|
||||
public void setTemplate(String template) {
|
||||
this.template = template;
|
||||
}
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package com.cicdi.notify.template;
|
||||
|
||||
import com.cicdi.notify.NotifyType;
|
||||
import com.cicdi.notify.Provider;
|
||||
|
||||
/**
|
||||
* 模板提供商
|
||||
*
|
||||
* @author xueye
|
||||
*/
|
||||
public interface TemplateProvider {
|
||||
|
||||
/**
|
||||
* @return 通知类型
|
||||
* @see NotifyType
|
||||
*/
|
||||
NotifyType getType();
|
||||
|
||||
/**
|
||||
* @return 通知提供商
|
||||
*/
|
||||
Provider getProvider();
|
||||
|
||||
/**
|
||||
* @param properties 模板属性
|
||||
* @return 模板
|
||||
*/
|
||||
Template createTemplate(TemplateProperties properties);
|
||||
}
|
Loading…
Reference in New Issue
Block a user