package edu.fudan.weixin.model.processor;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.mongodb.BasicDBObject;
import edu.fudan.eservice.common.utils.CommonUtil;
import edu.fudan.eservice.common.utils.MongoUtil;
import edu.fudan.eservice.common.utils.ThreadPoolHelper;
import edu.fudan.weixin.model.message.JSONMessageBuilder;
import edu.fudan.weixin.utils.AccessTokenHelper;
import edu.fudan.weixin.utils.WeixinMessageHelper;
public abstract class LongTermProcessor implements MessageProcessor {
private static Log log = LogFactory.getLog(LongTermProcessor.class);
public class LongTermRun implements Callable<JSONMessageBuilder> {
private Map<String, Object> message;
private volatile boolean customsend=false;
public LongTermRun(Map<String, Object> message) {
this.message = message;
}
public void setCustom()
{
this.customsend=true;
}
@Override
public JSONMessageBuilder call() {
JSONMessageBuilder ret = null;
try {
ret = _process(message);
// 如果当前线程已经超时被设置了interrupt标志则表明主线程已经不再等待消息处理结束,需要使用客服接口回复用户。
if (!CommonUtil.isEmpty(ret)
&& customsend) {
Map<String,Object> msg=ret.getMessage();
if(CommonUtil.isEmpty(msg)) return ret;
msg.put("touser", message.get("FromUserName"));
log.info(CommonUtil
.postWebRequest(
"https://api.weixin.qq.com/cgi-bin/message/custom/"
+ "send?access_token="
+ AccessTokenHelper
.getInstance()
.getToken(
AccessTokenHelper.WEIXIN),
WeixinMessageHelper.msg2jsonstr(msg)
.getBytes("utf-8"),
"application/json; charset=utf-8"));
// 将回复的消息 存入MongoDB
MongoUtil.getInstance().getDB().getCollection("Messages")
.save(new BasicDBObject(msg));
}
} catch (Exception e) {
log.error(e);
}
return ret;
}
}
public abstract JSONMessageBuilder _process(Map<String, Object> msg);
public Map<String, Object> process(Map<String, Object> msg) {
LongTermRun run = new LongTermRun(msg);
Future<JSONMessageBuilder> future=ThreadPoolHelper.getInstance().getSchPool().submit(run);
try {
//等待3s,如果此时间内未返回则由客服接口返回信息
JSONMessageBuilder jb= future.get(3000L, TimeUnit.MILLISECONDS);
if(!CommonUtil.isEmpty(jb))
return jb.toXMLMessageBuilder().getMessage();
else
return null;
} catch (InterruptedException e) {
} catch (ExecutionException e) {
log.error(e);
} catch (TimeoutException e) {
run.setCustom();
}
return new HashMap<String, Object>();
}
}