加载spring容器时启动线程池处理消息队列
1.[代码][Java]代码
1. 在spring.xml配置管理线程池类:
2.ProMessagePool类需要实现(implements InitializingBean, DisposableBean),在ProMessagePool类中通过addTask()方法中threadPool.execute(需要执行的任务)处理线程任务:
2.[文件] ProMessagePool.java ~ 2KB 下载(0)
package com.channelsoft.cchat.dms.channel.weixinModel.util;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import com.channelsoft.cchat.dms.channel.weixinModel.po.WeixinXmlPo;
public class ProMessagePool implements InitializingBean, DisposableBean{
private static final Logger logger = LoggerFactory.getLogger(ProMessagePool.class);
// 线程池默认值
private int threadSize = 20;
// 线程池
ExecutorService threadPool;
public void addTask(WeixinXmlPo weixinxmlpo) {
threadPool.execute(new ProMessageHandler(weixinxmlpo));
}
@Override
public void afterPropertiesSet() throws Exception {
//初始化
threadPool = Executors.newFixedThreadPool(threadSize);
}
@Override
public void destroy() throws Exception {
//销毁
if (threadPool != null) {
threadPool.shutdown();
try {
// Wait a while for existing tasks to terminate
if (!threadPool.awaitTermination(60, TimeUnit.SECONDS)) {
threadPool.shutdownNow(); // Cancel currently executing tasks
// Wait a while for tasks to respond to being cancelled
if (!threadPool.awaitTermination(60, TimeUnit.SECONDS))
logger.error("处理微信消息线程池没有正常停止............");
}
} catch (InterruptedException ie) {
// (Re-)Cancel if current thread also interrupted
threadPool.shutdownNow();
// Preserve interrupt status
Thread.currentThread().interrupt();
}
logger.info("处理微信消息线程池正常停止....");
}
}
public int getThreadSize() {
return threadSize;
}
public void setThreadSize(int threadSize) {
this.threadSize = threadSize;
}
}
3.[代码][Java]代码
3.调用线程池处理消息队列:
//将消息处理任务放进线程池
ProMessagePool taskHandler = null;
try {
taskHandler = (ProMessagePool) BeanFactoryUtil.getBean("promessagepool");
//把消息对象weixinxmlpo丢入线程池
taskHandler.addTask(weixinxmlpo);
} catch (Exception e) {
logger.error(e.toString());
}
4.[代码][Java]代码
4.处理线程消息:
5.[文件] ProMessageHandler.java ~ 4KB 下载(0)
package com.channelsoft.cchat.dms.channel.weixinModel.util;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.channelsoft.cchat.dms.channel.weixinModel.po.MediaRetPo;
import com.channelsoft.cchat.dms.channel.weixinModel.po.WeixinXmlPo;
import com.channelsoft.cchat.dms.po.Message;
import com.channelsoft.cchat.dms.po.MessageBody;
import com.channelsoft.cchat.dms.task.SessionTask;
import com.channelsoft.cchat.dms.task.TaskPool;
import com.channelsoft.cchat.dms.task.SessionTask.SessionTaskType;
import com.channelsoft.cchat.dms.utils.BeanFactoryUtil;
public class ProMessageHandler implements Runnable {
protected Logger logger = LoggerFactory.getLogger(this.getClass());
private WeixinXmlPo task;
public ProMessageHandler(WeixinXmlPo task) {
this.task = task;
}
/**
* @Description: 处理微信消息业务,封装成po发送座席端
* @author yaodq
*/
@Override
public void run() {
logger.info("微信消息进入ProMessageHandler处理序列。。。。。。。。处理开始。。。。。。。。。。。。。。。");
MessageBody messagebody = new MessageBody();
messagebody.setType(task.getMsgType());
if(task.getMsgType().equals(MessageBody.TYPE_TEXT)){
messagebody.setContent(task.getContent());
}else if(task.getMsgType().equals(MessageBody.TYPE_IMAGE)){
try {
MediaRetPo mediaretpo = WeixinUtil.getMedia(task.getMediaid(), task.getEndid());
JSONObject demoJson = new JSONObject(mediaretpo.getFasturl());
if(demoJson.has("originalImagePath")&&demoJson.has("zoomImageUrl")){
String o_url = demoJson.getString("originalImagePath");//原图url
String z_url = demoJson.getString("zoomImageUrl");//压缩图url
messagebody.setContent(o_url);
messagebody.setCompressPicUrl(z_url);
}else{
logger.error("图片上传获取原图URL或压缩图URL失败。。。。。。。。。。。。。。。。。。。。。。");
}
} catch (Exception e) {
logger.error("图片消息处理失败。。。。。。。。。。。。。。。。。");
e.printStackTrace();
}
}else if(task.getMsgType().equals(MessageBody.TYPE_VOICE)){
try {
MediaRetPo mediaretpo = WeixinUtil.getMedia(task.getMediaid(), task.getEndid());
JSONObject demoJson = new JSONObject(mediaretpo.getFasturl());
if(demoJson.has("originalFilePath")){
String o_url = demoJson.getString("originalFilePath");//原文件url
messagebody.setContent(o_url);
}else{
logger.error("语音上传获取上传后URL失败。。。。。。。。。。。。。。。。。。。。。。");
}
} catch (Exception e) {
logger.error("语音消息处理失败。。。。。。。。。。。。。。。。。");
e.printStackTrace();
}
}
Message message = new Message();
message.setCustomId(task.getFromUserName());
message.setEntId(task.getEndid());
message.setChannel(Message.CHANNEL_WEIXIN);
message.setBody(messagebody);
//把消息放入线程池
SessionTask task = new SessionTask(SessionTaskType.CUSTOM_COMMON_MESSAGE, message);
//Msg4WeixinTask msg4weixintask = new Msg4WeixinTask();
//msg4weixintask.setMessage(message);
TaskPool taskHandler = null;
try {
taskHandler = (TaskPool) BeanFactoryUtil.getBean("taskPool");
taskHandler.addTask(task);
} catch (Exception e) {
logger.error(e.toString());
}
logger.info("微信消息进入ProMessageHandler处理序列。。。。。。。。处理结束。。。。。。。。。。。。。。。");
}
}