最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?BasePooledObjectFactory?對象池化技術(shù)的使用

 更新時間:2023年04月07日 11:04:59   作者:VipSoft  
這篇文章主要介紹了Java?BasePooledObjectFactory?對象池化技術(shù),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

Java GenericObjectPool 對象池化技術(shù)--SpringBoot sftp 連接池工具類

一個對象池包含一組已經(jīng)初始化過且可以使用的對象,而可以在有需求時創(chuàng)建和銷毀對象。池的用戶可以從池子中取得對象,對其進(jìn)行操作處理,并在不需要時歸還給池子而非直接銷毀它。這是一種特殊的工廠對象。

BasePooledObjectFactory 對象池化技術(shù)的使用

Pom.xml

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.7.0</version>
</dependency>

MqttConnection.java

package com.vipsoft.mqtt.pool;
 
public class MqttConnection {

    private String mqttClient;
    ;

    public MqttConnection(String mqttClient) {
        this.mqttClient = mqttClient;
    }

    public String getMqttClient() {
        return mqttClient;
    }

    public void setMqttClient(String mqttClient) {
        this.mqttClient = mqttClient;
    }

    /**
     * 推送方法消息
     */
    public void publish(String msg) throws Exception {
        System.out.println("對象" + mqttClient + ":" + "執(zhí)行任務(wù)" + msg);
    }

    @Override
    public String toString() {
        return "MqttConnection{" + "id=" + mqttClient + '}';
    }
}

MqttConnectionFactory.java

package com.vipsoft.mqtt.pool;

import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.atomic.AtomicInteger;

public class MqttConnectionFactory extends BasePooledObjectFactory<MqttConnection> {

    private static final Logger logger = LoggerFactory.getLogger(MqttConnectionFactory.class);


    // AtomicInteger是一個提供原子操作的Integer類,通過線程安全的方式操作加減
    private AtomicInteger counter = new AtomicInteger();

    /**
     * 在對象池中創(chuàng)建對象
     *
     * @return
     * @throws Exception
     */
    @Override
    public MqttConnection create() throws Exception {

        // 實(shí)現(xiàn)線程安全避免在高并發(fā)的場景下出現(xiàn)clientId重復(fù)導(dǎo)致無法創(chuàng)建連接的情況
        int count = this.counter.addAndGet(1);
        MqttConnection mqttConnection = new MqttConnection("MqttConnection:" + count);
        logger.info("在對象池中創(chuàng)建對象 {}", mqttConnection.toString());
        return mqttConnection;
    }

    /**
     * common-pool2 中創(chuàng)建了 DefaultPooledObject 對象對對象池中對象進(jìn)行的包裝。
     * 將我們自定義的對象放置到這個包裝中,工具會統(tǒng)計(jì)對象的狀態(tài)、創(chuàng)建時間、更新時間、返回時間、出借時間、使用時間等等信息進(jìn)行統(tǒng)計(jì)
     *
     * @param mqttConnection
     * @return
     */
    @Override
    public PooledObject<MqttConnection> wrap(MqttConnection mqttConnection) {
        logger.info("封裝默認(rèn)返回類型 {}", mqttConnection.toString());
        return new DefaultPooledObject<>(mqttConnection);
    }

    /**
     * 銷毀對象
     *
     * @param p 對象池
     * @throws Exception 異常
     */
    @Override
    public void destroyObject(PooledObject<MqttConnection> p) throws Exception {
        logger.info("銷毀對象 {}", p.getObject().getMqttClient());
        super.destroyObject(p);
    }

    /**
     * 校驗(yàn)對象是否可用
     *
     * @param p 對象池
     * @return 對象是否可用結(jié)果,boolean
     */
    @Override
    public boolean validateObject(PooledObject<MqttConnection> p) {
        logger.info("校驗(yàn)對象是否可用 {}", p.getObject().getMqttClient());
        return super.validateObject(p);
    }

    /**
     * 激活鈍化的對象系列操作
     *
     * @param p 對象池
     * @throws Exception 異常信息
     */
    @Override
    public void activateObject(PooledObject<MqttConnection> p) throws Exception {
        logger.info("激活鈍化的對象 {}", p.getObject().getMqttClient());
        super.activateObject(p);
    }

    /**
     * 鈍化未使用的對象
     *
     * @param p 對象池
     * @throws Exception 異常信息
     */
    @Override
    public void passivateObject(PooledObject<MqttConnection> p) throws Exception {
        logger.info("鈍化未使用的對象 {}", p.getObject().getMqttClient());
        super.passivateObject(p);
    }
}


PoolTest.java

package com.vipsoft.mqtt;

import cn.hutool.core.date.DateUtil;
import com.vipsoft.mqtt.pool.MqttConnection;
import com.vipsoft.mqtt.pool.MqttConnectionFactory;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

@SpringBootTest
public class PoolTest {

