上一篇日志中我们已经实现了线程池的功能,使其具有了失败重试功能,这节课我们主要实现的功能就是自定义spring标签,达到以下的效果:

<qlt-utils:thread id="thread" retry="4" size="5"/>

这样看起来是不是比较明确而且简洁了。

要实现这个功能,我们要做下面几部工作:

1、编写schema文件,可参考http://www.w3school.com.cn/schema/index.asp,文件如下,该文件我存放的位置是,resource目录里的 /cn/qlt/common/utils/tag/qlt-utils.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.qlteacher.com/schema/qlt-utils"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:beans="http://www.springframework.org/schema/beans"
targetNamespace="http://www.qlteacher.com/schema/qlt-utils"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xsd:import namespace="http://www.springframework.org/schema/beans"/>
<xsd:element name="thread">
<xsd:complexType>
<xsd:complexContent>
<xsd:extension base="beans:identifiedType">
<!--线程池大小-->
<xsd:attribute name="size" use="optional">
<xsd:simpleType>
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="1"/><!--设置最小为1-->
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
<!--重试次数-->
<xsd:attribute name="retry"  use="optional" default="3">
<xsd:simpleType>
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0"/><!--设置最小为0-->
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>

2、 定义handler,即定义的schema命名空间的handler,我们上面定义的文件的处理器,如下:

public class QltUtilsNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
//这里注册了某个元素的处理器,前面的名字即对应的schema文件中的某个element的名字
registerBeanDefinitionParser("thread", new QltThreadPoolBeanParser());
}
}

3、定义parser,即元素的解析,对某个element的解析,该类需按照以上方式进行注册

public class QltThreadPoolBeanParser  extends AbstractSimpleBeanDefinitionParser {
/**
* 返回生成的bean的类型
*/
@Override
protected Class getBeanClass(Element element) {
return QltThreadPoolExecutor.class;
}
@Override
protected void doParse(Element element, BeanDefinitionBuilder builder) {
//这里就是对xml进行解析 并为我们的对象赋值。在spring中我们定义的各个bean,都存储为 BeanDefinition类型
String retry=element.getAttribute("retry");
builder.addPropertyValue("retry",retry);
String size=element.getAttribute("size");
if(!StringUtils.isEmpty(size)&&Integer.parseInt(size)>0){
builder.addPropertyValue("size",size);
}
}
}

4。配置schema文件的查找路径和NamespaceHandlerSupport 的查找路径。

在META-INF中新建spring.handlers和spring.schemas两个文件:
spring.handlers 内容:格式:schema的命名空间=该命名空间对应的NamespaceHandler
http\://www.qlteacher.com/schema/qlt-utils=cn.qlt.common.utils.tag.QltUtilsNamespaceHandler

spring.schemas 内容:格式:schema的名称=schema的具体路径
http\://www.qlteacher.com/schema/qlt/qlt-utils.xsd=/cn/qlt/common/utils/tag/qlt-utils.xsd

5、使用

在xml文件中要先导入我们定义的schema的命名空间,并且指定schema的位置,如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:qlt-utils="http://www.qlteacher.com/schema/qlt-utils"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.qlteacher.com/schema/qlt-utils http://www.qlteacher.com/schema/qlt/qlt-utils.xsd">
<!--上面要引入我们定义的schema-->
<context:component-scan base-package="cn.qlt"/>
<!--具体的使用-->
<qlt-utils:thread id="thread" retry="3" size="5"/>
</beans>

 

大功告成,是不是非常的简单啊,这里主要应用了spring自定义标签的知识,如想学习的同学可深入的去研究下

