/*
* Copyright 2008-2009 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.hasor.registry.client;
import net.hasor.registry.RsfCenterEvent;
import net.hasor.registry.domain.client.CenterEventBody;
import net.hasor.rsf.InterAddress;
import net.hasor.rsf.RsfUpdater;
import net.hasor.rsf.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* 注册中心事件响应实现
* @version : 2016年2月18日
* @author 赵永春(zyc@hasor.net)
*/
class EventProcessMapping {
protected static Logger logger = LoggerFactory.getLogger(EventProcessMapping.class);
private static String nowData() {
return new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
}
private static List<InterAddress> convertTo(String addressSetBody) {
String[] addressSet = StringUtils.isBlank(addressSetBody) ? null : addressSetBody.split(",");
if (addressSet == null || addressSet.length == 0) {
return Collections.EMPTY_LIST;
}
List<InterAddress> addressList = new ArrayList<InterAddress>();
for (String address : addressSet) {
try {
addressList.add(new InterAddress(address));
} catch (Throwable e) {
logger.error("address {} Invalid format -> {}.", address, e.getMessage());
}
}
return addressList;
}
//
private static final Map<String, EventProcess> eventProcessMap;
static {
eventProcessMap = new HashMap<String, EventProcess>();
eventProcessMap.put(RsfCenterEvent.RsfCenter_AppendAddressEvent, new AppendAddressEvent());
eventProcessMap.put(RsfCenterEvent.RsfCenter_RefreshAddressEvent, new RefreshAddressEvent());
eventProcessMap.put(RsfCenterEvent.RsfCenter_RemoveAddressEvent, new RemoveAddressEvent());
eventProcessMap.put(RsfCenterEvent.RsfCenter_UpdateServiceRouteEvent, new UpdateServiceRouteEvent());
eventProcessMap.put(RsfCenterEvent.RsfCenter_UpdateMethodRouteEvent, new UpdateMethodRouteEvent());
eventProcessMap.put(RsfCenterEvent.RsfCenter_UpdateArgsRouteEvent, new UpdateArgsRouteEvent());
eventProcessMap.put(RsfCenterEvent.RsfCenter_UpdateFlowControlEvent, new UpdateFlowControlEvent());
}
//
public static EventProcess findEventProcess(String eventType) {
if (StringUtils.isBlank(eventType)) {
return null;
}
return eventProcessMap.get(eventType);
}
//
//
//
/**追加或重新激活地址。*/
private static class AppendAddressEvent implements EventProcess {
@Override
public boolean processEvent(RsfUpdater rsfUpdater, CenterEventBody centerEventBody) {
String serviceID = centerEventBody.getServiceID();
String eventBody = centerEventBody.getEventBody();
//
List<InterAddress> addressList = convertTo(eventBody);
if (addressList != null && !addressList.isEmpty()) {
rsfUpdater.appendAddress(serviceID, addressList);
logger.info("receiver Event from RsfCenter , eventType=AppendAddressEvent, serviceID = {} , addressSet = {}.", serviceID, eventBody);
} else {
logger.info("receiver Event from RsfCenter , eventType=AppendAddressEvent, serviceID = {} , addressSet is empty.", serviceID);
}
return true;
}
}
/**使用新的地址本替换已有的地址本。*/
private static class RefreshAddressEvent implements EventProcess {
@Override
public boolean processEvent(RsfUpdater rsfUpdater, CenterEventBody centerEventBody) {
String serviceID = centerEventBody.getServiceID();
String eventBody = centerEventBody.getEventBody();
//
List<InterAddress> addressList = convertTo(eventBody);
if (addressList != null && !addressList.isEmpty()) {
rsfUpdater.refreshAddress(serviceID, addressList);
logger.info("receiver Event from RsfCenter , eventType=RefreshAddressEvent, serviceID = {} , atTime = {}.", serviceID, nowData());
} else {
logger.info("receiver Event from RsfCenter , eventType=RefreshAddressEvent, serviceID = {} , addressSet is empty.", serviceID);
}
return true;
}
}
/**推送无效的地址,客户端对此地址进行删除操作。*/
private static class RemoveAddressEvent implements EventProcess {
@Override
public boolean processEvent(RsfUpdater rsfUpdater, CenterEventBody centerEventBody) {
String serviceID = centerEventBody.getServiceID();
String eventBody = centerEventBody.getEventBody();
//
List<InterAddress> addressList = convertTo(eventBody);
if (addressList != null && !addressList.isEmpty()) {
rsfUpdater.removeAddress(serviceID, addressList);
logger.info("receiver Event from RsfCenter , eventType=RemoveAddressEvent, serviceID = {} , addressSet = {}.", serviceID, eventBody);
} else {
logger.info("receiver Event from RsfCenter , eventType=RemoveAddressEvent, serviceID = {} , addressSet is empty.", serviceID);
}
return true;
}
}
/**推送服务级路由规则*/
private static class UpdateServiceRouteEvent implements EventProcess {
@Override
public boolean processEvent(RsfUpdater rsfUpdater, CenterEventBody centerEventBody) {
String serviceID = centerEventBody.getServiceID();
String scriptBody = centerEventBody.getEventBody();
//
if (StringUtils.isNotBlank(scriptBody)) {
logger.info("receiver Event from RsfCenter , eventType=UpdateServiceRouteEvent , serviceID = {} -> atTime = {}.", serviceID, nowData());
rsfUpdater.updateServiceRoute(serviceID, scriptBody);
} else {
logger.info("receiver Event from RsfCenter , eventType=UpdateServiceRouteEvent , serviceID = {} -> scriptBody is empty , atTime = {}.", serviceID, nowData());
}
return true;
}
}
/**推送方法级路由规则*/
private static class UpdateMethodRouteEvent implements EventProcess {
@Override
public boolean processEvent(RsfUpdater rsfUpdater, CenterEventBody centerEventBody) {
String serviceID = centerEventBody.getServiceID();
String scriptBody = centerEventBody.getEventBody();
//
if (StringUtils.isNotBlank(scriptBody)) {
logger.info("receiver Event from RsfCenter , eventType=UpdateMethodRouteEvent , serviceID = {} -> atTime = {}.", serviceID, nowData());
rsfUpdater.updateMethodRoute(serviceID, scriptBody);
} else {
logger.info("receiver Event from RsfCenter , eventType=UpdateMethodRouteEvent , serviceID = {} -> scriptBody is empty , atTime = {}.", serviceID, nowData());
}
return true;
}
}
/**推送参数级路由规则*/
private static class UpdateArgsRouteEvent implements EventProcess {
@Override
public boolean processEvent(RsfUpdater rsfUpdater, CenterEventBody centerEventBody) {
String serviceID = centerEventBody.getServiceID();
String scriptBody = centerEventBody.getEventBody();
//
if (StringUtils.isNotBlank(scriptBody)) {
logger.info("receiver Event from RsfCenter , eventType=UpdateArgsRouteEvent , serviceID = {} -> atTime = {}.", serviceID, nowData());
rsfUpdater.updateArgsRoute(serviceID, scriptBody);
} else {
logger.info("receiver Event from RsfCenter , eventType=UpdateArgsRouteEvent , serviceID = {} -> scriptBody is empty , atTime = {}.", serviceID, nowData());
}
return true;
}
}
/**推送流控流控规则*/
private static class UpdateFlowControlEvent implements EventProcess {
@Override
public boolean processEvent(RsfUpdater rsfUpdater, CenterEventBody centerEventBody) {
String serviceID = centerEventBody.getServiceID();
String flowControl = centerEventBody.getEventBody();
//
if (StringUtils.isNotBlank(flowControl)) {
logger.info("receiver Event from RsfCenter , eventType=UpdateFlowControlEvent , serviceID = {} -> atTime = {}.", serviceID, nowData());
rsfUpdater.updateFlowControl(serviceID, flowControl);
} else {
logger.info("receiver Event from RsfCenter , eventType=UpdateFlowControlEvent , serviceID = {} -> scriptBody is empty , atTime = {}.", serviceID, nowData());
}
return true;
}
}
}