当前位置: 首页 > news >正文

nofollow外链对于网站有提升吗wordpress和域名

nofollow外链对于网站有提升吗,wordpress和域名,济南做seo外包,如何做网络推广公司Spring Boot Async 注解深度指南 一、核心使用要点 启用异步支持 必须在启动类或配置类添加 EnableAsync#xff0c;否则异步不生效。 SpringBootApplication EnableAsync public class Application { ... }线程池配置 默认问题#xff1a;Spring 默认使用 SimpleAsyncTaskEx…Spring Boot Async 注解深度指南 一、核心使用要点 启用异步支持 必须在启动类或配置类添加 EnableAsync否则异步不生效。 SpringBootApplication EnableAsync public class Application { ... }线程池配置 默认问题Spring 默认使用 SimpleAsyncTaskExecutor每次新建线程生产环境需自定义线程池。推荐配置通过 ThreadPoolTaskExecutor 定义核心参数核心线程数、队列容量等Configuration EnableAsync public class AsyncConfig implements AsyncConfigurer {Overridepublic Executor getAsyncExecutor() {ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(100);executor.setThreadNamePrefix(Async-);executor.initialize(); // 必须初始化return executor;} }方法调用限制 同类调用失效禁止在同一个类中直接调用 Async 方法如 this.asyncMethod()需通过代理对象调用。解决方案将异步方法拆分到独立类中通过依赖注入调用Service public class ServiceA {Autowiredprivate ServiceB serviceB; // 异步方法在 ServiceB 中定义public void callAsync() {serviceB.asyncMethod(); // 通过代理对象调用} }二、常见失效场景及解决方案 方法修饰符错误 限制Async 仅对 public 方法生效private/static/final 方法无效。 事务管理冲突 问题异步方法默认不继承事务上下文Transactional 可能失效。解决方案 在异步方法内部显式管理事务。使用分布式事务框架如 Seata。 异常处理缺失 默认行为异步方法抛出的异常不会传播到调用线程需通过 Future 或 AsyncUncaughtExceptionHandler 捕获。全局异常处理配置Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {return (ex, method, params) - log.error(异步方法 {} 异常: {}, method.getName(), ex.getMessage()); }三、进阶注意事项 线程上下文传递 问题异步线程默认不继承主线程的上下文如 MDC 日志跟踪、SecurityContext。解决方案通过 TaskDecorator 装饰任务手动传递上下文executor.setTaskDecorator(task - {MapString, String context MDC.getCopyOfContextMap(); // 获取主线程上下文return () - {MDC.setContextMap(context); // 设置到异步线程task.run();MDC.clear();}; });与定时任务结合 风险在 Scheduled 或 XxlJob 标注的方法上直接使用 Async可能导致调度平台无法感知任务结果。建议仅在任务内部耗时操作中使用异步而非整个方法。 资源释放 线程池关闭Spring 管理的 ThreadPoolTaskExecutor 会在应用关闭时自动调用 shutdown()但需设置等待任务完成executor.setWaitForTasksToCompleteOnShutdown(true); // 等待任务完成 executor.setAwaitTerminationSeconds(60); // 最长等待时间四、实际案例解析 案例 1基础异步调用无返回值 场景执行耗时任务如日志记录、消息推送时不阻塞主线程。 代码实现 Service public class NotificationService {Asyncpublic void sendEmail(String content) {System.out.println(异步发送邮件中线程 Thread.currentThread().getName());// 模拟耗时操作try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); }System.out.println(邮件发送完成);} }RestController public class UserController {Autowiredprivate NotificationService notificationService;PostMapping(/register)public String registerUser() {notificationService.sendEmail(欢迎注册); // 异步执行return 注册成功邮件发送中...; // 主线程立即返回} }关键点 方法需标记为 public且类需被 Spring 管理如 Service主线程调用后立即返回任务由 SimpleAsyncTaskExecutor 默认线程池执行。 案例 2带返回值的异步任务 场景异步执行任务并获取结果如批量数据处理。 代码实现 Service public class DataProcessService {Asyncpublic CompletableFutureListString processData(ListString data) {System.out.println(异步处理数据线程 Thread.currentThread().getName());// 模拟耗时处理ListString result data.stream().map(String::toUpperCase).collect(Collectors.toList());return CompletableFuture.completedFuture(result);} }RestController public class DataController {Autowiredprivate DataProcessService dataProcessService;GetMapping(/process)public CompletableFutureString process() {return dataProcessService.processData(Arrays.asList(a, b, c)).thenApply(result - 处理结果 result);} }关键点 返回值需用 CompletableFuture 或 Future 包装调用方通过 thenApply 或 get() 获取结果注意阻塞风险。 案例 3自定义线程池配置 场景优化线程资源避免默认线程池的性能问题。 配置类 注意这里 使用 Bean(‘线程池名称’) 注解 或 实现 AsyncConfigurer 可任选其一 也可都实现 实现AsyncConfigurer 代表将 将spring默认线程池替换为 当前线程池默认线程池存在问题“Spring 默认使用 SimpleAsyncTaskExecutor每次新建线程生产环境需自定义线程池。”使用 Bean() 则需要给当前线程池的指定bean名称在使用 Async(‘线程池名称’)注解时就需要指定线程池的名称了当然这个案例中这里不是必须的当Async不指定线程池名称时则使用的时是默认线程池在这个案例中默认的线程池也就是 ‘customExecutor’。 Configuration EnableAsync public class AsyncConfig implements AsyncConfigurer {Bean(customExecutor)public Executor taskExecutor() {ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(100);executor.setThreadNamePrefix(Custom-Async-);executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.initialize();return executor;} }使用示例 Service public class ReportService {Async(customExecutor) // 指定线程池public void generateReport() {System.out.println(生成报表中线程 Thread.currentThread().getName());} }关键点 通过 Async(beanName) 指定线程池拒绝策略推荐 CallerRunsPolicy 避免任务丢失。 案例 4异步事务管理 场景异步方法中操作数据库并保证事务一致性。 代码实现 Service public class OrderService {Autowiredprivate OrderRepository orderRepository;AsyncTransactional(propagation Propagation.REQUIRES_NEW)public void asyncCreateOrder(Order order) {orderRepository.save(order); // 事务独立提交if (order.getAmount() 0) {throw new RuntimeException(金额异常); // 触发回滚}} }关键点 异步方法需添加 Transactional 并指定传播行为如 REQUIRES_NEW主线程事务与异步线程事务相互隔离。 案例 5全局异常处理 场景捕获异步方法中的未处理异常。 1默认行为与风险 1. 无返回值方法异常静默丢弃 例如 Async public void asyncTask() {throw new RuntimeException(异步异常); // 无日志、无处理 }异常会被 Spring 默认的 SimpleAsyncUncaughtExceptionHandler 处理仅打印 ERROR 级别日志但无具体堆栈信息。 2. 调试困难 异步线程的异常不会传播到调用线程若未记录日志可能无法发现潜在问题。 2最佳实践 1. 无返回值处理异常: 通过自定义异常处理器统一记录日志或发送告警 Configuration EnableAsync public class AsyncConfig implements AsyncConfigurer {Overridepublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {return (ex, method, params) - {// 记录日志或发送告警log.error(异步方法 {} 异常参数: {}, method.getName(), Arrays.toString(params), ex);// 发送邮件/企业微信通知可选};} }使用示例: Service public class NotificationService {Asyncpublic void sendEmail() {throw new RuntimeException(邮件发送失败);} }触发场景调用 sendEmail() 时异常会被 AsyncUncaughtExceptionHandler 捕获并记录日志。 2. 结合返回值处理异常: 1. 通过 Future.get() 捕获异常 使用 CompletableFuture 包装返回值调用 get() 时显式捕获异常。 Service public class DataService {Asyncpublic CompletableFutureString processData() {return CompletableFuture.supplyAsync(() - {if (error) throw new RuntimeException(数据处理异常);return 处理结果;});} }RestController public class DataController {Autowiredprivate DataService dataService;GetMapping(/process)public String process() {try {return dataService.processData().get();} catch (InterruptedException | ExecutionException e) {return 处理失败: e.getCause().getMessage();}} }2. 通过 exceptionally() 链式处理 利用 CompletableFuture 的链式异常处理 Async public CompletableFutureString asyncTask() {return CompletableFuture.supplyAsync(() - {throw new RuntimeException(任务失败);}).exceptionally(ex - {log.error(任务异常, ex);return 默认值;}); }注意事项 阻塞风险Future.get() 会阻塞主线程需结合超时机制如 get(5, TimeUnit.SECONDS)。线程池隔离建议为耗时任务配置独立线程池避免核心业务线程池被阻塞。 总结与最佳实践 场景策略适用场景无返回值 无需关注结果必须实现 getAsyncUncaughtExceptionHandler日志记录、消息推送等非关键任务无返回值 需关注结果重构为有返回值方法或实现异常处理器数据同步、状态更新等关键任务有返回值优先通过 Future 或 CompletableFuture 处理异常批量处理、复杂计算等需返回结果的任务 最佳实践 混合使用对关键任务使用 CompletableFuture 返回值非关键任务用 void 全局处理器。监控告警在 AsyncUncaughtExceptionHandler 中集成 Sentry 或 Prometheus 监控。事务拆分异步方法涉及数据库操作时确保事务边界清晰如拆分到独立服务。线程池隔离为耗时任务配置独立线程池避免核心业务线程池被阻塞。 **案例 6定时任务异步化 场景XXL-JOB 任务异步执行避免阻塞调度线程。代码示例Component XxlJob(generateTask) public class TaskJob {Asyncpublic void generateTask(String param) {// 异步执行耗时任务} }风险调度平台无法获取执行结果需通过日志或回调机制跟踪状态。 五、性能优化与监控 参数调优 核心公式 核心线程数 ≈ CPU 核心数 × 2队列容量根据任务平均耗时调整避免 OOM。 拒绝策略选择 生产推荐使用 CallerRunsPolicy由调用线程执行任务避免任务丢失executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());监控指标 关键指标活跃线程数 (getActiveCount())、队列大小 (getQueue().size())、已完成任务数 (getCompletedTaskCount())。 总结与最佳实践 场景技术方案简单异步任务无返回值方法 默认线程池结果依赖任务CompletableFuture 包装返回值高并发优化自定义 ThreadPoolTaskExecutor数据库事务Transactional 独立传播行为异常处理AsyncUncaughtExceptionHandler 注意事项 避免同类内调用 Async 方法需通过代理对象调用监控线程池状态活跃线程数、队列堆积防止资源耗尽异步方法中谨慎使用 ThreadLocal需通过 TaskDecorator 传递上下文。
http://www.hkea.cn/news/14257352/

