经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
Java BasePooledObjectFactory 对象池化技术
来源:cnblogs  作者:VipSoft  时间:2023/3/31 9:12:14  对本文有异议

Java GenericObjectPool 对象池化技术--SpringBoot sftp 连接池工具类

一个对象池包含一组已经初始化过且可以使用的对象,而可以在有需求时创建和销毁对象。池的用户可以从池子中取得对象,对其进行操作处理,并在不需要时归还给池子而非直接销毁它。这是一种特殊的工厂对象。

点击查看 MQTT(EMQX) - SpringBoot 创建 mqtt 连接池
点击查看 MQTT(EMQX) - SpringBoot 整合MQTT Demo - 附源代码

BasePooledObjectFactory 对象池化技术 的使用
image

Pom.xml

  1. <dependency>
  2. <groupId>org.apache.commons</groupId>
  3. <artifactId>commons-pool2</artifactId>
  4. <version>2.7.0</version>
  5. </dependency>

MqttConnection.java

  1. package com.vipsoft.mqtt.pool;
  2. public class MqttConnection {
  3. private String mqttClient;
  4. ;
  5. public MqttConnection(String mqttClient) {
  6. this.mqttClient = mqttClient;
  7. }
  8. public String getMqttClient() {
  9. return mqttClient;
  10. }
  11. public void setMqttClient(String mqttClient) {
  12. this.mqttClient = mqttClient;
  13. }
  14. /**
  15. * 推送方法消息
  16. */
  17. public void publish(String msg) throws Exception {
  18. System.out.println("对象" + mqttClient + ":" + "执行任务" + msg);
  19. }
  20. @Override
  21. public String toString() {
  22. return "MqttConnection{" + "id=" + mqttClient + '}';
  23. }
  24. }

MqttConnectionFactory.java

  1. package com.vipsoft.mqtt.pool;
  2. import org.apache.commons.pool2.BasePooledObjectFactory;
  3. import org.apache.commons.pool2.PooledObject;
  4. import org.apache.commons.pool2.impl.DefaultPooledObject;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import java.util.concurrent.atomic.AtomicInteger;
  8. public class MqttConnectionFactory extends BasePooledObjectFactory<MqttConnection> {
  9. private static final Logger logger = LoggerFactory.getLogger(MqttConnectionFactory.class);
  10. // AtomicInteger是一个提供原子操作的Integer类,通过线程安全的方式操作加减
  11. private AtomicInteger counter = new AtomicInteger();
  12. /**
  13. * 在对象池中创建对象
  14. *
  15. * @return
  16. * @throws Exception
  17. */
  18. @Override
  19. public MqttConnection create() throws Exception {
  20. // 实现线程安全避免在高并发的场景下出现clientId重复导致无法创建连接的情况
  21. int count = this.counter.addAndGet(1);
  22. MqttConnection mqttConnection = new MqttConnection("MqttConnection:" + count);
  23. logger.info("在对象池中创建对象 {}", mqttConnection.toString());
  24. return mqttConnection;
  25. }
  26. /**
  27. * common-pool2 中创建了 DefaultPooledObject 对象对对象池中对象进行的包装。
  28. * 将我们自定义的对象放置到这个包装中,工具会统计对象的状态、创建时间、更新时间、返回时间、出借时间、使用时间等等信息进行统计
  29. *
  30. * @param mqttConnection
  31. * @return
  32. */
  33. @Override
  34. public PooledObject<MqttConnection> wrap(MqttConnection mqttConnection) {
  35. logger.info("封装默认返回类型 {}", mqttConnection.toString());
  36. return new DefaultPooledObject<>(mqttConnection);
  37. }
  38. /**
  39. * 销毁对象
  40. *
  41. * @param p 对象池
  42. * @throws Exception 异常
  43. */
  44. @Override
  45. public void destroyObject(PooledObject<MqttConnection> p) throws Exception {
  46. logger.info("销毁对象 {}", p.getObject().getMqttClient());
  47. super.destroyObject(p);
  48. }
  49. /**
  50. * 校验对象是否可用
  51. *
  52. * @param p 对象池
  53. * @return 对象是否可用结果,boolean
  54. */
  55. @Override
  56. public boolean validateObject(PooledObject<MqttConnection> p) {
  57. logger.info("校验对象是否可用 {}", p.getObject().getMqttClient());
  58. return super.validateObject(p);
  59. }
  60. /**
  61. * 激活钝化的对象系列操作
  62. *
  63. * @param p 对象池
  64. * @throws Exception 异常信息
  65. */
  66. @Override
  67. public void activateObject(PooledObject<MqttConnection> p) throws Exception {
  68. logger.info("激活钝化的对象 {}", p.getObject().getMqttClient());
  69. super.activateObject(p);
  70. }
  71. /**
  72. * 钝化未使用的对象
  73. *
  74. * @param p 对象池
  75. * @throws Exception 异常信息
  76. */
  77. @Override
  78. public void passivateObject(PooledObject<MqttConnection> p) throws Exception {
  79. logger.info("钝化未使用的对象 {}", p.getObject().getMqttClient());
  80. super.passivateObject(p);
  81. }
  82. }

