Moved BuyListTaskManager product restock to a separate task.

This commit is contained in:
MobiusDevelopment 2021-02-02 14:57:21 +00:00
parent 5c4787386a
commit 860260764d
19 changed files with 703 additions and 95 deletions

View File

@ -16,6 +16,8 @@
*/ */
package org.l2jmobius.gameserver.taskmanager; package org.l2jmobius.gameserver.taskmanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -29,17 +31,19 @@ import org.l2jmobius.gameserver.model.buylist.Product;
public class BuyListTaskManager public class BuyListTaskManager
{ {
private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>(); private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>();
private static boolean _working = false; private static final List<Product> PENDING_UPDATES = new ArrayList<>();
private static boolean _workingProducts = false;
private static boolean _workingSaves = false;
public BuyListTaskManager() public BuyListTaskManager()
{ {
ThreadPool.scheduleAtFixedRate(() -> ThreadPool.scheduleAtFixedRate(() ->
{ {
if (_working) if (_workingProducts)
{ {
return; return;
} }
_working = true; _workingProducts = true;
final long currentTime = System.currentTimeMillis(); final long currentTime = System.currentTimeMillis();
for (Entry<Product, Long> entry : PRODUCTS.entrySet()) for (Entry<Product, Long> entry : PRODUCTS.entrySet())
@ -48,12 +52,40 @@ public class BuyListTaskManager
{ {
final Product product = entry.getKey(); final Product product = entry.getKey();
PRODUCTS.remove(product); PRODUCTS.remove(product);
product.restock(); synchronized (PENDING_UPDATES)
{
if (!PENDING_UPDATES.contains(product))
{
PENDING_UPDATES.add(product);
}
}
} }
} }
_working = false; _workingProducts = false;
}, 1000, 60000); }, 1000, 60000);
ThreadPool.scheduleAtFixedRate(() ->
{
if (_workingSaves)
{
return;
}
_workingSaves = true;
if (!PENDING_UPDATES.isEmpty())
{
final Product product;
synchronized (PENDING_UPDATES)
{
product = PENDING_UPDATES.get(0);
PENDING_UPDATES.remove(product);
}
product.restock();
}
_workingSaves = false;
}, 50, 50);
} }
public void add(Product product, long endTime) public void add(Product product, long endTime)

View File

@ -16,6 +16,8 @@
*/ */
package org.l2jmobius.gameserver.taskmanager; package org.l2jmobius.gameserver.taskmanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -29,17 +31,19 @@ import org.l2jmobius.gameserver.model.buylist.Product;
public class BuyListTaskManager public class BuyListTaskManager
{ {
private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>(); private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>();
private static boolean _working = false; private static final List<Product> PENDING_UPDATES = new ArrayList<>();
private static boolean _workingProducts = false;
private static boolean _workingSaves = false;
public BuyListTaskManager() public BuyListTaskManager()
{ {
ThreadPool.scheduleAtFixedRate(() -> ThreadPool.scheduleAtFixedRate(() ->
{ {
if (_working) if (_workingProducts)
{ {
return; return;
} }
_working = true; _workingProducts = true;
final long currentTime = System.currentTimeMillis(); final long currentTime = System.currentTimeMillis();
for (Entry<Product, Long> entry : PRODUCTS.entrySet()) for (Entry<Product, Long> entry : PRODUCTS.entrySet())
@ -48,12 +52,40 @@ public class BuyListTaskManager
{ {
final Product product = entry.getKey(); final Product product = entry.getKey();
PRODUCTS.remove(product); PRODUCTS.remove(product);
product.restock(); synchronized (PENDING_UPDATES)
{
if (!PENDING_UPDATES.contains(product))
{
PENDING_UPDATES.add(product);
}
}
} }
} }
_working = false; _workingProducts = false;
}, 1000, 60000); }, 1000, 60000);
ThreadPool.scheduleAtFixedRate(() ->
{
if (_workingSaves)
{
return;
}
_workingSaves = true;
if (!PENDING_UPDATES.isEmpty())
{
final Product product;
synchronized (PENDING_UPDATES)
{
product = PENDING_UPDATES.get(0);
PENDING_UPDATES.remove(product);
}
product.restock();
}
_workingSaves = false;
}, 50, 50);
} }
public void add(Product product, long endTime) public void add(Product product, long endTime)

View File

