spring 集成common-pool2

SpringBoot2.2+commons-pool2实现多Ftp连接池完整项目,开箱即用,经过长期生产使用稳定可靠 阅读详情

Common-pool2

The Apache Commons Pool open source software library provides an object-pooling API and a number of object pool implementations. Version 2 of Apache Commons Pool contains a completely re-written pooling implementation compared to the 1.x series. In addition to performance and scalability improvements, version 2 includes robust instance tracking and pool monitoring.

common-pool2 是一个开源的对象池
在高并发情况下避免了重 对象新建的操作。
典型如 httpclient
phantomjs

spring 引入第三方jar 包

spring context 注册第三方jar 包中的对象 一般使用

@Configuration 和@Bean 注解组合

/**
 * @author hamish-wu
 */
@Configuration
public class CommonPoolConfig {

    @Bean
    public static GenericObjectPoolConfig genericObjectPoolConfig() {
        GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
      /*  genericObjectPoolConfig.setJmxEnabled(false);*/
        return genericObjectPoolConfig;
    }

    @Bean(name = "mypool")
    public GenericObjectPool<HttpClient> getHttpClientPool() {
        return new GenericObjectPool<>(pooledHttpClientFactory, genericObjectPoolConfig);
    }


}

使用@Bean 注解修饰的方法可以使用 static 修饰,影响spring context 注册顺序

static 修饰的方法会被优先注册

@Bean注解可以自定义bean name

使用的时候 建议搭配 @Resource 注解

另外@bean 注册 可以使用@Import 注解替换,但是@import 注解
不如@bean 注解灵活

spring 集成 common-pool2

2.1 启动类:

@SpringBootApplication(scanBasePackages = {"com.fancv.*", "com.google.common.*"}, exclude = {DataSourceAutoConfiguration.class})
@ServletComponentScan(basePackages = {"com.fancv.filter", "com.fancv.listener"})
@EnableSwagger2
@MapperScan("com.fancv.dao")
@Import({MyConfig.class, GuavaConfig.class, IntMath.class, PooledHttpClientFactory.class})
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class SpringBootApp {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootApp.class, args);
    }
}

2.2 配置类

import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.apache.http.client.HttpClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;

/**
 * @author hamish-wu
 */
@Configuration
public class CommonPoolConfig {

    /**
     * Pool  一般配置信息
     */
    @Resource
    GenericObjectPoolConfig genericObjectPoolConfig;

    /**
     *
     */
    @Resource
    PooledHttpClientFactory pooledHttpClientFactory;

    @Bean
    public static GenericObjectPoolConfig genericObjectPoolConfig() {
        GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
      /*  genericObjectPoolConfig.setJmxEnabled(false);*/
        return genericObjectPoolConfig;
    }

    @Bean(name = "mypool")
    public GenericObjectPool<HttpClient> getHttpClientPool() {
        return new GenericObjectPool<>(pooledHttpClientFactory, genericObjectPoolConfig);
    }


}

PooledObjectFactory实现类

import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;


public class PooledHttpClientFactory implements PooledObjectFactory<HttpClient> {

    @Override
    public PooledObject<HttpClient> makeObject() throws Exception {
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        return new DefaultPooledObject<>(httpClient);
    }

    @Override
    public void destroyObject(PooledObject<HttpClient> pooledObject) throws Exception {
        //不处理
    }

    @Override
    public boolean validateObject(PooledObject<HttpClient> pooledObject) {
        return true;
    }

    @Override
    public void activateObject(PooledObject<HttpClient> pooledObject) throws Exception {
        //不处理
    }

    @Override
    public void passivateObject(PooledObject<HttpClient> pooledObject) throws Exception {
        //不处理
    }
}

service 层使用

import com.google.common.math.IntMath;
import com.google.common.util.concurrent.RateLimiter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.client.protocol.HttpClientContext;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * guava 单节点限流
 */
@Service
@Slf4j
public class AccessLimitService {


    @Resource(name = "myRate")
    RateLimiter hello;


    @Resource
    IntMath intMath;

    @Resource(name = "mypool")
    GenericObjectPool<HttpClient> httpClientPool;

