/*
* 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.rsf.rpc.caller.remote;
import net.hasor.rsf.InterAddress;
import net.hasor.rsf.RsfContext;
import net.hasor.rsf.RsfEnvironment;
import net.hasor.rsf.RsfSettings;
import net.hasor.rsf.container.RsfBeanContainer;
import net.hasor.rsf.domain.ProtocolStatus;
import net.hasor.rsf.domain.RequestInfo;
import net.hasor.rsf.domain.ResponseInfo;
import net.hasor.rsf.rpc.caller.RsfCaller;
import net.hasor.rsf.utils.ExecutesManager;
import net.hasor.rsf.utils.ProtocolUtils;
import java.util.concurrent.Executor;
import java.util.concurrent.RejectedExecutionException;
/**
* 扩展{@link RsfCaller},用来支持远程机器发来的调用请求。
* @version : 2015年12月8日
* @author 赵永春(zyc@hasor.net)
*/
public class RemoteRsfCaller extends RsfCaller {
private final ExecutesManager executesManager;
private final RemoteSenderListener senderListener;
//
public RemoteRsfCaller(RsfContext rsfContext, RsfBeanContainer rsfBeanContainer, RemoteSenderListener senderListener) {
super(rsfContext, rsfBeanContainer, senderListener);
//
this.senderListener = senderListener;
RsfSettings rsfSettings = rsfContext.getSettings();
int queueSize = rsfSettings.getQueueMaxSize();
int minCorePoolSize = rsfSettings.getQueueMinPoolSize();
int maxCorePoolSize = rsfSettings.getQueueMaxPoolSize();
long keepAliveTime = rsfSettings.getQueueKeepAliveTime();
this.executesManager = new ExecutesManager(minCorePoolSize, maxCorePoolSize, queueSize, keepAliveTime, rsfContext.getClassLoader());
}
/**销毁。*/
public void shutdown() {
logger.info("rsfCaller -> shutdown.");
this.executesManager.shutdown();
}
/**
* 收到Request请求,并将该请求安排进队列,由队列安排方法调用。
* @param target 目标调用地址。
* @param info 请求消息。
*/
public void onRequest(InterAddress target, RequestInfo info) {
RsfEnvironment rsfEnv = this.getContext().getEnvironment();
String serviceUniqueName = "[" + info.getServiceGroup() + "]" + info.getServiceName() + "-" + info.getServiceVersion();
try {
invLogger.info("request({}) -> received, bindID ={}, targetMethod ={}, remoteAddress ={}.", //
info.getRequestID(), serviceUniqueName, info.getTargetMethod(), target);
//
Executor executor = executesManager.getExecute(serviceUniqueName);
executor.execute(new RemoteRsfCallerProcessing(target, this, info));//放入业务线程准备执行
ResponseInfo resp = ProtocolUtils.buildResponseStatus(rsfEnv, info.getRequestID(), ProtocolStatus.Accept, null);
this.senderListener.sendResponse(target, resp);
} catch (RejectedExecutionException e) {
invLogger.info("request({}) -> rejected request, queue is full. -> bindID ={}, targetMethod ={}, remoteAddress ={}.", //
info.getRequestID(), serviceUniqueName, info.getTargetMethod(), target);
//
String errorMessage = "(" + e.getClass().getName() + ")" + e.getMessage();
String msgLog = "rejected request, queue is full." + errorMessage;
logger.warn(msgLog, e);
ResponseInfo resp = ProtocolUtils.buildResponseStatus(rsfEnv, info.getRequestID(), ProtocolStatus.QueueFull, msgLog);
this.senderListener.sendResponse(target, resp);
}
}
//
/**获取消息监听器。*/
RemoteSenderListener getSenderListener() {
return this.senderListener;
}
}