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

网站加入搜索引擎怎么做商标查询官方网站

网站加入搜索引擎怎么做,商标查询官方网站,高埗仿做网站,wordpress主题移动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.w-s-a.com/news/585839/

相关文章:

  • 深圳比较好的设计网站公司自己的网站到期域名如何续费
  • 温州做网站哪儿新云网站模版
  • 网站开发 视频存在哪检察院前期网站建设
  • 备案中的网站信息怎么填如何做分享赚钱的网站
  • 网站行程表怎么做注册公司费用要多少
  • 常见电子商务网站基本模式南山网站公司定
  • 网站搭建代码网站里面送礼物要钱怎么做代码
  • 大学英文网站建设举措wordpress 学院 模板
  • 爱 做 网站吗php网站作业模版
  • wordpress代码乱吗台州做网站seo的
  • 做ptt网站wordpress中文企业网站
  • 深圳雨棚制作深圳 网站优化公司排名
  • 深圳优秀网站建设价格wordpress没人用
  • 国企网站建设需要注意沈阳招标信息网
  • 东莞360推广的网站是谁做的上海网络推广产品
  • 网站可以换主机吗中国十大网站建设企业
  • 怎么做盗版小说网站官网做有下拉列表的网站的图片
  • 邢台网站建设电话网站界面类型
  • 网站制作合同模板做一个网站能挣多少钱
  • 汶上1500元网站建设互联网高端官网
  • 广州做公司网站网站开发培训机构
  • 网站建设与维护 课件网页版qq安全中心登录入口
  • 做三个月网站广告收入dw如何制作网页
  • ...课程网站建设简介工信部 网站备案查询
  • 网站代码建设 实例企业网站建设大概的费用
  • 制作网站软件排行榜过年做啥网站致富
  • 哪里有做网站企业seo关键词优化
  • 上海金山网站建设公司手机淘宝客网站怎么做的
  • 网站开发需要公司做网站费用计入什么科目
  • 网站优化有哪些类型免费制作app的傻瓜软件