    /**
     * 尝试获取令牌
     */
    public Boolean tryAcquire() {

        IntMath.isPowerOfTwo(2);

        return hello.tryAcquire();
    }


    /***
     * 获取HTTPClient
     */

    public String getPage() {

        try {
            HttpClient client = httpClientPool.borrowObject();

            try {
                RequestBuilder requestBuilder = RequestBuilder.get("https://www.oschina.net");
                requestBuilder.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36");
                HttpUriRequest httpUriRequest = requestBuilder.build();
                HttpClientContext httpClientContext = new HttpClientContext();

                HttpResponse httpResponse = client.execute(httpUriRequest, httpClientContext);

                byte[] contentBytes = IOUtils.toByteArray(httpResponse.getEntity().getContent());
                System.out.println("获取的网页源码:" + new String(contentBytes, "utf-8"));
                log.info("getFactoryType:{}", httpClientPool.getFactoryType());
                httpClientPool.returnObject(client);
            } catch (Exception ex) {
                httpClientPool.invalidateObject(client);
                ex.printStackTrace();
            }
        } catch (final Exception e) {
            log.error("获取HttpClient 报错", e);
        }

        return "hello";
    }
}

遇到问题

报错信息

org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [GenericObjectPool [maxTotal=8, blockWhenExhausted=true, maxWaitMillis=-1, lifo=true, fairness=false, testOnCreate=false, testOnBorrow=false, testOnReturn=false, testWhileIdle=false, timeBetweenEvictionRunsMillis=-1, numTestsPerEvictionRun=3, minEvictableIdleTimeMillis=1800000, softMinEvictableIdleTimeMillis=-1, evictionPolicy=org.apache.commons.pool2.impl.DefaultEvictionPolicy@4a03c4bc, closeLock=java.lang.Object@3d0c88f4, closed=false, evictionLock=java.lang.Object@5aad4194, evictor=null, evictionIterator=null, factoryClassLoader=java.lang.ref.WeakReference@50a1c2f3, oname=org.apache.commons.pool2:type=GenericObjectPool,name=pool, creationStackTrace=java.lang.Exception
	at org.apache.commons.pool2.impl.BaseGenericObjectPool.<init>(BaseGenericObjectPool.java:147)
	at org.apache.commons.pool2.impl.GenericObjectPool.<init>(GenericObjectPool.java:111)
	at com.fancv.config.CommonPoolConfig.getHttpClientPool(CommonPoolConfig.java:38)
	at com.fancv.config.CommonPoolConfig$$EnhancerBySpringCGLIB$$9d954d11.CGLIB$getHttpClientPool$0(<generated>)
	at com.fancv.config.CommonPoolConfig$$EnhancerBySpringCGLIB$$9d954d11$$FastClassBySpringCGLIB$$f8408bf0.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
	at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363)
	at com.fancv.config.CommonPoolConfig$$EnhancerBySpringCGLIB$$9d954d11.getHttpClientPool(<generated>)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:651)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:484)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeanByName(AbstractAutowireCapableBeanFactory.java:454)
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:543)
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:513)
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:653)
	at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:224)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:116)
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessProperties(CommonAnnotationBeanPostProcessor.java:334)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1422)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeanByName(AbstractAutowireCapableBeanFactory.java:454)
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:543)
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:513)
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:653)
	at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:224)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:116)
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessProperties(CommonAnnotationBeanPostProcessor.java:334)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1422)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:879)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)
	at com.fancv.SpringBootApp.main(SpringBootApp.java:25)
, borrowedCount=0, returnedCount=0, createdCount=0, destroyedCount=0, destroyedByEvictorCount=0, destroyedByBorrowValidationCount=0, activeTimes=StatsStore [values=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], size=100, index=0], idleTimes=StatsStore [values=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], size=100, index=0], waitTimes=StatsStore [values=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], size=100, index=0], maxBorrowWaitTimeMillis=0, swallowedExceptionListener=null, factoryType=null, maxIdle=8, minIdle=0, factory=com.fancv.config.PooledHttpClientFactory@453ca7f, allObjects={}, createCount=0, idleObjects=[], abandonedConfig=null]] with key 'mypool'; nested exception is javax.management.InstanceAlreadyExistsException: MXBean already registered with name org.apache.commons.pool2:type=GenericObjectPool,name=pool
	at org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstance(MBeanExporter.java:626) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.jmx.export.MBeanExporter.lambda$registerBeans$2(MBeanExporter.java:552) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at java.base/java.util.HashMap.forEach(HashMap.java:1336) ~[na:na]
	at org.springframework.jmx.export.MBeanExporter.registerBeans(MBeanExporter.java:552) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.jmx.export.MBeanExporter.afterSingletonsInstantiated(MBeanExporter.java:435) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:896) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]
	at com.fancv.SpringBootApp.main(SpringBootApp.java:25) ~[classes/:na]
