@@ -13,7 +13,7 @@ public class TransportWrapper {
13
13
14
14
private final Transport transport ;
15
15
16
- private final Map <Member , Integer > addressIndexByMember = new ConcurrentHashMap <>();
16
+ private final Map <Member , AtomicInteger > addressIndexByMember = new ConcurrentHashMap <>();
17
17
18
18
public TransportWrapper (Transport transport ) {
19
19
this .transport = transport ;
@@ -27,27 +27,21 @@ public TransportWrapper(Transport transport) {
27
27
* @return mono result
28
28
*/
29
29
public Mono <Message > requestResponse (Member member , Message request ) {
30
+ final List <Address > addresses = member .addresses ();
31
+ final AtomicInteger currentIndex =
32
+ addressIndexByMember .computeIfAbsent (member , m -> new AtomicInteger ());
30
33
return Mono .defer (
31
- () -> {
32
- final List <Address > addresses = member .addresses ();
33
- final int numRetries = addresses .size () - 1 ;
34
- final Integer index = addressIndexByMember .getOrDefault (member , 0 );
35
- final AtomicInteger currentIndex = new AtomicInteger (index );
36
-
37
- return Mono .defer (
38
- () -> {
39
- int increment = currentIndex .getAndIncrement ();
40
-
41
- if (increment == addresses .size ()) {
42
- increment = 0 ;
43
- currentIndex .set (1 );
44
- }
45
-
46
- final Address address = addresses .get (increment );
47
- return transport .requestResponse (address , request );
48
- })
49
- .retry (numRetries );
50
- });
34
+ () -> {
35
+ synchronized (this ) {
36
+ if (currentIndex .get () == addresses .size ()) {
37
+ currentIndex .set (0 );
38
+ }
39
+ final Address address = addresses .get (currentIndex .getAndIncrement ());
40
+ return transport .requestResponse (address , request );
41
+ }
42
+ })
43
+ .retry (addresses .size () - 1 )
44
+ .doOnError (throwable -> addressIndexByMember .remove (member , currentIndex ));
51
45
}
52
46
53
47
/**
@@ -58,26 +52,20 @@ public Mono<Message> requestResponse(Member member, Message request) {
58
52
* @return mono result
59
53
*/
60
54
public Mono <Void > send (Member member , Message request ) {
55
+ final List <Address > addresses = member .addresses ();
56
+ final AtomicInteger currentIndex =
57
+ addressIndexByMember .computeIfAbsent (member , m -> new AtomicInteger ());
61
58
return Mono .defer (
62
- () -> {
63
- final List <Address > addresses = member .addresses ();
64
- final int numRetries = addresses .size () - 1 ;
65
- final Integer index = addressIndexByMember .getOrDefault (member , 0 );
66
- final AtomicInteger currentIndex = new AtomicInteger (index );
67
-
68
- return Mono .defer (
69
- () -> {
70
- int increment = currentIndex .getAndIncrement ();
71
-
72
- if (increment == addresses .size ()) {
73
- increment = 0 ;
74
- currentIndex .set (1 );
75
- }
76
-
77
- final Address address = addresses .get (increment );
78
- return transport .send (address , request );
79
- })
80
- .retry (numRetries );
81
- });
59
+ () -> {
60
+ synchronized (this ) {
61
+ if (currentIndex .get () == addresses .size ()) {
62
+ currentIndex .set (0 );
63
+ }
64
+ final Address address = addresses .get (currentIndex .getAndIncrement ());
65
+ return transport .send (address , request );
66
+ }
67
+ })
68
+ .retry (addresses .size () - 1 )
69
+ .doOnError (throwable -> addressIndexByMember .remove (member , currentIndex ));
82
70
}
83
71
}
0 commit comments