实现出现异常可重复执行的线程池-自定义标签(2)相关推荐

  1. java线程不执行_java线程池,阿里为什么不允许使用Executors?

    带着问题 阿里Java代码规范为什么不允许使用Executors快速创建线程池? 下面的代码输出是什么? ThreadPoolExecutor executor = new ThreadPoolExe ...

  2. 有赞一面:还有任务没执行,线程池被关闭怎么办?

    说在前面 在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如极兔.有赞.希音的面试资格,遇到一几个很重要的面试题: 还有线程池正在执行的任务和线程,如果线程池shutd ...

  3. 串行任务如何提高效率Java_具有相同属性任务串行有序执行的线程池设计

    我有一个这样的线程池的场景,相信很多人都遇到过: 1,每个用户都可以添加多个任务: 2,有很多的用户和很多的任务: 3,每个用户添加的任务必须有序串行执行,即在同一时刻不能有同时执行一个用户的两个任务 ...

  4. Aysnc的异步执行的线程池

    ProxyAsyncConfiguration.java源码: @Configuration @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public clas ...

  5. 多线程与高并发(七):详解线程池 - 自定义线程池,JDK自带线程池,ForkJoin,源码解析等

    Executor 接口关系 Callable:类似于Runnable,但是可以有返回值 Future:存储将来执行的结果.Callable被执行完之后的结果,被封装到Future里面. Future ...

  6. 线程池自定义拒绝策略

    通过实现RejectedExecutionHandler接口,自定义一个拒绝策略类,重写它的rejectedExecution()方法: public class CustomRejectionHan ...

  7. Android开发——Android中常见的4种线程池(保证你能看懂并理解)

    0.前言 转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52415337 使用线程池可以给我们带来很多好处,首先通过线程池中线程的重用 ...

  8. Android 线程池的使用

    线程池优点 提到线程池就必须先说一下线程池的优点,线程池的优点可以概括为以下四点: * 重用线程池中的线程,避免因为线程的创建和销毁所带来的性能开销: * 线程池旨在线程的复用,就避免了创建线程和销毁 ...

  9. Android中常见的4种线程池的理解(转)

    转:https://blog.csdn.net/l540675759/article/details/62230562 转:https://blog.csdn.net/seu_calvin/artic ...

  10. 线程池的执行原则及配置参数详解

    池是一种非常优秀的设计思想,通过建立池可以有效的利用系统资源,节约系统性能.Java 中的线程池就是一种非常好的实现,从 JDK 1.5 开始 Java 提供了一个线程工厂 Executors 用来生 ...

最新文章

  1. 元宇宙开发:你在虚幻引擎中的第一个虚拟现实游戏
  2. 微服务生态与 Spring Cloud Alibaba
  3. image控件显示图片_Unity之Image amp; Raw Image
  4. 当心findFirst()和findAny()
  5. 即插即用+任意blur的超分辨率重建——DPSR
  6. redis主从搭建和分片集群搭建
  7. Opencv 图像入门一之基本操作
  8. mui 框架:a标签无法跳转 - 解决篇
  9. 简单51单片机c语言编程流水灯,51单片机如何实现流水灯?51单片机实现流水灯的三种方法详细分析...
  10. Java多线程-线程的生命周期
  11. 《UnityAPI.MovieTexture影片纹理》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+MovieTexture+audioClip+立钻哥哥++OK++)
  12. C语言及程序设计概述
  13. 浏览器的使用方法,如何添加书签|常用网站|扩展程序?
  14. 热力学与统计物理学笔记
  15. 华为手机一直android,华为手机内存不够用?这5个文件夹常清理,可以腾出近10个G内存...
  16. JEECMS V8.1常用标签举例
  17. Visual Studio的“解决方案管理器“乱跑的解决方法,把“解决方案管理器“调到左边
  18. 三维激光扫描仪点云数据处理与建模
  19. Android之雪花飘落效果
  20. umi.js的简单理解

热门文章

  1. 移动交互设计:提示语设计总结
  2. OSChina 周三乱弹 —— 你们的女神宣布结婚了
  3. 【嵌入式系统设计师备考(1)】嵌入式系统基础知识
  4. iMovie 裁剪视频
  5. 基于MATLAB的单相电压型逆变电路,基于MatlabSimulink_的电压型单相全桥逆变电路.doc...
  6. simulink 全桥逆变无控整流DC-DC电路
  7. JAVA中apply方法的原理_关于学习java函数式接口Function中的apply方法的一些感悟
  8. 【Python】10行代码获取海贼王最新目录
  9. 稳压二极管工作原理与使用
  10. Office文件转PDF的解决方案