spring 线程池执行器DefaultManagedTaskScheduler之jndi

package com.example.spring.async.config;

import java.util.concurrent.Executors;

import javax.naming.NamingException;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mock.jndi.SimpleNamingContextBuilder;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.DefaultManagedTaskScheduler;

@Configuration
public class JndiConfig {
    @Bean
    @Qualifier("jndiTaskScheduler")
    TaskScheduler taskScheduler () {
        //正常情况下,jndi是寻找其它进程提供的服务,这里在本进程中注册只是为了测试效果
        registerJndi();
        //这个类会使用jndi从服务器上寻找服务,可能由其它jvm进程提供线程池。使用的名字为注册名:java:comp/DefaultManagedScheduledExecutorService
        return new DefaultManagedTaskScheduler();
    }

    /**
     * 使用jndi将线程池注入,下面的名字作为寻址的标识:java:comp/DefaultManagedScheduledExecutorService
     *
     */
    public void registerJndi() {
        SimpleNamingContextBuilder b = new SimpleNamingContextBuilder();
        b.bind("java:comp/DefaultManagedScheduledExecutorService",
               Executors.newScheduledThreadPool(5));
        try {
            b.activate();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }
}

使用类:

package com.example.spring.async;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.stereotype.Service;

import com.example.spring.MyLog;
/**
 * 测试通过jndi获取的线程池执行器来执行服务
 * @DESC
 * @author guchuang
 *
 */
@Service
public class JndiThreadPool {
    @Autowired
    @Qualifier("jndiTaskScheduler")
    TaskScheduler taskScheduler;

    public void runTask () {
        taskScheduler.scheduleWithFixedDelay((Runnable) () -> {
            MyLog.info("running ");
        }, 1000L);
    }
}

测试类:

package com.example.spring.async;

import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import com.example.spring.BaseDemoApplicationTest;
import com.example.spring.MyLog;
import com.example.spring.async.JndiThreadPool;

public class JndiThreadPoolTest extends BaseDemoApplicationTest {

    @Autowired
    JndiThreadPool jndi;

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
    }

    @Before
    public void setUp() throws Exception {
    }

    @Test
    public void testRunTask() {
        jndi.runTask();
        MyLog.sleep(5000);
    }

}

原文地址:https://www.cnblogs.com/gc65/p/11183848.html

时间: 2024-10-10 02:50:06

spring 线程池执行器DefaultManagedTaskScheduler之jndi的相关文章

Spring线程池开发实战

Spring线程池开发实战 作者:chszs,转载需注明. 作者博客主页:http://blog.csdn.net/chszs 本文提供了三个Spring多线程开发的例子,由浅入深,由于例子一目了然,所以并未做过多的解释.诸位一看便知. 前提条件: 1)在Eclipse创建一个Java项目,我取名为SpringThreadDemo.2)项目所需的JAR包如图所示:  下面开始. 注:项目源码已经托管到GitHub,地址:https://github.com/chszs/SpringThreadD

Spring线程池开发实战及使用spring注解

本文提供了三个Spring多线程开发的例子,由浅入深,由于例子一目了然,所以并未做过多的解释.诸位一看便知. 前提条件: 1)在Eclipse创建一个Java项目,我取名为SpringThreadDemo.2)项目所需的JAR包如图所示:  下面开始. 注:项目源码已经托管到GitHub,地址:https://github.com/chszs/SpringThreadDemo 例子1:Spring结合Java线程. 通过继承Thread创建一个简单的Java线程,然后使用@Component让S

spring线程池配置

源自:http://zjriso.iteye.com/blog/771706 1.了解 TaskExecutor接口 Spring的TaskExecutor接口等同于java.util.concurrent.Executor接口. 实际上,它存在的主要原因是为了在使用线程池的时候,将对Java 5的依赖抽象出来. 这个接口只有一个方法execute(Runnable task),它根据线程池的语义和配置,来接受一个执行任务.最初创建TaskExecutor是为了在需要时给其他Spring组件提供

spring线程池ThreadPoolTaskExecutor与阻塞队列BlockingQueue

一: ThreadPoolTaskExecutor是一个spring的线程池技术,查看代码可以看到这样一个字段: private ThreadPoolExecutor threadPoolExecutor; 可以发现,spring的  ThreadPoolTaskExecutor是使用的jdk中的java.util.concurrent.ThreadPoolExecutor进行实现, 直接看代码: @Override protected ExecutorService initializeExe

java和spring 线程池总结

1. spring 的线程池 ThreadPoolTaskExecutor @Configuration public class ThreadPoolConfig { @Bean("threadPoolTaskExecutor") public ThreadPoolTaskExecutor threadPoolTaskExecutor(){ ThreadPoolTaskExecutor threadPoolTaskExecutor=new ThreadPoolTaskExecutor

spring 线程池 的一个坑。

问题简述: 配置的队列初始化的消费者线程占满了线程池.导致其他的再使用此线程池中线程不运行.不报错,不抛异常.线程的数量仅为为线程池的配置中的最小值. <task:executor pool-size="100-150" queue-capacity="250" > 同时schema描述中写道: The size of the executor's thread pool as either a single value or a range    (e

Spring线程池的5个要素

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "/spring-beans.dtd"> <beans> <!-- 异步线程池 -->   <bean id="threadPool" class="org.spring

Spring线程池ThreadPoolTaskExecutor

一. ThreadPoolTaskExecutor 配置 <bean id ="taskExecutor"  class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" >     <!-- 线程池维护线程的最少数量 -->     <property name ="corePoolSize" value ="5"

关于spring线程池ThreadPoolTaskExecutor的作用

关于spring的ThreadPoolTaskExecutor: 他的一个应用场景就是调第三方的接口的时候,有可能第三方响应非常缓慢,这个时候最好的办法就是能有个最大的等待时间,不然自己的程序会一直卡死,阻塞,最好的办法就是使用 ThreadPoolTaskExecutor.excute(new Runable(){ })调用线程的方法来执行与第三方接口的交互 <bean id="syncTaskExecutor" class="org.springframework.