PoolTest.java

  1. package com.vipsoft.mqtt;
  2. import cn.hutool.core.date.DateUtil;
  3. import com.vipsoft.mqtt.pool.MqttConnection;
  4. import com.vipsoft.mqtt.pool.MqttConnectionFactory;
  5. import org.apache.commons.pool2.impl.GenericObjectPool;
  6. import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
  7. import org.junit.jupiter.api.Test;
  8. import org.springframework.boot.test.context.SpringBootTest;
  9. import java.util.concurrent.CountDownLatch;
  10. import java.util.concurrent.ExecutorService;
  11. import java.util.concurrent.Executors;
  12. import java.util.concurrent.atomic.AtomicInteger;
  13. @SpringBootTest
  14. public class PoolTest {
  15. @Test
  16. void basePooledTest() throws InterruptedException {
  17. AtomicInteger atomicInteger = new AtomicInteger();
  18. int excutorCount = 15;
  19. CountDownLatch countDownLatch = new CountDownLatch(excutorCount);
  20. // =====================创建线程池=====================
  21. ExecutorService excutor = Executors.newFixedThreadPool(5);
  22. // =====================创建对象池=====================
  23. // 对象池工厂
  24. MqttConnectionFactory personPoolFactory = new MqttConnectionFactory();
  25. // 对象池配置
  26. GenericObjectPoolConfig<MqttConnection> objectPoolConfig = new GenericObjectPoolConfig<>();
  27. objectPoolConfig.setMaxTotal(50);
  28. // 对象池
  29. GenericObjectPool<MqttConnection> mqttPool = new GenericObjectPool<>(personPoolFactory, objectPoolConfig);
  30. // =====================测试对象池=====================
  31. // 循环100次,从线程池中取多个多线程执行任务,来测试对象池
  32. for (int i = 0; i < excutorCount; i++) {
  33. excutor.submit(new Thread(() -> {
  34. // 模拟从对象池取出对象,执行任务
  35. MqttConnection mqtt = null;
  36. try {
  37. // 从对象池取出对象
  38. mqtt = mqttPool.borrowObject();
  39. // 让对象工作
  40. int count = atomicInteger.addAndGet(1);
  41. mqtt.publish("Id:" + count + " Time: " + DateUtil.now());
  42. } catch (Exception e) {
  43. e.printStackTrace();
  44. } finally {
  45. // 回收对象到对象池
  46. if (mqtt != null) {
  47. mqttPool.returnObject(mqtt);
  48. }
  49. countDownLatch.countDown();
  50. }
  51. }));
  52. }
  53. countDownLatch.await();
  54. }
  55. }

image

原文链接:https://www.cnblogs.com/vipsoft/p/17270006.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号