diff --git a/throttling/etc/throttling-pattern.png b/throttling/etc/throttling-pattern.png
index a31aa54ce..59e590aaf 100644
Binary files a/throttling/etc/throttling-pattern.png and b/throttling/etc/throttling-pattern.png differ
diff --git a/throttling/etc/throttling-pattern.ucls b/throttling/etc/throttling-pattern.ucls
new file mode 100644
index 000000000..8d4d8a5a2
--- /dev/null
+++ b/throttling/etc/throttling-pattern.ucls
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/throttling/src/main/java/com/iluwatar/throttling/App.java b/throttling/src/main/java/com/iluwatar/throttling/App.java
index d6c619359..95e0dedf7 100644
--- a/throttling/src/main/java/com/iluwatar/throttling/App.java
+++ b/throttling/src/main/java/com/iluwatar/throttling/App.java
@@ -53,14 +53,14 @@ public class App {
* @param args main arguments
*/
public static void main(String[] args) {
-
- Tenant adidas = new Tenant("Adidas", 5);
- Tenant nike = new Tenant("Nike", 6);
+ CallsCount callsCount = new CallsCount();
+ Tenant adidas = new Tenant("Adidas", 5, callsCount);
+ Tenant nike = new Tenant("Nike", 6, callsCount);
ExecutorService executorService = Executors.newFixedThreadPool(2);
- executorService.execute(() -> makeServiceCalls(adidas));
- executorService.execute(() -> makeServiceCalls(nike));
+ executorService.execute(() -> makeServiceCalls(adidas, callsCount));
+ executorService.execute(() -> makeServiceCalls(nike, callsCount));
executorService.shutdown();
try {
@@ -73,9 +73,9 @@ public class App {
/**
* Make calls to the B2BService dummy API
*/
- private static void makeServiceCalls(Tenant tenant) {
- Throttler timer = new ThrottleTimerImpl(10);
- B2BService service = new B2BService(timer);
+ private static void makeServiceCalls(Tenant tenant, CallsCount callsCount) {
+ Throttler timer = new ThrottleTimerImpl(10, callsCount);
+ B2BService service = new B2BService(timer, callsCount);
for (int i = 0; i < 20; i++) {
service.dummyCustomerApi(tenant);
// Sleep is introduced to keep the output in check and easy to view and analyze the results.
diff --git a/throttling/src/main/java/com/iluwatar/throttling/B2BService.java b/throttling/src/main/java/com/iluwatar/throttling/B2BService.java
index 51ed492eb..4ef30c48d 100644
--- a/throttling/src/main/java/com/iluwatar/throttling/B2BService.java
+++ b/throttling/src/main/java/com/iluwatar/throttling/B2BService.java
@@ -35,8 +35,10 @@ import java.util.concurrent.ThreadLocalRandom;
class B2BService {
private static final Logger LOGGER = LoggerFactory.getLogger(B2BService.class);
+ private final CallsCount callsCount;
- public B2BService(Throttler timer) {
+ public B2BService(Throttler timer, CallsCount callsCount) {
+ this.callsCount = callsCount;
timer.start();
}
@@ -46,13 +48,13 @@ class B2BService {
*/
public int dummyCustomerApi(Tenant tenant) {
String tenantName = tenant.getName();
- long count = CallsCount.getCount(tenantName);
+ long count = callsCount.getCount(tenantName);
LOGGER.debug("Counter for {} : {} ", tenant.getName(), count);
if (count >= tenant.getAllowedCallsPerSecond()) {
LOGGER.error("API access per second limit reached for: {}", tenantName);
return -1;
}
- CallsCount.incrementCount(tenantName);
+ callsCount.incrementCount(tenantName);
return getRandomCustomerId();
}
diff --git a/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java b/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java
index 9b274849a..2c0afdb35 100644
--- a/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java
+++ b/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java
@@ -38,13 +38,13 @@ import java.util.concurrent.atomic.AtomicLong;
public final class CallsCount {
private static final Logger LOGGER = LoggerFactory.getLogger(CallsCount.class);
- private static Map tenantCallsCount = new ConcurrentHashMap<>();
+ private Map tenantCallsCount = new ConcurrentHashMap<>();
/**
* Add a new tenant to the map.
* @param tenantName name of the tenant.
*/
- public static void addTenant(String tenantName) {
+ public void addTenant(String tenantName) {
tenantCallsCount.putIfAbsent(tenantName, new AtomicLong(0));
}
@@ -52,7 +52,7 @@ public final class CallsCount {
* Increment the count of the specified tenant.
* @param tenantName name of the tenant.
*/
- public static void incrementCount(String tenantName) {
+ public void incrementCount(String tenantName) {
tenantCallsCount.get(tenantName).incrementAndGet();
}
@@ -61,14 +61,14 @@ public final class CallsCount {
* @param tenantName name of the tenant.
* @return the count of the tenant.
*/
- public static long getCount(String tenantName) {
+ public long getCount(String tenantName) {
return tenantCallsCount.get(tenantName).get();
}
/**
* Resets the count of all the tenants in the map.
*/
- public static void reset() {
+ public void reset() {
LOGGER.debug("Resetting the map.");
for (Entry e : tenantCallsCount.entrySet()) {
tenantCallsCount.put(e.getKey(), new AtomicLong(0));
diff --git a/throttling/src/main/java/com/iluwatar/throttling/Tenant.java b/throttling/src/main/java/com/iluwatar/throttling/Tenant.java
index a720e154b..e35251aa0 100644
--- a/throttling/src/main/java/com/iluwatar/throttling/Tenant.java
+++ b/throttling/src/main/java/com/iluwatar/throttling/Tenant.java
@@ -38,13 +38,13 @@ public class Tenant {
* @param allowedCallsPerSecond The number of calls allowed for a particular tenant.
* @throws InvalidParameterException If number of calls is less than 0, throws exception.
*/
- public Tenant(String name, int allowedCallsPerSecond) {
+ public Tenant(String name, int allowedCallsPerSecond, CallsCount callsCount) {
if (allowedCallsPerSecond < 0) {
throw new InvalidParameterException("Number of calls less than 0 not allowed");
}
this.name = name;
this.allowedCallsPerSecond = allowedCallsPerSecond;
- CallsCount.addTenant(name);
+ callsCount.addTenant(name);
}
public String getName() {
diff --git a/throttling/src/main/java/com/iluwatar/throttling/timer/ThrottleTimerImpl.java b/throttling/src/main/java/com/iluwatar/throttling/timer/ThrottleTimerImpl.java
index 4ff4ce246..3d1e68287 100644
--- a/throttling/src/main/java/com/iluwatar/throttling/timer/ThrottleTimerImpl.java
+++ b/throttling/src/main/java/com/iluwatar/throttling/timer/ThrottleTimerImpl.java
@@ -37,10 +37,12 @@ import com.iluwatar.throttling.CallsCount;
*/
public class ThrottleTimerImpl implements Throttler {
- private int throttlePeriod;
-
- public ThrottleTimerImpl(int throttlePeriod) {
+ private final int throttlePeriod;
+ private final CallsCount callsCount;
+
+ public ThrottleTimerImpl(int throttlePeriod, CallsCount callsCount) {
this.throttlePeriod = throttlePeriod;
+ this.callsCount = callsCount;
}
/**
@@ -51,7 +53,7 @@ public class ThrottleTimerImpl implements Throttler {
new Timer(true).schedule(new TimerTask() {
@Override
public void run() {
- CallsCount.reset();
+ callsCount.reset();
}
}, 0, throttlePeriod);
}
diff --git a/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java b/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java
index 39ca5ccd0..bb053fbcb 100644
--- a/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java
+++ b/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java
@@ -33,18 +33,19 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
*/
public class B2BServiceTest {
- @Disabled
+ private CallsCount callsCount = new CallsCount();
+
@Test
public void dummyCustomerApiTest() {
- Tenant tenant = new Tenant("testTenant", 2);
+ Tenant tenant = new Tenant("testTenant", 2, callsCount);
// In order to assure that throttling limits will not be reset, we use an empty throttling implementation
Throttler timer = () -> { };
- B2BService service = new B2BService(timer);
+ B2BService service = new B2BService(timer, callsCount);
for (int i = 0; i < 5; i++) {
service.dummyCustomerApi(tenant);
}
- long counter = CallsCount.getCount(tenant.getName());
+ long counter = callsCount.getCount(tenant.getName());
assertEquals(2, counter, "Counter limit must be reached");
}
}
diff --git a/throttling/src/test/java/com/iluwatar/throttling/TenantTest.java b/throttling/src/test/java/com/iluwatar/throttling/TenantTest.java
index 00e546d02..b16b9a9f0 100644
--- a/throttling/src/test/java/com/iluwatar/throttling/TenantTest.java
+++ b/throttling/src/test/java/com/iluwatar/throttling/TenantTest.java
@@ -36,7 +36,7 @@ public class TenantTest {
@Test
public void constructorTest() {
assertThrows(InvalidParameterException.class, () -> {
- Tenant tenant = new Tenant("FailTenant", -1);
+ Tenant tenant = new Tenant("FailTenant", -1, new CallsCount());
});
}
}