@ -16,6 +16,8 @@
*/ */
package org.l2jmobius.gameserver.taskmanager; package org.l2jmobius.gameserver.taskmanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -29,17 +31,19 @@ import org.l2jmobius.gameserver.model.buylist.Product;
public class BuyListTaskManager public class BuyListTaskManager
{ {
private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>(); private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>();
private static boolean _working = false; private static final List<Product> PENDING_UPDATES = new ArrayList<>();
private static boolean _workingProducts = false;
private static boolean _workingSaves = false;
public BuyListTaskManager() public BuyListTaskManager()
{ {
ThreadPool.scheduleAtFixedRate(() -> ThreadPool.scheduleAtFixedRate(() ->
{ {
if (_working) if (_workingProducts)
{ {
return; return;
} }
_working = true; _workingProducts = true;
final long currentTime = System.currentTimeMillis(); final long currentTime = System.currentTimeMillis();
for (Entry<Product, Long> entry : PRODUCTS.entrySet()) for (Entry<Product, Long> entry : PRODUCTS.entrySet())
@ -48,12 +52,40 @@ public class BuyListTaskManager
{ {
final Product product = entry.getKey(); final Product product = entry.getKey();
PRODUCTS.remove(product); PRODUCTS.remove(product);
product.restock(); synchronized (PENDING_UPDATES)
{
if (!PENDING_UPDATES.contains(product))
{
PENDING_UPDATES.add(product);
}
}
} }
} }
_working = false; _workingProducts = false;
}, 1000, 60000); }, 1000, 60000);
ThreadPool.scheduleAtFixedRate(() ->
{
if (_workingSaves)
{
return;
}
_workingSaves = true;
if (!PENDING_UPDATES.isEmpty())
{
final Product product;
synchronized (PENDING_UPDATES)
{
product = PENDING_UPDATES.get(0);
PENDING_UPDATES.remove(product);
}
product.restock();
}
_workingSaves = false;
}, 50, 50);
} }
public void add(Product product, long endTime) public void add(Product product, long endTime)

View File

@ -16,6 +16,8 @@
*/ */
package org.l2jmobius.gameserver.taskmanager; package org.l2jmobius.gameserver.taskmanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -29,17 +31,19 @@ import org.l2jmobius.gameserver.model.buylist.Product;
public class BuyListTaskManager public class BuyListTaskManager
{ {
private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>(); private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>();
private static boolean _working = false; private static final List<Product> PENDING_UPDATES = new ArrayList<>();
private static boolean _workingProducts = false;
private static boolean _workingSaves = false;
public BuyListTaskManager() public BuyListTaskManager()
{ {
ThreadPool.scheduleAtFixedRate(() -> ThreadPool.scheduleAtFixedRate(() ->
{ {
if (_working) if (_workingProducts)
{ {
return; return;
} }
_working = true; _workingProducts = true;
final long currentTime = System.currentTimeMillis(); final long currentTime = System.currentTimeMillis();
for (Entry<Product, Long> entry : PRODUCTS.entrySet()) for (Entry<Product, Long> entry : PRODUCTS.entrySet())
@ -48,12 +52,40 @@ public class BuyListTaskManager
{ {
final Product product = entry.getKey(); final Product product = entry.getKey();
PRODUCTS.remove(product); PRODUCTS.remove(product);
product.restock(); synchronized (PENDING_UPDATES)
{
if (!PENDING_UPDATES.contains(product))
{
PENDING_UPDATES.add(product);
}
}
} }
} }
_working = false; _workingProducts = false;
}, 1000, 60000); }, 1000, 60000);
ThreadPool.scheduleAtFixedRate(() ->
{
if (_workingSaves)
{
return;
}
_workingSaves = true;
if (!PENDING_UPDATES.isEmpty())
{
final Product product;
synchronized (PENDING_UPDATES)
{
product = PENDING_UPDATES.get(0);
PENDING_UPDATES.remove(product);
}
product.restock();
}
_workingSaves = false;
}, 50, 50);
} }
public void add(Product product, long endTime) public void add(Product product, long endTime)

View File

@ -16,6 +16,8 @@
*/ */
package org.l2jmobius.gameserver.taskmanager; package org.l2jmobius.gameserver.taskmanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -29,17 +31,19 @@ import org.l2jmobius.gameserver.model.buylist.Product;
public class BuyListTaskManager public class BuyListTaskManager
{ {
private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>(); private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>();
private static boolean _working = false; private static final List<Product> PENDING_UPDATES = new ArrayList<>();
private static boolean _workingProducts = false;
private static boolean _workingSaves = false;
public BuyListTaskManager() public BuyListTaskManager()
{ {
ThreadPool.scheduleAtFixedRate(() -> ThreadPool.scheduleAtFixedRate(() ->
{ {
if (_working) if (_workingProducts)
{ {
return; return;
} }
_working = true; _workingProducts = true;
final long currentTime = System.currentTimeMillis(); final long currentTime = System.currentTimeMillis();
for (Entry<Product, Long> entry : PRODUCTS.entrySet()) for (Entry<Product, Long> entry : PRODUCTS.entrySet())
@ -48,12 +52,40 @@ public class BuyListTaskManager
{ {
final Product product = entry.getKey(); final Product product = entry.getKey();
PRODUCTS.remove(product); PRODUCTS.remove(product);
product.restock(); synchronized (PENDING_UPDATES)
{
if (!PENDING_UPDATES.contains(product))
{
PENDING_UPDATES.add(product);
}
}
} }
} }
_working = false; _workingProducts = false;
}, 1000, 60000); }, 1000, 60000);
ThreadPool.scheduleAtFixedRate(() ->
{
if (_workingSaves)
{
return;
}
_workingSaves = true;
if (!PENDING_UPDATES.isEmpty())
{
final Product product;
synchronized (PENDING_UPDATES)
{
product = PENDING_UPDATES.get(0);
PENDING_UPDATES.remove(product);
}
product.restock();
}
_workingSaves = false;
}, 50, 50);
} }
public void add(Product product, long endTime) public void add(Product product, long endTime)

