package com.hqyg.disjob.rpc.support;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import com.hqyg.disjob.common.thread.ExecutorFactory;
import com.hqyg.disjob.common.thread.ThreadPoolBuilder;
import com.hqyg.disjob.common.util.LoggerUtil;
import com.hqyg.disjob.monitor.util.MonitorSpringWorkFactory;
import com.hqyg.disjob.quence.BaseActionQueue;
import com.hqyg.disjob.quence.Executor;
import com.hqyg.disjob.rpc.action.ExecuteStateAction;
import com.hqyg.disjob.rpc.codec.RpcRequest;
import com.hqyg.disjob.rpc.codec.RpcResponse;
import com.hqyg.disjob.rpc.utils.ScheduleResponse;
@Service("storeRepThreadPoolService")
public class StoreRepThreadPoolService {
private ConcurrentHashMap<String, BaseActionQueue> jobAction = new ConcurrentHashMap<String, BaseActionQueue>();
private ConcurrentHashMap<String, Condition> jobConditions = new ConcurrentHashMap<String, Condition>();
private ConcurrentHashMap<String, RpcRequest> rpcRequestMap = new ConcurrentHashMap<String, RpcRequest>();
private ReentrantLock lock = new ReentrantLock();
@PostConstruct
protected void start() {
/**
* 创建job 往数据库里插入一条数据和返回的数据存数据时使用异步处理
*/
ExecutorFactory.offerExecutor(new Executor(ThreadPoolBuilder.getInstance().builderExcutorThreadPool()));
/**
* rpc 返回时,也是放到一个线程池去处理
*/
ExecutorFactory.offerExecuteStateExecutor(new Executor(ThreadPoolBuilder.getInstance().builderExeStateExecutorThreadPool()));
}
/**
* 记录每一个request id 所对应的key(group+job name).方便rpc 返回消息时,通过request id 找到自己的job queue
* @param response
* @param rpcClient
* @param request
*/
public void initStateQueue(ScheduleResponse response){
String key = response.getGroupName()+"_"+response.getJobName();
Condition condition =null ;
synchronized (this) {
condition = jobConditions.get(key);
if(condition == null){
condition = lock.newCondition();
jobConditions.put(key, condition);
}
}
BaseActionQueue queue = jobAction.get(key);
synchronized (condition) {
queue = jobAction.get(key);
if( queue == null){
queue = new BaseActionQueue(ExecutorFactory.getExecuteStateExecutor());
jobAction.put(key, queue);
}
}
MonitorSpringWorkFactory.getJobService().setRequestIdKey(response.getRequestId(), key);
}
/**
* job 执行的服务端返回的消息进行处理
* @param rep
*/
public void submit(RpcResponse rep){
String key = MonitorSpringWorkFactory.getJobService().getRequestIdKey(rep.getRequestId());//compose of group and job name
if(StringUtils.isNoneEmpty(key)){
jobAction.get(key).enqueue(new ExecuteStateAction(rep));
}else{
LoggerUtil.warn(rep.getRequestId()+" 所对应的 key: is null.不能被更新进度时间。");
}
}
@PreDestroy
protected void shutdown(){
ExecutorFactory.getExecutor().stop();
ExecutorFactory.getExecuteStateExecutor().stop();
}
public RpcRequest getRpcRequest(String requestId) {
return rpcRequestMap.get(requestId);
}
public void removeRpcRequest(String requestId) {
rpcRequestMap.remove(requestId);
}
public void putRpcRequest(RpcRequest rpcRequest){
if(rpcRequest == null || rpcRequest.getData() == null){
return ;
}
LoggerUtil.debug("put rpcrequest ="+rpcRequest.toString());
rpcRequestMap.put(rpcRequest.getData().getRequestId(), rpcRequest);
}
}