You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

131 lines
3.4 KiB

8 years ago
  1. package com.highcharts.export.pool;
  2. import com.highcharts.export.util.TempDir;
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.nio.file.Files;
  6. import java.nio.file.Path;
  7. import java.nio.file.Paths;
  8. import java.nio.file.attribute.BasicFileAttributes;
  9. import java.util.Collection;
  10. import java.util.Date;
  11. import java.util.Queue;
  12. import java.util.concurrent.atomic.AtomicInteger;
  13. import org.apache.commons.io.FileUtils;
  14. import org.apache.commons.io.filefilter.IOFileFilter;
  15. import org.apache.log4j.Logger;
  16. import org.springframework.scheduling.annotation.Scheduled;
  17. public abstract class AbstractPool<T> implements ObjectPool<T> {
  18. final ObjectFactory<T> objectFactory;
  19. Queue<T> queue;
  20. final AtomicInteger poolSize = new AtomicInteger(0);
  21. int maxWait;
  22. final int capacity;
  23. final long retentionTime;
  24. protected static Logger logger = Logger.getLogger("pool");
  25. public AbstractPool(ObjectFactory<T> objectFactory, int number, int maxWait, Long retentionTime) throws PoolException {
  26. this.objectFactory = objectFactory;
  27. this.capacity = number;
  28. this.maxWait = maxWait;
  29. this.retentionTime = retentionTime;
  30. }
  31. @Override
  32. public void createObject() {
  33. T object = objectFactory.create();
  34. queue.add(object);
  35. poolSize.getAndIncrement();
  36. }
  37. @Override
  38. public void destroyObject(T object) {
  39. objectFactory.destroy(object);
  40. }
  41. @Override
  42. @Scheduled(initialDelay = 10000, fixedRate = 5000)
  43. public void poolCleaner() throws InterruptedException, PoolException {
  44. logger.debug("HC: queue size: " + queue.size() + " poolSize " + poolSize.get());
  45. int size = poolSize.get();
  46. // remove invalid objects
  47. for (int i = 0; i < size; i++) {
  48. T object = borrowObject();
  49. if (object == null) {
  50. logger.debug("HC: object is null");
  51. } else {
  52. logger.debug("HC: validating " + object.toString());
  53. if (!objectFactory.validate(object)) {
  54. logger.debug("HC: destroying " + object.toString());
  55. destroyObject(object);
  56. } else {
  57. returnObject(object, false);
  58. }
  59. }
  60. }
  61. int number = poolSize.get() - capacity;
  62. logger.debug("in cleanpool, the surplus or shortage is: " + number);
  63. synchronized (this) {
  64. int iterations = Math.abs(number);
  65. for (int i = 0; i < iterations; i++) {
  66. if (number < 1) {
  67. this.createObject();
  68. } else {
  69. T object = borrowObject();
  70. this.destroyObject(object);
  71. }
  72. }
  73. }
  74. }
  75. @Override
  76. @Scheduled(initialDelay = 15000, fixedRate = 60000)
  77. public void tempDirCleaner() {
  78. IOFileFilter filter = new IOFileFilter() {
  79. @Override
  80. public boolean accept(File file) {
  81. try {
  82. Long now = new Date().getTime();
  83. Path path = Paths.get(file.getAbsolutePath());
  84. BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
  85. Long inBetween = now - attrs.lastAccessTime().toMillis();
  86. if (inBetween > retentionTime) {
  87. return true;
  88. }
  89. } catch (IOException ioex) {
  90. logger.error("Error: while selection files for deletion: " + ioex.getMessage());
  91. }
  92. return false;
  93. }
  94. @Override
  95. public boolean accept(File file, String string) {
  96. throw new UnsupportedOperationException("Not supported yet.");
  97. }
  98. };
  99. Collection<File> oldFiles = FileUtils.listFiles(TempDir.outputDir.toFile(),filter, null);
  100. for (File file : oldFiles) {
  101. file.delete();
  102. }
  103. }
  104. /*Getter and Setters*/
  105. public int getMaxWait() {
  106. return maxWait;
  107. }
  108. public void setMaxWait(int maxWait) {
  109. this.maxWait = maxWait;
  110. }
  111. }