Caused by: javax.management.InstanceAlreadyExistsException: MXBean already registered with name org.apache.commons.pool2:type=GenericObjectPool,name=pool
	at java.management/com.sun.jmx.mbeanserver.MXBeanLookup.addReference(MXBeanLookup.java:151) ~[na:na]
	at java.management/com.sun.jmx.mbeanserver.MXBeanSupport.register(MXBeanSupport.java:160) ~[na:na]
	at java.management/com.sun.jmx.mbeanserver.MBeanSupport.preRegister2(MBeanSupport.java:173) ~[na:na]
	at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamicMBean(DefaultMBeanServerInterceptor.java:919) ~[na:na]
	at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:890) ~[na:na]
	at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:320) ~[na:na]
	at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522) ~[na:na]
	at org.springframework.jmx.support.MBeanRegistrationSupport.doRegister(MBeanRegistrationSupport.java:138) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.jmx.export.MBeanExporter.registerBeanInstance(MBeanExporter.java:672) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstance(MBeanExporter.java:616) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	... 14 common frames omitted

原因分析:

MXBean already registered,bean已经被注册
GenericObjectPoolConfig被注册的时候 自动注册了一个GenericObjectPool

解决方法:

1.启动类加上:

@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)

2.bean GenericObjectPoolConfig中有一个genericObjectPoolConfig.setJmxEnabled(false); 关掉监控 这个异常就不会抛出了~

思考

1.spring 中注册第三方jar包的对象
2.@bean 和@import的异同
3.common-pool 中Pool 的初始化
4.spring 注册 bean的顺序

参考资料:https://www.cnblogs.com/gaoquanquan/p/11347843.html

SpringBoot整合common-pool2实现对象池 使用池化主要是为了节省对象创建和销毁的开销。比如日常开发息息相关的数据源连接池,就是为了减少连接创建的时间而生的。commons-pool是apacha基金会开源的一款常见的对象池工具库。springBoot整合common-pool实现对象池。 阅读详情

相关推荐

ArcGIS学习记录—SHP文件转换为KML KMZ数据,并显示面要素相应的标注

使用相应软件操作获取KMZ数据得以下发到外业调查人员,使得矢量数据能够更显而易见,可视化,让外业人员的工作减轻许多。(过程步骤是借鉴于网络上的相关人士给的建议,根据这些建议自己做出来的步骤,可能有些粗略,有问题的话可以再进行探讨)...

qq_41046162的博客 5万+

智能体技术演进:从Function Calling到多智能体协同规划

智能体技术是AI工程化领域的核心方向之一,其核心原理是通过工具增强和协同规划实现复杂任务的自动化处理。从早期的Function Calling到现代的多智能体协同规划(MCP),智能体技术经历了显著的演进。Function Calling通过API调用实现基础功能扩展,而工具编排层(Tool Orchestration)则引入了动态工具选择能力,支持多工具协同。MCP进一步通过角色化分工和分布式决策实现复杂任务的分解与执行。这些技术在自然语言处理、自动化流程和智能决策等场景中具有广泛应用。文章还深入探讨了性

wangqiaowqo的专栏 321

DETR系列文章之–Co-DETR

Co-DETR,并行训练多个辅助头,以一对多的标签分配方式进行监督从辅助头中提取正样本坐标,为解码器中的正样本的训练效率进行额外的定制化正样本query.一对一标签分配:每个GT框分配给一个特定的query(DETR),较少的正query导致低效训练,从编码器生成的潜在表示和解码器中的注意力学习分析这一问题。一对多标签分配:每个GT框分配给检测器输出的多个proposal/anchor,依赖NMS或者anchor生成(ATSS,RetinaNet,FCOS,PAA)。