View File

@ -16,6 +16,8 @@
*/ */
package org.l2jmobius.gameserver.taskmanager; package org.l2jmobius.gameserver.taskmanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -29,17 +31,19 @@ import org.l2jmobius.gameserver.model.buylist.Product;
public class BuyListTaskManager public class BuyListTaskManager
{ {
private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>(); private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>();
private static boolean _working = false; private static final List<Product> PENDING_UPDATES = new ArrayList<>();
private static boolean _workingProducts = false;
private static boolean _workingSaves = false;
public BuyListTaskManager() public BuyListTaskManager()
{ {
ThreadPool.scheduleAtFixedRate(() -> ThreadPool.scheduleAtFixedRate(() ->
{ {
if (_working) if (_workingProducts)
{ {
return; return;
} }
_working = true; _workingProducts = true;
final long currentTime = System.currentTimeMillis(); final long currentTime = System.currentTimeMillis();
for (Entry<Product, Long> entry : PRODUCTS.entrySet()) for (Entry<Product, Long> entry : PRODUCTS.entrySet())
@ -48,12 +52,40 @@ public class BuyListTaskManager
{ {
final Product product = entry.getKey(); final Product product = entry.getKey();
PRODUCTS.remove(product); PRODUCTS.remove(product);
product.restock(); synchronized (PENDING_UPDATES)
{
if (!PENDING_UPDATES.contains(product))
{
PENDING_UPDATES.add(product);
}
}
} }
} }
_working = false; _workingProducts = false;
}, 1000, 60000); }, 1000, 60000);
ThreadPool.scheduleAtFixedRate(() ->
{
if (_workingSaves)
{
return;
}
_workingSaves = true;
if (!PENDING_UPDATES.isEmpty())
{
final Product product;
synchronized (PENDING_UPDATES)
{
product = PENDING_UPDATES.get(0);
PENDING_UPDATES.remove(product);
}
product.restock();
}
_workingSaves = false;
}, 50, 50);
} }
public void add(Product product, long endTime) public void add(Product product, long endTime)

View File

@ -16,6 +16,8 @@
*/ */
package org.l2jmobius.gameserver.taskmanager; package org.l2jmobius.gameserver.taskmanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -29,17 +31,19 @@ import org.l2jmobius.gameserver.model.buylist.Product;
public class BuyListTaskManager public class BuyListTaskManager
{ {
private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>(); private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>();
private static boolean _working = false; private static final List<Product> PENDING_UPDATES = new ArrayList<>();
private static boolean _workingProducts = false;
private static boolean _workingSaves = false;
public BuyListTaskManager() public BuyListTaskManager()
{ {
ThreadPool.scheduleAtFixedRate(() -> ThreadPool.scheduleAtFixedRate(() ->
{ {
if (_working) if (_workingProducts)
{ {
return; return;
} }
_working = true; _workingProducts = true;
final long currentTime = System.currentTimeMillis(); final long currentTime = System.currentTimeMillis();
for (Entry<Product, Long> entry : PRODUCTS.entrySet()) for (Entry<Product, Long> entry : PRODUCTS.entrySet())
@ -48,12 +52,40 @@ public class BuyListTaskManager
{ {
final Product product = entry.getKey(); final Product product = entry.getKey();
PRODUCTS.remove(product); PRODUCTS.remove(product);
product.restock(); synchronized (PENDING_UPDATES)
{
if (!PENDING_UPDATES.contains(product))
{
PENDING_UPDATES.add(product);
}
}
} }
} }
_working = false; _workingProducts = false;
}, 1000, 60000); }, 1000, 60000);
ThreadPool.scheduleAtFixedRate(() ->
{
if (_workingSaves)
{
return;
}
_workingSaves = true;
if (!PENDING_UPDATES.isEmpty())
{
final Product product;
synchronized (PENDING_UPDATES)
{
product = PENDING_UPDATES.get(0);
PENDING_UPDATES.remove(product);
}
product.restock();
}
_workingSaves = false;
}, 50, 50);
} }
public void add(Product product, long endTime) public void add(Product product, long endTime)

View File

