
com.hc360.rsf.config.callback.CallBackHelper Maven / Gradle / Ivy
The newest version!
/**
* CallBackHelper.java 2012-5-10
* Copyright(c) 2000-2012 HC360.COM, All Rights Reserved.
*/
package com.hc360.rsf.config.callback;
import java.io.Serializable;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.hc360.rsf.config.callback.PushResult.ChannelState;
/**
* CallBackHelper
*
* @author zhaolei 2012-5-10
*/
public class CallBackHelper {
private static Logger logger = LoggerFactory.getLogger(CallBackHelper.class);
/**
* CallBack全局上下文,供服务端使用
*/
public static final Map> CALLBACK_MAP = new ConcurrentHashMap>();
/**
* 把当前的CallBack与一个key关联
*
* @param key
*/
public static void put(String key) {
if (key == null || "".equals(key.trim())) {
return;
}
final CallBackWrap callBackWrap = CallBackTool.getPushTool();
if(callBackWrap==null){
return ;
}
List list = CALLBACK_MAP.get(key);
//99%不会进入下面的IF体
if (list == null) {
synchronized (CallBackHelper.class) {
list = CALLBACK_MAP.get(key);
if (list == null) {
/**
* 不使用CopyOnWriteArrayList 会报 不能修改集合异常
*
* 由于写操作远小于读操作,使用CopyOnWriteArrayList性能上可接受
*/
list = new CopyOnWriteArrayList();
CALLBACK_MAP.put(key, list);
}
}
}
if (list.size() == 0) {
synchronized (CallBackHelper.class) {
if (list.size() == 0) {
list.add(callBackWrap);
}
}
} else {
// 检查是否已经存在了相同的对象引用
// 只有在不存相同的对象引用时,才添加,保证不重复添加
if (!list.contains(callBackWrap)) {
synchronized (CallBackHelper.class) {
if (!list.contains(callBackWrap)) {
list.add(callBackWrap);
}
}
}
}
logger.debug("关联数据推送函数,key={},关联的连接数 ={}", key, list.size());
}
/**
* 通过ip,prot找出1个 CallBack, 并通过这个CallBack推数据
*
* @param ip
* @param port
* @param data
* @return
*/
public static PushResult send(String ip, int port, Serializable data) {
if (ip == null || "".equals(ip.trim())) {
return new PushResult(false,ChannelState.INVALID_ARGUMENTS);
}
if (port <= 0) {
return new PushResult(false,ChannelState.INVALID_ARGUMENTS);
}
List allList = new ArrayList(1);
for (String kk : CALLBACK_MAP.keySet()) {
List list = CALLBACK_MAP.get(kk);
for (CallBackWrap cbw : list) {
InetSocketAddress isa = cbw.getRemoteAddress();
if (isa.getAddress().getHostAddress() != null
&& isa.getAddress().getHostAddress().equals(ip.trim())) {
if (isa.getPort() == port) {
allList.add(cbw);
break;// 最多只能找到一个
}
}
}
}
PushResult[] prs = send(allList,data);
if (prs != null && prs.length > 0) {
return prs[0];
}
return null;
}
/**
* 通过key,ip,prot找出1个 CallBack, 并通过这个CallBack推数据
* @param key
* @param ip
* @param port
* @param data
* @return
*/
public static PushResult send(String key, String ip, int port, Serializable data) {
if (ip == null || "".equals(ip.trim())) {
return new PushResult(false,ChannelState.INVALID_ARGUMENTS);
}
if (port <= 0) {
return new PushResult(false,ChannelState.INVALID_ARGUMENTS);
}
if (key == null || "".equals(key.trim())) {
return new PushResult(false,ChannelState.INVALID_ARGUMENTS);
}
List list = CALLBACK_MAP.get(key);
List allList = new ArrayList(1);
for (CallBackWrap cbw : list) {
InetSocketAddress isa = cbw.getRemoteAddress();
if (isa.getAddress().getHostAddress() != null
&& isa.getAddress().getHostAddress().equals(ip.trim())) {
if (isa.getPort() == port) {
allList.add(cbw);
break;// 最多只能找到一个
}
}
}
PushResult[] prs = send(allList,data);
if (prs != null && prs.length > 0) {
return prs[0];
}
return null;
}
/**
* 通过key找出多个 CallBack, 并通过这些CallBack推数据
*
* @param key
* @param data
* @return
*/
public static PushResult[] send(String key, Serializable data) {
if (key == null || "".equals(key.trim())) {
return new PushResult[0];
}
List list = CALLBACK_MAP.get(key);
return send(list,data);
}
private static PushResult[] send(List list,Serializable data) {
List rsList = new ArrayList();
if (list != null) {
for(int i=0;i get(String key) {
return CALLBACK_MAP.get(key);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy