欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

BasePooledObjectFactory 對(duì)象池化技術(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("對(duì)象" + 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是一個(gè)提供原子操作的Integer類,通過(guò)線程安全的方式操作加減
    private AtomicInteger counter = new AtomicInteger();

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

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

    /**
     * common-pool2 中創(chuàng)建了 DefaultPooledObject 對(duì)象對(duì)對(duì)象池中對(duì)象進(jìn)行的包裝。
     * 將我們自定義的對(duì)象放置到這個(gè)包裝中,工具會(huì)統(tǒng)計(jì)對(duì)象的狀態(tài)、創(chuàng)建時(shí)間、更新時(shí)間、返回時(shí)間、出借時(shí)間、使用時(shí)間等等信息進(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);
    }

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

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

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

    /**
     * 鈍化未使用的對(duì)象
     *
     * @param p 對(duì)象池
     * @throws Exception 異常信息
     */
    @Override
    public void passivateObject(PooledObject<MqttConnection> p) throws Exception {
        logger.info("鈍化未使用的對(duì)象 {}", 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)建對(duì)象池 項(xiàng)目中使用了InitializingBean.afterPropertiesSet() 中創(chuàng)建=====================
        // 對(duì)象池工廠
        MqttConnectionFactory personPoolFactory = new MqttConnectionFactory();
        // 對(duì)象池配置
        GenericObjectPoolConfig<MqttConnection> objectPoolConfig = new GenericObjectPoolConfig<>();
        objectPoolConfig.setMaxTotal(50);
        // 對(duì)象池
        GenericObjectPool<MqttConnection> mqttPool = new GenericObjectPool<>(personPoolFactory, objectPoolConfig);
        // =====================測(cè)試對(duì)象池=====================
        // 循環(huán)100次,從線程池中取多個(gè)多線程執(zhí)行任務(wù),來(lái)測(cè)試對(duì)象池
        for (int i = 0; i < excutorCount; i++) {
            excutor.submit(new Thread(() -> {
                // 模擬從對(duì)象池取出對(duì)象,執(zhí)行任務(wù)
                MqttConnection mqtt = null;
                try {
                    // 從對(duì)象池取出對(duì)象
                    mqtt = mqttPool.borrowObject();
                    // 讓對(duì)象工作
                    int count = atomicInteger.addAndGet(1);
                    mqtt.publish("Id:" + count + " Time: " + DateUtil.now());
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    // 回收對(duì)象到對(duì)象池
                    if (mqtt != null) {
                        mqttPool.returnObject(mqtt);
                    }
                    countDownLatch.countDown();
                }
            }));
        }
        countDownLatch.await();
    }
}


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

相關(guān)文章

  • jdk21環(huán)境配置詳細(xì)步驟記錄

    jdk21環(huán)境配置詳細(xì)步驟記錄

    JDK是整個(gè)Java開(kāi)發(fā)的核心,它包含了Java的運(yùn)行環(huán)境和Java工具,這篇文章主要給大家介紹了關(guān)于jdk21環(huán)境配置的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Java使用synchronized實(shí)現(xiàn)互斥鎖功能示例

    Java使用synchronized實(shí)現(xiàn)互斥鎖功能示例

    這篇文章主要介紹了Java使用synchronized實(shí)現(xiàn)互斥鎖功能,結(jié)合實(shí)例形式分析了Java使用synchronized互斥鎖功能簡(jiǎn)單實(shí)現(xiàn)方法與操作技巧,需要的朋友可以參考下
    2020-05-05
  • JAVA 注解詳解及簡(jiǎn)單實(shí)例

    JAVA 注解詳解及簡(jiǎn)單實(shí)例

    這篇文章主要介紹了JAVA 注解詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • JDK1.8中的ConcurrentHashMap源碼分析

    JDK1.8中的ConcurrentHashMap源碼分析

    這篇文章主要介紹了JDK1.8中的ConcurrentHashMap源碼分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Java 基礎(chǔ) byte[]與各種數(shù)據(jù)類型互相轉(zhuǎn)換的簡(jiǎn)單示例

    Java 基礎(chǔ) byte[]與各種數(shù)據(jù)類型互相轉(zhuǎn)換的簡(jiǎn)單示例

    這篇文章主要介紹了Java 基礎(chǔ) byte[]與各種數(shù)據(jù)類型互相轉(zhuǎn)換的簡(jiǎn)單示例的相關(guān)資料,這里對(duì)byte[]類型對(duì)long,int,double,float,short,cahr,object,string類型相互轉(zhuǎn)換的實(shí)例,需要的朋友可以參考下
    2017-01-01
  • 如何基于SpringWeb?MultipartFile實(shí)現(xiàn)文件上傳、下載功能

    如何基于SpringWeb?MultipartFile實(shí)現(xiàn)文件上傳、下載功能

    在做項(xiàng)目時(shí),后端經(jīng)常采用上傳文件組件MultipartFile,下面這篇文章主要給大家介紹了關(guān)于如何基于SpringWeb?MultipartFile實(shí)現(xiàn)文件上傳、下載功能的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • SpringBoot中的server.context-path的實(shí)現(xiàn)

    SpringBoot中的server.context-path的實(shí)現(xiàn)

    本文主要介紹了SpringBoot中的server.context-path的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • Java執(zhí)行JS腳本工具

    Java執(zhí)行JS腳本工具

    今天小編就為大家分享一篇關(guān)于Java執(zhí)行JS腳本工具,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • java獲取注冊(cè)ip實(shí)例

    java獲取注冊(cè)ip實(shí)例

    本文分享了java獲取注冊(cè)ip實(shí)例代碼,代碼簡(jiǎn)潔,具有很好的參考價(jià)值,需要的朋友一起來(lái)看下吧
    2016-12-12
  • Java定時(shí)器問(wèn)題實(shí)例解析

    Java定時(shí)器問(wèn)題實(shí)例解析

    這篇文章主要結(jié)合實(shí)例介紹了java當(dāng)中的定時(shí)器的一些問(wèn)題,有需要的朋友可以參考一下
    2017-04-04

最新評(píng)論