@ -16,6 +16,8 @@
*/ */
package org.l2jmobius.gameserver.taskmanager; package org.l2jmobius.gameserver.taskmanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -29,17 +31,19 @@ import org.l2jmobius.gameserver.model.buylist.Product;
public class BuyListTaskManager public class BuyListTaskManager
{ {
private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>(); private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>();
private static boolean _working = false; private static final List<Product> PENDING_UPDATES = new ArrayList<>();
private static boolean _workingProducts = false;
private static boolean _workingSaves = false;
public BuyListTaskManager() public BuyListTaskManager()
{ {
ThreadPool.scheduleAtFixedRate(() -> ThreadPool.scheduleAtFixedRate(() ->
{ {
if (_working) if (_workingProducts)
{ {
return; return;
} }
_working = true; _workingProducts = true;
final long currentTime = System.currentTimeMillis(); final long currentTime = System.currentTimeMillis();
for (Entry<Product, Long> entry : PRODUCTS.entrySet()) for (Entry<Product, Long> entry : PRODUCTS.entrySet())
@ -48,12 +52,40 @@ public class BuyListTaskManager
{ {
final Product product = entry.getKey(); final Product product = entry.getKey();
PRODUCTS.remove(product); PRODUCTS.remove(product);
product.restock(); synchronized (PENDING_UPDATES)
{
if (!PENDING_UPDATES.contains(product))
{
PENDING_UPDATES.add(product);
}
}
} }
} }
_working = false; _workingProducts = false;
}, 1000, 60000); }, 1000, 60000);
ThreadPool.scheduleAtFixedRate(() ->
{
if (_workingSaves)
{
return;
}
_workingSaves = true;
if (!PENDING_UPDATES.isEmpty())
{
final Product product;
synchronized (PENDING_UPDATES)
{
product = PENDING_UPDATES.get(0);
PENDING_UPDATES.remove(product);
}
product.restock();
}
_workingSaves = false;
}, 50, 50);
} }
public void add(Product product, long endTime) public void add(Product product, long endTime)

View File

@ -16,6 +16,8 @@
*/ */
package org.l2jmobius.gameserver.taskmanager; package org.l2jmobius.gameserver.taskmanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -29,17 +31,19 @@ import org.l2jmobius.gameserver.model.buylist.Product;
public class BuyListTaskManager public class BuyListTaskManager
{ {
private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>(); private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>();
private static boolean _working = false; private static final List<Product> PENDING_UPDATES = new ArrayList<>();
private static boolean _workingProducts = false;
private static boolean _workingSaves = false;
public BuyListTaskManager() public BuyListTaskManager()
{ {
ThreadPool.scheduleAtFixedRate(() -> ThreadPool.scheduleAtFixedRate(() ->
{ {
if (_working) if (_workingProducts)
{ {
return; return;
} }
_working = true; _workingProducts = true;
final long currentTime = System.currentTimeMillis(); final long currentTime = System.currentTimeMillis();
for (Entry<Product, Long> entry : PRODUCTS.entrySet()) for (Entry<Product, Long> entry : PRODUCTS.entrySet())
@ -48,12 +52,40 @@ public class BuyListTaskManager
{ {
final Product product = entry.getKey(); final Product product = entry.getKey();
PRODUCTS.remove(product); PRODUCTS.remove(product);
product.restock(); synchronized (PENDING_UPDATES)
{
if (!PENDING_UPDATES.contains(product))
{
PENDING_UPDATES.add(product);
}
}
} }
} }
_working = false; _workingProducts = false;
}, 1000, 60000); }, 1000, 60000);
ThreadPool.scheduleAtFixedRate(() ->
{
if (_workingSaves)
{
return;
}
_workingSaves = true;
if (!PENDING_UPDATES.isEmpty())
{
final Product product;
synchronized (PENDING_UPDATES)
{
product = PENDING_UPDATES.get(0);
PENDING_UPDATES.remove(product);
}
product.restock();
}
_workingSaves = false;
}, 50, 50);
} }
public void add(Product product, long endTime) public void add(Product product, long endTime)

View File

