/*
* 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.server.pushing;
import net.hasor.core.Init;
import net.hasor.core.Inject;
import net.hasor.registry.RsfCenterListener;
import net.hasor.registry.domain.client.CenterEventBody;
import net.hasor.registry.trace.TraceUtil;
import net.hasor.registry.server.domain.LogUtils;
import net.hasor.rsf.InterAddress;
import net.hasor.rsf.RsfContext;
import net.hasor.rsf.domain.provider.InstanceAddressProvider;
import net.hasor.rsf.rpc.caller.RsfServiceWrapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 执行处理器,该类的作用是将事件推送到指定的客户端中去。
* @version : 2016年3月23日
* @author 赵永春(zyc@hasor.net)
*/
public class PushProcessor {
protected Logger logger = LoggerFactory.getLogger(getClass());
@Inject
private RsfContext rsfContext;
private ThreadLocal<RsfCenterListener> rsfClientListener;
//
@Init
public void init() {
this.rsfClientListener = new ThreadLocal<RsfCenterListener>() {
protected RsfCenterListener initialValue() {
return rsfContext.getRsfClient().wrapper(RsfCenterListener.class);
}
};
}
//
public final List<InterAddress> doProcessor(PushEvent event) {
if (event == null) {
return Collections.emptyList();
}
if (event.getTarget() == null || event.getTarget().isEmpty()) {
logger.error(LogUtils.create("ERROR_300_00003")//
.addLog("traceID", TraceUtil.getTraceID())//
.addLog("serviceID", event.getServiceID())//
.addLog("pushEventType", event.getPushEventType().name())//
.toJson());
return Collections.emptyList();
//
} else {
ArrayList<InterAddress> failedAddress = new ArrayList<InterAddress>();
for (InterAddress target : event.getTarget()) {
boolean res = this.doProcessor(target, event);
if (!res) {
failedAddress.add(target);
}
}
return failedAddress;
}
}
//
/**
* 向客户端推送数据,3次重试
* @param rsfAddress 目标客户端
* @param event 数据
*/
private boolean doProcessor(InterAddress rsfAddress, PushEvent event) {
CenterEventBody eventBody = new CenterEventBody();
eventBody.setEventType(event.getPushEventType().forCenterEvent());
eventBody.setServiceID(event.getServiceID());
eventBody.setEventBody(event.getEventBody());
boolean result = false;
//
result = sendEvent(rsfAddress, eventBody, 1); // 第一次尝试
if (!result) {
result = sendEvent(rsfAddress, eventBody, 2); // 第二次尝试
if (!result) {
result = sendEvent(rsfAddress, eventBody, 3); // 第三次尝试
}
}
//
return result;
}
/** 数据推送 */
private boolean sendEvent(InterAddress rsfAddress, CenterEventBody eventBody, int times) {
//
logger.info(LogUtils.create("INFO_200_00001")//
.addLog("traceID", TraceUtil.getTraceID())//
.addLog("serviceID", eventBody.getServiceID())//
.addLog("rsfAddress", rsfAddress)//
.addLog("eventType", eventBody.getEventType())//
.addLog("times", times)//
.toJson());
//
try {
RsfCenterListener listener = this.rsfClientListener.get();
((RsfServiceWrapper) listener).setTarget(new InstanceAddressProvider(rsfAddress));
return listener.onEvent(eventBody.getEventType(), eventBody);
} catch (Throwable e) {
logger.error(LogUtils.create("ERROR_300_00002")//
.addLog("traceID", TraceUtil.getTraceID())//
.logException(e)//
.addLog("rsfAddress", rsfAddress.toHostSchema())//
.addLog("serviceID", eventBody.getServiceID())//
.addLog("eventType", eventBody.getEventType())//
.addLog("eventBody", eventBody.getEventBody())//
.toJson());
return false;
}
}
}