@@ -13,7 +13,7 @@ public class TransportWrapper {
1313
1414 private final Transport transport ;
1515
16- private final Map <Member , Integer > addressIndexByMember = new ConcurrentHashMap <>();
16+ private final Map <Member , AtomicInteger > addressIndexByMember = new ConcurrentHashMap <>();
1717
1818 public TransportWrapper (Transport transport ) {
1919 this .transport = transport ;
@@ -27,27 +27,21 @@ public TransportWrapper(Transport transport) {
2727 * @return mono result
2828 */
2929 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 ());
3033 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 ));
5145 }
5246
5347 /**
@@ -58,26 +52,20 @@ public Mono<Message> requestResponse(Member member, Message request) {
5852 * @return mono result
5953 */
6054 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 ());
6158 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 ));
8270 }
8371}
0 commit comments