weixin_43731232的博客 2100

java连接池详解与自定义es连接池

目录1 版本选择2 导入依赖3 使用commons-pool构造连接池3.1 pom.xml3.2 对象池类GenericObjectPool普通对象池GenericKeyedObjectPool带Key的对象池3.3 实现PoolableObjectFactory接口类3.4 继承BasePooledObjectFactory抽象类3.5 GenericObjectPool.Config()参数配置类3.6 elasticsearch连接池代码实现4 使用commons-pool2构造连接池4.1 pom

进击的豌豆的博客 4154

显著性算法 + 伪彩变换

利用opencv得到显著图和伪彩图

正在挣扎中的人 2298

国赛数学建模高教社杯历届优秀论文全集

包含了2004到2023年高教社的赛题及优秀论文。

BanDeng001的博客 3285

common-pool2

文章目录1、简介2、核心接口3、对象池逻辑分析3.1、对象池接口说明3.2、 对象创建解耦3.2、池对象的状态3.3、对象池相关配置项3.4、对象池源码分析4、对象池`browObject`的逻辑5、对象池`returnObject`的过程执行逻辑6、对象池的自我保护机制7、工厂的`passivateObject(PooledObject p)`和`passivateObject(PooledObject p)`即对象的激活和钝化方法有有什么作用?8、使用步骤9、注意事项 1、简介 对象池就是一种存放对象的

weixin_44457533的博客 1618

基于 MFC 和 C++ 的语音识别客户端实现方案