相关文章:

  • 知名开发网站公司简介成全视频免费观看在线看小说原著叫什么
  • 便宜营销型网站建设优化建站静态网页设计报告
  • 网站备案主体修改免费婚恋网站设计
  • 园区网站建设需求调研报告做网站需要买
  • 网站建设记在哪个科目做理财网站
  • 什么网站可以做认证石家庄网址服务
  • 网站建设项公司网站名词解释
  • 正能量软件不良网站直播线上代运营
  • 免费手机网页网站iis怎么做ip网站吗
  • 卡地亚手表官方网站互联网站
  • 江苏省常州建设高等职业技术学校网站有必要对网站进行seo吗
  • 建设部网站打不开科技网站 网站建设
  • 积分商城网站建设兴化网站制作
  • 怎么利用360域名做网站建设网站视频素材
  • 网站底部 设计装修找什么平台比较好
  • 八里河网站建设项目建设可行性北京网站公司
  • 玉溪定制网站建设手机论坛网站模板
  • 中国建设银行 官方网站4399电脑版网页版入口
  • 网站建设维护合同范本wordpress菜单背景
  • 现在做网站怎么样wordpress seo 链接
  • 网站下面 备案网络推广代运营公司
  • 网站备案关闭网站怎么做app和网站购物
  • 桂林网站建设内容提高百度快速排名
  • 网站建设源码安装教程辽宁建设执业继续教育协会网站
  • 再高权重网站加自己的链接会容易被收录吗做网站的基本步骤
  • 怎么用小皮创建网站wordpress怎么设置语言
  • 网站弹窗页面是谁做的什么样的公司需要做网站
  • 万网有网站建设吗做网站程序员都要先做维护么
  • 做网站的市场前景先做网站先备案
  • 多个端口网站如何做域名重定向手机系统下载