@ -16,6 +16,8 @@
*/ */
package org.l2jmobius.gameserver.taskmanager; package org.l2jmobius.gameserver.taskmanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -29,17 +31,19 @@ import org.l2jmobius.gameserver.model.buylist.Product;
public class BuyListTaskManager public class BuyListTaskManager
{ {
private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>(); private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>();
private static boolean _working = false; private static final List<Product> PENDING_UPDATES = new ArrayList<>();
private static boolean _workingProducts = false;
private static boolean _workingSaves = false;
public BuyListTaskManager() public BuyListTaskManager()
{ {
ThreadPool.scheduleAtFixedRate(() -> ThreadPool.scheduleAtFixedRate(() ->
{ {
if (_working) if (_workingProducts)
{ {
return; return;
} }
_working = true; _workingProducts = true;
final long currentTime = System.currentTimeMillis(); final long currentTime = System.currentTimeMillis();
for (Entry<Product, Long> entry : PRODUCTS.entrySet()) for (Entry<Product, Long> entry : PRODUCTS.entrySet())
@ -48,12 +52,40 @@ public class BuyListTaskManager
{ {
final Product product = entry.getKey(); final Product product = entry.getKey();
PRODUCTS.remove(product); PRODUCTS.remove(product);
product.restock(); synchronized (PENDING_UPDATES)
{
if (!PENDING_UPDATES.contains(product))
{
PENDING_UPDATES.add(product);
}
}
} }
} }
_working = false; _workingProducts = false;
}, 1000, 60000); }, 1000, 60000);
ThreadPool.scheduleAtFixedRate(() ->
{
if (_workingSaves)
{
return;
}
_workingSaves = true;
if (!PENDING_UPDATES.isEmpty())
{
final Product product;
synchronized (PENDING_UPDATES)
{
product = PENDING_UPDATES.get(0);
PENDING_UPDATES.remove(product);
}
product.restock();
}
_workingSaves = false;
}, 50, 50);
} }
public void add(Product product, long endTime) public void add(Product product, long endTime)

View File

@ -16,6 +16,8 @@
*/ */
package org.l2jmobius.gameserver.taskmanager; package org.l2jmobius.gameserver.taskmanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -29,17 +31,19 @@ import org.l2jmobius.gameserver.model.buylist.Product;
public class BuyListTaskManager public class BuyListTaskManager
{ {
private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>(); private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>();
private static boolean _working = false; private static final List<Product> PENDING_UPDATES = new ArrayList<>();
private static boolean _workingProducts = false;
private static boolean _workingSaves = false;
public BuyListTaskManager() public BuyListTaskManager()
{ {
ThreadPool.scheduleAtFixedRate(() -> ThreadPool.scheduleAtFixedRate(() ->
{ {
if (_working) if (_workingProducts)
{ {
return; return;
} }
_working = true; _workingProducts = true;
final long currentTime = System.currentTimeMillis(); final long currentTime = System.currentTimeMillis();
for (Entry<Product, Long> entry : PRODUCTS.entrySet()) for (Entry<Product, Long> entry : PRODUCTS.entrySet())
@ -48,12 +52,40 @@ public class BuyListTaskManager
{ {
final Product product = entry.getKey(); final Product product = entry.getKey();
PRODUCTS.remove(product); PRODUCTS.remove(product);
product.restock(); synchronized (PENDING_UPDATES)
{
if (!PENDING_UPDATES.contains(product))
{
PENDING_UPDATES.add(product);
}
}
} }
} }
_working = false; _workingProducts = false;
}, 1000, 60000); }, 1000, 60000);
ThreadPool.scheduleAtFixedRate(() ->
{
if (_workingSaves)
{
return;
}
_workingSaves = true;
if (!PENDING_UPDATES.isEmpty())
{
final Product product;
synchronized (PENDING_UPDATES)
{
product = PENDING_UPDATES.get(0);
PENDING_UPDATES.remove(product);
}
product.restock();
}
_workingSaves = false;
}, 50, 50);
} }
public void add(Product product, long endTime) public void add(Product product, long endTime)

View File

@ -16,6 +16,8 @@
*/ */
package org.l2jmobius.gameserver.taskmanager; package org.l2jmobius.gameserver.taskmanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -29,17 +31,19 @@ import org.l2jmobius.gameserver.model.buylist.Product;
public class BuyListTaskManager public class BuyListTaskManager
{ {
private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>(); private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>();
private static boolean _working = false; private static final List<Product> PENDING_UPDATES = new ArrayList<>();
private static boolean _workingProducts = false;
private static boolean _workingSaves = false;
public BuyListTaskManager() public BuyListTaskManager()
{ {
ThreadPool.scheduleAtFixedRate(() -> ThreadPool.scheduleAtFixedRate(() ->
{ {
if (_working) if (_workingProducts)
{ {
return; return;
} }
_working = true; _workingProducts = true;
final long currentTime = System.currentTimeMillis(); final long currentTime = System.currentTimeMillis();
for (Entry<Product, Long> entry : PRODUCTS.entrySet()) for (Entry<Product, Long> entry : PRODUCTS.entrySet())
@ -48,12 +52,40 @@ public class BuyListTaskManager
{ {
final Product product = entry.getKey(); final Product product = entry.getKey();
PRODUCTS.remove(product); PRODUCTS.remove(product);
product.restock(); synchronized (PENDING_UPDATES)
{
if (!PENDING_UPDATES.contains(product))
{
PENDING_UPDATES.add(product);
}
}
} }
} }
_working = false; _workingProducts = false;
}, 1000, 60000); }, 1000, 60000);
ThreadPool.scheduleAtFixedRate(() ->
{
if (_workingSaves)
{
return;
}
_workingSaves = true;
if (!PENDING_UPDATES.isEmpty())
{
final Product product;
synchronized (PENDING_UPDATES)
{
product = PENDING_UPDATES.get(0);
PENDING_UPDATES.remove(product);
}
product.restock();
}
_workingSaves = false;
}, 50, 50);
} }
public void add(Product product, long endTime) public void add(Product product, long endTime)

