`
z19910509
  • 浏览: 50833 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

 
阅读更多

上一篇日志中我们已经实现了线程池的功能,使其具有了失败重试功能,这节课我们主要实现的功能就是自定义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自定义标签的知识,如想学习的同学可深入的去研究下

 

1
0
分享到:
评论

相关推荐

    Java开发案例-springboot-60-整合DynamicTp动态线程池-源代码+文档.rar

    Java开发案例-springboot-60-整合DynamicTp动态线程池-源代码+文档.rar Java开发案例-springboot-60-整合DynamicTp动态线程池-源代码+文档.rar Java开发案例-springboot-60-整合DynamicTp动态线程池-源代码+文档.rar...

    自定义实现Java线程池1-模拟jdk线程池执行流程1

    【自定义Java线程池实现】 在Java编程中,线程池是一种高效管理线程资源的方式,可以提高系统的性能和响应速度。本篇将探讨如何模拟Java的JDK线程池执行流程,以理解其设计原理。核心知识点包括线程池的执行策略、...

    徒手实现线程池-1

    - **ScheduledThreadPoolExecutor**:这是用于定时或周期性执行任务的线程池,它继承自 ThreadPoolExecutor,增加了延迟执行和固定间隔重复执行的功能。 3. **线程池中的队列**: - **LinkedBlockingQueue**:...

    Quartz 线程池

    2. **任务分配**:当一个 Trigger 触发时,调度器会从线程池中选择一个空闲线程,分配给 Job 执行。如果所有线程都在忙碌,新的 Trigger 将被暂时挂起,等待线程池中有线程可用。 3. **任务执行**:线程执行 ...

    线程-线程池-锁-集合-Map-队列.docx

    线程是操作系统调度的基本单位,它允许在一个进程中并发地执行多个任务。在Java中,线程的创建主要有两种方式:一是继承`Thread`类,二是实现`Runnable`接口。由于Java不支持多重继承,因此使用`Runnable`接口更加...

    Java8并行流中自定义线程池操作示例

    Java8并行流中自定义线程池操作示例 Java8并行流中自定义线程池操作示例主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧。 1. 概览 Java8引入了...

    自定义实现Java线程池2-完善异常处理和去除同步1

    在Java编程中,自定义线程池是一项常见的需求,它可以帮助我们更有效地管理和控制并发执行的任务。本文将讨论如何在自定义线程池中完善异常处理和去除同步,以提高效率和程序的健壮性。 首先,从提供的代码片段来看...

    自定义实现Java线程池

    ### 自定义实现Java线程池 #### 一、概述 在深入探讨自定义Java线程池之前,我们先简要回顾一下线程池的基本概念及其重要性。线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动...

    线程池 -- 链表

    NULL 博文链接:https://shaojiashuai123456.iteye.com/blog/1415886

    JAVA并发编程实践-线程池-学习笔记

    4. **饱和策略(Rejected Execution Handler)**:当线程池和队列都满载时,新提交的任务处理策略,常见的策略有抛弃任务、抛弃最旧任务、抛出异常等。 配置线程池时,我们需要关注以下几点: - **线程池大小**:...

    JAVA线程、线程池资料----下载不扣分,回帖加1分,欢迎下载,童叟无欺

    .......................................JAVA线程、线程池资料----下载不扣分,回帖加1分,欢迎下载,童叟无欺JAVA线程、线程池资料----下载不扣分,回帖加1分,欢迎下载,童叟无欺JAVA线程、线程池资料----下载不...

    ASP.Net 多线程-IIS搭建-线程池-video

    本教程围绕"ASP.Net 多线程-IIS搭建-线程池-video"的主题,深入探讨了以下几个关键知识点: 1. **委托与多线程**:在.NET框架中,委托是一种类型安全的函数指针,可以用于传递方法作为参数。在多线程环境中,委托常...

    Java 多线程与并发(17-26)-JUC线程池- FutureTask详解.pdf

    ### Java多线程与并发(17-26)-JUC线程池-FutureTask详解 #### 一、概述 本文将围绕Java多线程与并发中的重要概念——`FutureTask`进行深入探讨。`FutureTask`是Java并发库中的一个关键组件,它实现了`...

    安卓开发框架工具类相关-工具类线程池日志自定义的控件程序崩溃捕捉处.rar

    在安卓应用开发中,工具类(Utils)、线程池(ThreadPool)、日志(Log)、自定义控件(Custom Widget)以及程序崩溃捕捉(Crash Handling)是五个非常关键的领域,它们共同构成了一个高效且健壮的应用程序的基础。...

    Spring Boot利用@Async如何实现异步调用:自定义线程池

    Spring Boot利用@Async实现异步调用:自定义线程池 Spring Boot是一个流行的Java框架,它提供了许多实用的特性来简化应用程序的开发。其中,异步调用是Spring Boot中的一个重要特性,它允许开发者将一些耗时的任务...

    Android异步更新UI-线程池-Future-Handler实例分析

    Demo-实例讲解线程池里面的UI如何刷新,处理两个开发者头疼的问题: 1. 数据经常需要读取更新,并且比较耗时,需要分步刷新UI. 2. UI界面切换后,如何停止掉子线程里面正在读取的数据而不会将旧数据刷新到新UI界面上...

    C# ——自定义线程池

    在编程领域,线程池是一种优化资源管理的技术,它允许开发者预先创建一组线程,然后在需要时重复使用这些线程,而不是每次需要时都创建新的线程。C#中的线程池是.NET Framework的一部分,提供了高效能和可管理的线程...

    自定义线程池

    减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务 2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,...

    java自定义线程池应用

    ThreadPool 线程池类 DEFAULT_POOL_SIZE 默认线程池大小 threadPool 线程队列 taskQueue 任务队列 poolSize 自定义线程池...通过构造启动该线程池,调用addTask 方法将task任务传入,线程池会自动分配线程去执行任务

    C#自定义线程池

    自定义的线程池类,自己写的一个组件,用起来还是挺方便的。我已经用在了好几个项目上。 资源中包括一个DLL文件和一个XML文件,XML文件是方法和属性的一个注释文档,将其和DLL放置同一个目录下后,引用DLL后,使用...

Global site tag (gtag.js) - Google Analytics