1 package examples.experimental.example3;
2
3 import java.io.IOException;
4
5 import java.util.ArrayList;
6 import java.util.HashSet;
7 import java.util.List;
8 import java.util.concurrent.ExecutionException;
9 import java.util.concurrent.ExecutorService;
10 import java.util.concurrent.Executors;
11 import java.util.concurrent.Future;
12 import java.util.concurrent.TimeUnit;
13 import java.util.concurrent.atomic.AtomicInteger;
14
15 import examples.experimental.example3.classes.MyCallerWithMethodInvokingTask;
16
17 import net.secodo.jcircuitbreaker.breakhandler.BreakHandler;
18 import net.secodo.jcircuitbreaker.breakstrategy.BreakStrategy;
19 import net.secodo.jcircuitbreaker.breakstrategy.impl.LimitedCurrentAverageExecutionTimeStrategy;
20
21
22 public class SimulationWithMethodInvokingTask {
23 public static void main(String[] args) throws ExecutionException, InterruptedException {
24 HashSet<Integer> failedPings = new HashSet<>();
25
26 BreakHandler<Void> failedPingsStoringHandler = (circuitBreaker, task, breakStrategy, executionContext) -> {
27 failedPings.add(task.hashCode());
28 return null;
29 };
30
31 BreakStrategy<Void> breakStrategy = new LimitedCurrentAverageExecutionTimeStrategy<Void>(700);
32
33
34 MyCallerWithMethodInvokingTask myCaller = new MyCallerWithMethodInvokingTask(failedPingsStoringHandler,
35 breakStrategy);
36
37
38
39 ExecutorService executorService = Executors.newWorkStealingPool(10);
40
41 List<Future> responses = new ArrayList<>();
42
43 long start = System.currentTimeMillis();
44
45
46 for (int i = 0; i < 100; i++) {
47 AtomicInteger pingId = new AtomicInteger(i);
48
49 Future<?> response = executorService.submit(() -> {
50 try {
51 myCaller.ping(pingId.get());
52 } catch (Exception e) {
53 System.out.println("Exception while pinging #" + pingId.get());
54 }
55
56 });
57 responses.add(response);
58 }
59
60
61 executorService.shutdown();
62 executorService.awaitTermination(2, TimeUnit.MINUTES);
63
64 long stop = System.currentTimeMillis();
65 System.out.println("Failed pings: " + failedPings.size());
66 System.out.printf("Finished in %d seconds", (int) (stop - start) / 1000);
67
68 }
69
70 }