View File

@ -16,6 +16,8 @@
*/ */
package org.l2jmobius.gameserver.taskmanager; package org.l2jmobius.gameserver.taskmanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -29,17 +31,19 @@ import org.l2jmobius.gameserver.model.buylist.Product;
public class BuyListTaskManager public class BuyListTaskManager
{ {
private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>(); private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>();
private static boolean _working = false; private static final List<Product> PENDING_UPDATES = new ArrayList<>();
private static boolean _workingProducts = false;
private static boolean _workingSaves = false;
public BuyListTaskManager() public BuyListTaskManager()
{ {
ThreadPool.scheduleAtFixedRate(() -> ThreadPool.scheduleAtFixedRate(() ->
{ {
if (_working) if (_workingProducts)
{ {
return; return;
} }
_working = true; _workingProducts = true;
final long currentTime = System.currentTimeMillis(); final long currentTime = System.currentTimeMillis();
for (Entry<Product, Long> entry : PRODUCTS.entrySet()) for (Entry<Product, Long> entry : PRODUCTS.entrySet())
@ -48,12 +52,40 @@ public class BuyListTaskManager
{ {
final Product product = entry.getKey(); final Product product = entry.getKey();
PRODUCTS.remove(product); PRODUCTS.remove(product);
product.restock(); synchronized (PENDING_UPDATES)
{
if (!PENDING_UPDATES.contains(product))
{
PENDING_UPDATES.add(product);
}
}
} }
} }
_working = false; _workingProducts = false;
}, 1000, 60000); }, 1000, 60000);
ThreadPool.scheduleAtFixedRate(() ->
{
if (_workingSaves)
{
return;
}
_workingSaves = true;
if (!PENDING_UPDATES.isEmpty())
{
final Product product;
synchronized (PENDING_UPDATES)
{
product = PENDING_UPDATES.get(0);
PENDING_UPDATES.remove(product);
}
product.restock();
}
_workingSaves = false;
}, 50, 50);
} }
public void add(Product product, long endTime) public void add(Product product, long endTime)

View File

@ -16,6 +16,8 @@
*/ */
package org.l2jmobius.gameserver.taskmanager; package org.l2jmobius.gameserver.taskmanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -29,17 +31,19 @@ import org.l2jmobius.gameserver.model.buylist.Product;
public class BuyListTaskManager public class BuyListTaskManager
{ {
private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>(); private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>();
private static boolean _working = false; private static final List<Product> PENDING_UPDATES = new ArrayList<>();
private static boolean _workingProducts = false;
private static boolean _workingSaves = false;
public BuyListTaskManager() public BuyListTaskManager()
{ {
ThreadPool.scheduleAtFixedRate(() -> ThreadPool.scheduleAtFixedRate(() ->
{ {
if (_working) if (_workingProducts)
{ {
return; return;
} }
_working = true; _workingProducts = true;
final long currentTime = System.currentTimeMillis(); final long currentTime = System.currentTimeMillis();
for (Entry<Product, Long> entry : PRODUCTS.entrySet()) for (Entry<Product, Long> entry : PRODUCTS.entrySet())
@ -48,12 +52,40 @@ public class BuyListTaskManager
{ {
final Product product = entry.getKey(); final Product product = entry.getKey();
PRODUCTS.remove(product); PRODUCTS.remove(product);
product.restock(); synchronized (PENDING_UPDATES)
{
if (!PENDING_UPDATES.contains(product))
{
PENDING_UPDATES.add(product);
}
}
} }
} }
_working = false; _workingProducts = false;
}, 1000, 60000); }, 1000, 60000);
ThreadPool.scheduleAtFixedRate(() ->
{
if (_workingSaves)
{
return;
}
_workingSaves = true;
if (!PENDING_UPDATES.isEmpty())
{
final Product product;
synchronized (PENDING_UPDATES)
{
product = PENDING_UPDATES.get(0);
PENDING_UPDATES.remove(product);
}
product.restock();
}
_workingSaves = false;
}, 50, 50);
} }
public void add(Product product, long endTime) public void add(Product product, long endTime)

View File