    @Test
    void basePooledTest() throws InterruptedException {

        AtomicInteger atomicInteger = new AtomicInteger();

        int excutorCount = 15;
        CountDownLatch countDownLatch = new CountDownLatch(excutorCount);

        // =====================創(chuàng)建線程池=====================
        ExecutorService excutor = Executors.newFixedThreadPool(5);
        // =====================創(chuàng)建對象池 項(xiàng)目中使用了InitializingBean.afterPropertiesSet() 中創(chuàng)建=====================
        // 對象池工廠
        MqttConnectionFactory personPoolFactory = new MqttConnectionFactory();
        // 對象池配置
        GenericObjectPoolConfig<MqttConnection> objectPoolConfig = new GenericObjectPoolConfig<>();
        objectPoolConfig.setMaxTotal(50);
        // 對象池
        GenericObjectPool<MqttConnection> mqttPool = new GenericObjectPool<>(personPoolFactory, objectPoolConfig);
        // =====================測試對象池=====================
        // 循環(huán)100次,從線程池中取多個多線程執(zhí)行任務(wù),來測試對象池
        for (int i = 0; i < excutorCount; i++) {
            excutor.submit(new Thread(() -> {
                // 模擬從對象池取出對象,執(zhí)行任務(wù)
                MqttConnection mqtt = null;
                try {
                    // 從對象池取出對象
                    mqtt = mqttPool.borrowObject();
                    // 讓對象工作
                    int count = atomicInteger.addAndGet(1);
                    mqtt.publish("Id:" + count + " Time: " + DateUtil.now());
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    // 回收對象到對象池
                    if (mqtt != null) {
                        mqttPool.returnObject(mqtt);
                    }
                    countDownLatch.countDown();
                }
            }));
        }
        countDownLatch.await();
    }
}


到此這篇關(guān)于Java BasePooledObjectFactory 對象池化技術(shù)的文章就介紹到這了,更多相關(guān)Java 對象池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot開發(fā)中的組件和容器詳解

    SpringBoot開發(fā)中的組件和容器詳解

    這篇文章主要介紹了SpringBoot開發(fā)中的組件和容器詳解,SpringBoot 提供了一個內(nèi)嵌的 Tomcat 容器作為默認(rèn)的 Web 容器,同時還支持其他 Web 容器和應(yīng)用服務(wù)器,需要的朋友可以參考下
    2023-09-09
  • Java延時的3種實(shí)現(xiàn)方法舉例

    Java延時的3種實(shí)現(xiàn)方法舉例

    這篇文章主要給大家介紹了關(guān)于Java延時的3種實(shí)現(xiàn)方法舉例,java開發(fā)中常會用到延時任務(wù),文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)具有一定參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • 簡單聊一聊Spring中Bean別名的處理原理

    簡單聊一聊Spring中Bean別名的處理原理

    今天來和小伙伴們聊一聊 Spring 中關(guān)于 Bean 別名的處理邏輯,別名,顧名思義就是給一個 Bean 去兩個甚至多個名字,整體上來說,在 Spring 中,有兩種不同的別名定義方式,感興趣的小伙伴跟著小編一起來看看吧
    2023-09-09
  • 深度解析Java DTO(最新推薦)

    深度解析Java DTO(最新推薦)

    DTO(Data Transfer Object)是一種用于在不同層(如Controller層、Service層)之間傳輸數(shù)據(jù)的對象設(shè)計(jì)模式,其核心目的是封裝數(shù)據(jù),減少網(wǎng)絡(luò)傳輸開銷,同時避免直接暴露領(lǐng)域模型(Entity)的內(nèi)部結(jié)構(gòu),感興趣的朋友一起看看吧
    2025-06-06
  • Java實(shí)戰(zhàn)之敏感詞過濾器

    Java實(shí)戰(zhàn)之敏感詞過濾器

    這篇文章主要介紹了Java實(shí)戰(zhàn)之敏感詞過濾器,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java中的gateway自定義過濾器詳解

    Java中的gateway自定義過濾器詳解

    這篇文章主要介紹了Java中的gateway自定義過濾器詳解,過濾器是指gateway在路由過程中(A地址路由到B地址)生效進(jìn)行過濾操作的,所有首先你得先配一個地址路由,本文提供了部分實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2023-11-11
  • Java實(shí)現(xiàn)自定義Excel數(shù)據(jù)排序的方法詳解

    Java實(shí)現(xiàn)自定義Excel數(shù)據(jù)排序的方法詳解

    通常,我們可以在Excel中對指定列數(shù)據(jù)執(zhí)行升序或者降序排序,在需要自定義排序情況下,我們也可以自行根據(jù)排序需要編輯數(shù)據(jù)排列順序。本文將通過Java應(yīng)用程序來實(shí)現(xiàn)如何自定義排序,需要的可以參考一下
    2022-09-09
  • Java?NIO?Channel?使用詳情

    Java?NIO?Channel?使用詳情

    這篇文章主要介紹了Java?NIO?Channel?使用詳情,文章圍繞主題展開詳細(xì)內(nèi)容需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助
    2022-04-04
  • SpringBootTest報(bào)錯的問題解決

    SpringBootTest報(bào)錯的問題解決

    本文主要介紹了SpringBootTest報(bào)錯的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-09-09
  • SpringBoot詳細(xì)分析自動裝配原理并實(shí)現(xiàn)starter

    SpringBoot詳細(xì)分析自動裝配原理并實(shí)現(xiàn)starter

    相對于傳統(tǒng)意義上的Spring項(xiàng)目,SpringBoot具有開箱即用,簡化配置,內(nèi)置Tomcat等等等等一系列的特點(diǎn)。在這些特點(diǎn)中,最重要的兩條就是約定優(yōu)于配置和自動裝配
    2022-07-07

最新評論

白朗县| 上犹县| 江山市| 通辽市| 得荣县| 宜良县| 麻城市| 吴堡县| 连城县| 贵州省| 蕲春县| 新巴尔虎右旗| 邓州市| 岗巴县| 高尔夫| 健康| 泸水县| 城口县| 林口县| 东丽区| 大埔县| 茶陵县| 买车| 东城区| 虞城县| 维西| 长葛市| 临夏市| 马龙县| 扎兰屯市| 石泉县| 松江区| 新邵县| 新民市| 璧山县| 斗六市| 灵山县| 金塔县| 漯河市| 桃江县| 丹棱县|