语音 SDK:[Microsoft Speech SDK](https://learn.microsoft.com/zh-cn/azure/cognitive-services/speech-service/speech-sdk)(建议使用最新版)1. **Azure 语音服务密钥**:需要在 [Azure 门户](https://portal.azure.com/) 中创建语音资源,获取密钥和区域(如 `eastasia`),替换代码中的占位符。

寒寒豆豆软件公司的博客 152

# springboot整合redis启动 启动类程序直接终止

springboot整合redis启动 启动类程序直接终止 报错信息 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘redisTemplate’ defined in class path resource [com/domoyun/servicebase/config/RedisConfig.class]: Unsatisfied dependency exp

程序圆的博客 1524

基于Simulink的电动车PMSM能量泄放与回收系统仿真设计

摘要 本文设计了一个基于Simulink的电动车PMSM能量泄放与回收系统仿真模型。系统采用分层建模方案,包含永磁同步电机(PMSM)矢量控制、电池管理和泄放功率计算等核心模块。通过详细的参数计算和MATLAB脚本实现,模拟了电动车在制动时的能量回收过程。重点研究了泄放电阻的控制策略,提出基于母线电压和电池SOC的多目标优化算法,确保系统在保护硬件安全的同时最大化能量回收效率。仿真模型包含完整的数学推导和模块搭建指南,为电动车能量管理系统设计提供了有效的仿真验证平台。

huanghm88的专栏 193

通过Langchain实现大模型完成测试用例生成的代码(可集成到各种测试平台)

代码中使用的是讯飞spark3.0版本,其中版本在的控制已经封装到了langchain对应的讯飞的iflytek的类中,可以在调用的时候显示控制,默认是spark2.0版本。

Criss@陈磊 2361

spring boot 2.x整合redis(原理),以及开启json数据缓存和读取

官方介绍 12.1. Redis Redis is a cache, message broker, and richly-featured key-value store. Spring Boot offers basic auto-configuration for the Lettuce and Jedis client libraries and the abstractions on top of them provided by Spring Data Redis. 作者翻译:rides是一个缓

良木 823

地表最强之Android微信语音/腾讯会议通话录音

地表最强之Android微信语音/腾讯会议通话录音

cczhengv 6102

【Jedis和Spring Data Redis快速入门】

Test// 测试Hash类型操作stringRedisTemplate.opsForHash().put("user:300","name","虎哥");// 注意:年龄应该用字符串System.out.println("获取到的对象值: " + entries);

qq_74776071的博客 524

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

对象池commons-pool2

对象池commons-pool2

weixin_42211693的博客 1129

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

FTP Pool Tools ftp连接池

详细使用方法 依赖库 ``` <!-- ftpclient --> <dependency> <groupId>commons-net</groupId> <arti...

chourenshang3604的博客 429

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

整合springboot+redis,一直失败,发现是common-pool2版本问题。

整合springboot+redis,一直失败,发现是common-pool2版本问题。

zhaozhiwei314的博客 1265

搭建SSH,从零开始(第N+1天)—Struts2中集成Spring

在Struts2中继承Spring 参考文章 http://my.oschina.net/tomzhao/blog/23868 http://lukuijun.iteye.com/blog/350750   需要引入JAR包 经验证,集成时需要以下jar包:http://archive.apache.org/dist/commons/ commons系列jar包下载路径:http...

唐鹏贵的博客 100

使用Jedis集成Redis集群服务

在上一篇文章中小编为大家介绍的Redis最新版本Redis-5.0.5版本的集群环境安装。集群环境的使用不可能使用客户端命令的方式,肯定要集成到我们的代码中以实现数据缓存功能。对应Java来说Redis官网向用户推荐了Java客户端,如下图所示: 在Redis官网推荐的众多Java客户端中,Jedis是一个比较简单而功能强大的客户端,它实现Redis服务的封装,提供了简单的API调用。下面小编就...

chendaike的博客 1292

springboot集成redis redis配置手把手交你不踩坑

前面我们已经介绍过redis的安装配置和使用以及一些redis的基本概念,如果还有小伙伴不太熟悉的话可以翻翻我之前的博客 1.初识redis 从这篇博客开始看,看完这几篇以后相信你对Redis的概念会有一定的提升,我们了解完了redis的概念和基本使用,接下来我们来讨论一下怎么使用springboot集成redis。 一,集成redis的方式 首先我们要在自己的本机电脑或者服务器上安装一个redis的服务器,通过我们的idea在程序中进行集成,然后通过idea完成对redis的增删改查操作。在springB

佐岸的博客 4633

Spring集成jedis支持Redis3.0集群

接着上一节,我们通过spring FactoryBean实现redis 3.0集群JedisCluster与spring集成。http://www.linuxidc.com/Linux/2016-09/135123.htm 引用依赖: <dependency> <...

chuduoqie1823的博客 142

【第二章】SpringBoot2.x集成Redis

上一篇 【第一章】Centos7.x安装Redis , 以及redis常用命令使用. Redis简介 redis是一个高性能的键(Key)值(Value)数据库. 是当前最热门的的的NoSql数据库之一. Redis优势 基于内存,速度快 数据持久化的支持,可以将内存中的数据异步写入到硬盘中. 数据结构丰富 string<字符串> list<链表> set<...

爱飘de小子 669

springboot2.0集成redis

参考文章:https://blog.youkuaiyun.com/m0_38075425/article/details/81181726 https://blog.youkuaiyun.com/stronglyh/article/details/81173563 https://blog.youkuaiyun.com/qq_38157516/article/details/82356902 <!--spring2.0...

大海无量的博客 345

7、Spring Boot 2.x 集成 Redis

1.7 Spring Boot 2.x 集成 Redis 简介 继续上篇的MyBatis操作,详细介绍在Spring Boot中使用RedisCacheManager作为缓存管理器,集成业务于一体。 完整源码: Spring-Boot-Demos 1.7.1 创建 spring-boot-redis 项目 pom.xml文件如下: <?xml version="1.0" e...

120

common-pool2 讲解。

现在很多第三方框架都使用common-pool2作为对象池。 这个框架有几个核心: 一:工作类,比如说connetion,比如说一个可以干活(work)的Person。 二:工厂类,生产Person的工厂。工厂类是基于PooledObjectFactory->BasePooledObjectFactory的 三:配置类,对象池活跃对象个数等信息都需要配置:所遇需要配置类,基于Gen

faicm的专栏 3405
上一篇: swagger 文档优化 knife4j 增强 Swagger
下一篇: Java 项目模块化探索
hamish-wu
博客等级 码龄15年 2814粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值