@ -16,6 +16,8 @@
*/ */
package org.l2jmobius.gameserver.taskmanager; package org.l2jmobius.gameserver.taskmanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -29,17 +31,19 @@ import org.l2jmobius.gameserver.model.buylist.Product;
public class BuyListTaskManager public class BuyListTaskManager
{ {
private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>(); private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>();
private static boolean _working = false; private static final List<Product> PENDING_UPDATES = new ArrayList<>();
private static boolean _workingProducts = false;
private static boolean _workingSaves = false;
public BuyListTaskManager() public BuyListTaskManager()
{ {
ThreadPool.scheduleAtFixedRate(() -> ThreadPool.scheduleAtFixedRate(() ->
{ {
if (_working) if (_workingProducts)
{ {
return; return;
} }
_working = true; _workingProducts = true;
final long currentTime = System.currentTimeMillis(); final long currentTime = System.currentTimeMillis();
for (Entry<Product, Long> entry : PRODUCTS.entrySet()) for (Entry<Product, Long> entry : PRODUCTS.entrySet())
@ -48,12 +52,40 @@ public class BuyListTaskManager
{ {
final Product product = entry.getKey(); final Product product = entry.getKey();
PRODUCTS.remove(product); PRODUCTS.remove(product);
product.restock(); synchronized (PENDING_UPDATES)
{
if (!PENDING_UPDATES.contains(product))
{
PENDING_UPDATES.add(product);
}
}
} }
} }
_working = false; _workingProducts = false;
}, 1000, 60000); }, 1000, 60000);
ThreadPool.scheduleAtFixedRate(() ->
{
if (_workingSaves)
{
return;
}
_workingSaves = true;
if (!PENDING_UPDATES.isEmpty())
{
final Product product;
synchronized (PENDING_UPDATES)
{
product = PENDING_UPDATES.get(0);
PENDING_UPDATES.remove(product);
}
product.restock();
}
_workingSaves = false;
}, 50, 50);
} }
public void add(Product product, long endTime) public void add(Product product, long endTime)

View File

@ -16,6 +16,8 @@
*/ */
package org.l2jmobius.gameserver.taskmanager; package org.l2jmobius.gameserver.taskmanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -29,17 +31,19 @@ import org.l2jmobius.gameserver.model.buylist.Product;
public class BuyListTaskManager public class BuyListTaskManager
{ {
private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>(); private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>();
private static boolean _working = false; private static final List<Product> PENDING_UPDATES = new ArrayList<>();
private static boolean _workingProducts = false;
private static boolean _workingSaves = false;
public BuyListTaskManager() public BuyListTaskManager()
{ {
ThreadPool.scheduleAtFixedRate(() -> ThreadPool.scheduleAtFixedRate(() ->
{ {
if (_working) if (_workingProducts)
{ {
return; return;
} }
_working = true; _workingProducts = true;
final long currentTime = System.currentTimeMillis(); final long currentTime = System.currentTimeMillis();
for (Entry<Product, Long> entry : PRODUCTS.entrySet()) for (Entry<Product, Long> entry : PRODUCTS.entrySet())
@ -48,12 +52,40 @@ public class BuyListTaskManager
{ {
final Product product = entry.getKey(); final Product product = entry.getKey();
PRODUCTS.remove(product); PRODUCTS.remove(product);
product.restock(); synchronized (PENDING_UPDATES)
{
if (!PENDING_UPDATES.contains(product))
{
PENDING_UPDATES.add(product);
}
}
} }
} }
_working = false; _workingProducts = false;
}, 1000, 60000); }, 1000, 60000);
ThreadPool.scheduleAtFixedRate(() ->
{
if (_workingSaves)
{
return;
}
_workingSaves = true;
if (!PENDING_UPDATES.isEmpty())
{
final Product product;
synchronized (PENDING_UPDATES)
{
product = PENDING_UPDATES.get(0);
PENDING_UPDATES.remove(product);
}
product.restock();
}
_workingSaves = false;
}, 50, 50);
} }
public void add(Product product, long endTime) public void add(Product product, long endTime)

View File

@ -16,6 +16,8 @@
*/ */
package org.l2jmobius.gameserver.taskmanager; package org.l2jmobius.gameserver.taskmanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -29,17 +31,19 @@ import org.l2jmobius.gameserver.model.buylist.Product;
public class BuyListTaskManager public class BuyListTaskManager
{ {
private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>(); private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>();
private static boolean _working = false; private static final List<Product> PENDING_UPDATES = new ArrayList<>();
private static boolean _workingProducts = false;
private static boolean _workingSaves = false;
public BuyListTaskManager() public BuyListTaskManager()
{ {
ThreadPool.scheduleAtFixedRate(() -> ThreadPool.scheduleAtFixedRate(() ->
{ {
if (_working) if (_workingProducts)
{ {
return; return;
} }
_working = true; _workingProducts = true;
final long currentTime = System.currentTimeMillis(); final long currentTime = System.currentTimeMillis();
for (Entry<Product, Long> entry : PRODUCTS.entrySet()) for (Entry<Product, Long> entry : PRODUCTS.entrySet())
@ -48,12 +52,40 @@ public class BuyListTaskManager
{ {
final Product product = entry.getKey(); final Product product = entry.getKey();
PRODUCTS.remove(product); PRODUCTS.remove(product);
product.restock(); synchronized (PENDING_UPDATES)
{
if (!PENDING_UPDATES.contains(product))
{
PENDING_UPDATES.add(product);
}
}
} }
} }
_working = false; _workingProducts = false;
}, 1000, 60000); }, 1000, 60000);
ThreadPool.scheduleAtFixedRate(() ->
{
if (_workingSaves)
{
return;
}
_workingSaves = true;
if (!PENDING_UPDATES.isEmpty())
{
final Product product;
synchronized (PENDING_UPDATES)
{
product = PENDING_UPDATES.get(0);
PENDING_UPDATES.remove(product);
}
product.restock();
}
_workingSaves = false;
}, 50, 50);
} }
public void add(Product product, long endTime) public void add(Product product, long endTime)

