java 线程销毁_spring容器启动销毁线程池

本文介绍了如何在Spring容器启动时创建并管理线程池来处理消息队列。通过配置`ProMessagePool`类实现`InitializingBean`和`DisposableBean`接口,分别在初始化时创建线程池,销毁时关闭线程池。线程池执行`ProMessageHandler`任务,该任务处理微信消息并将其放入任务池中进行后续处理。
摘要由CSDN通过智能技术生成

加载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处理序列。。。。。。。。处理结束。。。。。。。。。。。。。。。");

}

}

Spring Boot 中可以使用 ThreadPoolTaskExecutor 或者 ThreadPoolTaskScheduler 来配置自定义线程池。如果你想让线程池内的线程在执行完任务后自动关闭,你可以通过以下步骤来实现: 1. 配置 ThreadPoolTaskExecutor 或 ThreadPoolTaskScheduler 的 `ThreadPoolExecutor` 对象,提供一个适当的 `ThreadPoolExecutor` 实例作为属性值。例如,在 Application 类中或配置类(如 AppConfig、BeanDefinitionRegistryPostProcessor 等)中: ```java @Configuration public class ThreadConfig { @Bean(name = "customThreadPool") public ThreadPoolTaskExecutor customThreadPool() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); // 核心线程数 executor.setMaxPoolSize(10); // 最大线程数 executor.setQueueCapacity(50); // 容纳任务队列大小 executor.setThreadNamePrefix("CustomPool-"); // 线程名称前缀 executor.initialize(); // 初始化 executor.setExecuteAfterCompletion(true); // 设置为 true,任务完成后执行 shutdownNow() 函数 executor.setWaitForTasksToCompleteOnShutdown(true); // 关闭线程池时等待所有任务完成 executor.setTerminationEnabledPolicy(TerminatePolicy.DESTROY); // 设置策略为销毁线程 return executor; } } ``` 2. 使用这个自定义的线程池 bean,比如在需要异步处理的地方注入它,并提交任务。 当你不再需要线程池的时候(如应用停止),Spring Boot 会按照你的设置自动销毁线程池内的线程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值