View File

@ -16,6 +16,8 @@
*/ */
package org.l2jmobius.gameserver.taskmanager; package org.l2jmobius.gameserver.taskmanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -29,17 +31,19 @@ import org.l2jmobius.gameserver.model.buylist.Product;
public class BuyListTaskManager public class BuyListTaskManager
{ {
private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>(); private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>();
private static boolean _working = false; private static final List<Product> PENDING_UPDATES = new ArrayList<>();
private static boolean _workingProducts = false;
private static boolean _workingSaves = false;
public BuyListTaskManager() public BuyListTaskManager()
{ {
ThreadPool.scheduleAtFixedRate(() -> ThreadPool.scheduleAtFixedRate(() ->
{ {
if (_working) if (_workingProducts)
{ {
return; return;
} }
_working = true; _workingProducts = true;
final long currentTime = System.currentTimeMillis(); final long currentTime = System.currentTimeMillis();
for (Entry<Product, Long> entry : PRODUCTS.entrySet()) for (Entry<Product, Long> entry : PRODUCTS.entrySet())
@ -48,12 +52,40 @@ public class BuyListTaskManager
{ {
final Product product = entry.getKey(); final Product product = entry.getKey();
PRODUCTS.remove(product); PRODUCTS.remove(product);
product.restock(); synchronized (PENDING_UPDATES)
{
if (!PENDING_UPDATES.contains(product))
{
PENDING_UPDATES.add(product);
}
}
} }
} }
_working = false; _workingProducts = false;
}, 1000, 60000); }, 1000, 60000);
ThreadPool.scheduleAtFixedRate(() ->
{
if (_workingSaves)
{
return;
}
_workingSaves = true;
if (!PENDING_UPDATES.isEmpty())
{
final Product product;
synchronized (PENDING_UPDATES)
{
product = PENDING_UPDATES.get(0);
PENDING_UPDATES.remove(product);
}
product.restock();
}
_workingSaves = false;
}, 50, 50);
} }
public void add(Product product, long endTime) public void add(Product product, long endTime)

View File

@ -16,6 +16,8 @@
*/ */
package org.l2jmobius.gameserver.taskmanager; package org.l2jmobius.gameserver.taskmanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -29,17 +31,19 @@ import org.l2jmobius.gameserver.model.buylist.Product;
public class BuyListTaskManager public class BuyListTaskManager
{ {
private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>(); private static final Map<Product, Long> PRODUCTS = new ConcurrentHashMap<>();
private static boolean _working = false; private static final List<Product> PENDING_UPDATES = new ArrayList<>();
private static boolean _workingProducts = false;
private static boolean _workingSaves = false;
public BuyListTaskManager() public BuyListTaskManager()
{ {
ThreadPool.scheduleAtFixedRate(() -> ThreadPool.scheduleAtFixedRate(() ->
{ {
if (_working) if (_workingProducts)
{ {
return; return;
} }
_working = true; _workingProducts = true;
final long currentTime = System.currentTimeMillis(); final long currentTime = System.currentTimeMillis();
for (Entry<Product, Long> entry : PRODUCTS.entrySet()) for (Entry<Product, Long> entry : PRODUCTS.entrySet())
@ -48,12 +52,40 @@ public class BuyListTaskManager
{ {
final Product product = entry.getKey(); final Product product = entry.getKey();
PRODUCTS.remove(product); PRODUCTS.remove(product);
product.restock(); synchronized (PENDING_UPDATES)
{
if (!PENDING_UPDATES.contains(product))
{
PENDING_UPDATES.add(product);
}
}
} }
} }
_working = false; _workingProducts = false;
}, 1000, 60000); }, 1000, 60000);
ThreadPool.scheduleAtFixedRate(() ->
{
if (_workingSaves)
{
return;
}
_workingSaves = true;
if (!PENDING_UPDATES.isEmpty())
{
final Product product;
synchronized (PENDING_UPDATES)
{
product = PENDING_UPDATES.get(0);
PENDING_UPDATES.remove(product);
}
product.restock();
}
_workingSaves = false;
}, 50, 50);
} }
public void add(Product product, long endTime) public void add(Product product, long endTime)