Skip to content

Commit d4c93ab

Browse files
committed
adding javadoc and test. undoing channel close change
1 parent caec3f7 commit d4c93ab

File tree

5 files changed

+118
-16
lines changed

5 files changed

+118
-16
lines changed

src/main/java/com/rabbitmq/client/ConnectionFactory.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ public class ConnectionFactory implements Cloneable {
7777

7878
/** The default continuation timeout for RPC calls in channels: 10 minutes */
7979
public static final int DEFAULT_CHANNEL_RPC_TIMEOUT = (int) MINUTES.toMillis(10);
80+
81+
/** The default network recovery interval: 5000 millis */
82+
public static final long DEFAULT_NETWORK_RECOVERY_INTERVAL = 5000;
8083

8184
private static final String PREFERRED_TLS_PROTOCOL = "TLSv1.2";
8285

@@ -111,7 +114,7 @@ public class ConnectionFactory implements Cloneable {
111114
// long is used to make sure the users can use both ints
112115
// and longs safely. It is unlikely that anybody'd need
113116
// to use recovery intervals > Integer.MAX_VALUE in practice.
114-
private long networkRecoveryInterval = 5000;
117+
private long networkRecoveryInterval = DEFAULT_NETWORK_RECOVERY_INTERVAL;
115118
private RecoveryDelayHandler recoveryDelayHandler;
116119

117120
private MetricsCollector metricsCollector;
@@ -1080,10 +1083,18 @@ public void setNetworkRecoveryInterval(long networkRecoveryInterval) {
10801083
this.networkRecoveryInterval = networkRecoveryInterval;
10811084
}
10821085

1086+
/**
1087+
* Returns automatic connection recovery delay handler.
1088+
* @return recovery delay handler. May be null if not set.
1089+
*/
10831090
public RecoveryDelayHandler getRecoveryDelayHandler() {
10841091
return recoveryDelayHandler;
10851092
}
10861093

1094+
/**
1095+
* Sets the automatic connection recovery delay handler.
1096+
* @param recoveryDelayHandler the recovery delay handler
1097+
*/
10871098
public void setRecoveryDelayHandler(final RecoveryDelayHandler recoveryDelayHandler) {
10881099
this.recoveryDelayHandler = recoveryDelayHandler;
10891100
}

src/main/java/com/rabbitmq/client/RecoveryDelayHandler.java

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,35 @@
44
import java.util.Collections;
55
import java.util.List;
66

7+
/**
8+
* A RecoveryDelayHandler is used to tell automatic recovery how long to sleep between reconnect attempts.
9+
*
10+
* @since 4.3.0
11+
*/
712
public interface RecoveryDelayHandler {
813

14+
/**
15+
* Get the time to sleep (in milliseconds) before attempting to reconnect and recover again.
16+
* This method will be called with recoveryAttempts=0 before the first recovery attempt and then again after each failed recovery.
17+
*
18+
* @param recoveryAttempts
19+
* The number of recovery attempts so far.
20+
* @return the delay in milliseconds
21+
*/
922
long getDelay(final int recoveryAttempts);
1023

24+
/**
25+
* Basic implementation of {@link RecoveryDelayHandler} that returns the {@link ConnectionFactory#getNetworkRecoveryInterval() network recovery interval} each time.
26+
*/
1127
public static class DefaultRecoveryDelayHandler implements RecoveryDelayHandler {
1228

1329
private final long networkRecoveryInterval;
1430

31+
/**
32+
* Default Constructor
33+
* @param networkRecoveryInterval
34+
* recovery delay time in millis
35+
*/
1536
public DefaultRecoveryDelayHandler(final long networkRecoveryInterval) {
1637
this.networkRecoveryInterval = networkRecoveryInterval;
1738
}
@@ -20,22 +41,34 @@ public DefaultRecoveryDelayHandler(final long networkRecoveryInterval) {
2041
public long getDelay(int recoveryAttempts) {
2142
return networkRecoveryInterval;
2243
}
23-
2444
}
2545

46+
/**
47+
* Backoff implementation of {@link RecoveryDelayHandler} that uses the Fibonacci sequence (by default) to increase the recovery delay time after each failed attempt.
48+
* You can optionally use your own backoff sequence.
49+
*/
2650
public static class ExponentialBackoffDelayHandler implements RecoveryDelayHandler {
2751

2852
private final List<Long> sequence;
2953

54+
/**
55+
* Default Constructor. Uses the fibonacci sequence: {0, 1000, 1000, 2000, 3000, 5000, 8000, 13000, 21000}.
56+
*/
3057
public ExponentialBackoffDelayHandler() {
3158
sequence = Arrays.asList(0L, 1000L, 1000L, 2000L, 3000L, 5000L, 8000L, 13000L, 21000L);
3259
}
3360

61+
/**
62+
* Constructor for passing your own backoff sequence
63+
*
64+
* @param sequence
65+
* List of recovery delay values in milliseconds.
66+
* @throws IllegalArgumentException if the sequence is null or empty
67+
*/
3468
public ExponentialBackoffDelayHandler(final List<Long> sequence) {
35-
if (sequence.isEmpty())
69+
if (sequence == null || sequence.isEmpty())
3670
throw new IllegalArgumentException();
3771
this.sequence = Collections.unmodifiableList(sequence);
38-
3972
}
4073

4174
@Override

src/main/java/com/rabbitmq/client/impl/ConnectionParams.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import com.rabbitmq.client.ExceptionHandler;
1919
import com.rabbitmq.client.RecoveryDelayHandler;
20+
import com.rabbitmq.client.RecoveryDelayHandler.DefaultRecoveryDelayHandler;
2021
import com.rabbitmq.client.SaslConfig;
2122

2223
import java.util.Map;
@@ -105,8 +106,12 @@ public long getNetworkRecoveryInterval() {
105106
return networkRecoveryInterval;
106107
}
107108

109+
/**
110+
* Get the recovery delay handler.
111+
* @return recovery delay handler or if none was set a {@link DefaultRecoveryDelayHandler} will be returned with a delay of {@link #getNetworkRecoveryInterval()}.
112+
*/
108113
public RecoveryDelayHandler getRecoveryDelayHandler() {
109-
return recoveryDelayHandler == null ? new RecoveryDelayHandler.DefaultRecoveryDelayHandler(networkRecoveryInterval) : recoveryDelayHandler;
114+
return recoveryDelayHandler == null ? new DefaultRecoveryDelayHandler(networkRecoveryInterval) : recoveryDelayHandler;
110115
}
111116

112117
public boolean isTopologyRecoveryEnabled() {

src/main/java/com/rabbitmq/client/impl/recovery/AutorecoveringChannel.java

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -67,26 +67,21 @@ public void close() throws IOException, TimeoutException {
6767
try {
6868
delegate.close();
6969
} finally {
70-
recoveryCleanup();
70+
for (String consumerTag : consumerTags) {
71+
this.connection.deleteRecordedConsumer(consumerTag);
72+
}
73+
this.connection.unregisterChannel(this);
7174
}
7275
}
7376

7477
@Override
7578
public void close(int closeCode, String closeMessage) throws IOException, TimeoutException {
7679
try {
77-
delegate.close(closeCode, closeMessage);
80+
delegate.close(closeCode, closeMessage);
7881
} finally {
79-
recoveryCleanup();
82+
this.connection.unregisterChannel(this);
8083
}
8184
}
82-
83-
private void recoveryCleanup() {
84-
for (String consumerTag : consumerTags) {
85-
this.connection.deleteRecordedConsumer(consumerTag);
86-
}
87-
// TODO what about any other recorded queues and bindings that were owned by this channel? They will now cause recovery exceptions.
88-
this.connection.unregisterChannel(this);
89-
}
9085

9186
@Override
9287
@Deprecated
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.rabbitmq.client.test;
2+
3+
import static org.junit.Assert.assertEquals;
4+
5+
import java.util.Arrays;
6+
import java.util.Collections;
7+
8+
import com.rabbitmq.client.RecoveryDelayHandler;
9+
import com.rabbitmq.client.RecoveryDelayHandler.DefaultRecoveryDelayHandler;
10+
import com.rabbitmq.client.RecoveryDelayHandler.ExponentialBackoffDelayHandler;
11+
12+
import org.junit.Test;
13+
14+
public class RecoveryDelayHandlerTest {
15+
16+
@Test
17+
public void testDefaultRecoveryDelayHandler() {
18+
final RecoveryDelayHandler handler = new DefaultRecoveryDelayHandler(5000);
19+
assertEquals(5000L, handler.getDelay(0));
20+
assertEquals(5000L, handler.getDelay(1));
21+
assertEquals(5000L, handler.getDelay(Integer.MAX_VALUE));
22+
}
23+
24+
@Test
25+
public void testExponentialBackoffDelayHandler_default() {
26+
final RecoveryDelayHandler handler = new ExponentialBackoffDelayHandler();
27+
assertEquals(0, handler.getDelay(0));
28+
assertEquals(1000L, handler.getDelay(1));
29+
assertEquals(1000L, handler.getDelay(2));
30+
assertEquals(2000L, handler.getDelay(3));
31+
assertEquals(3000L, handler.getDelay(4));
32+
assertEquals(5000L, handler.getDelay(5));
33+
assertEquals(8000L, handler.getDelay(6));
34+
assertEquals(13000L, handler.getDelay(7));
35+
assertEquals(21000L, handler.getDelay(8));
36+
assertEquals(21000L, handler.getDelay(9));
37+
assertEquals(21000L, handler.getDelay(Integer.MAX_VALUE));
38+
}
39+
40+
@Test
41+
public void testExponentialBackoffDelayHandler_sequence() {
42+
final RecoveryDelayHandler handler = new ExponentialBackoffDelayHandler(Arrays.asList(1L, 2L));
43+
assertEquals(1, handler.getDelay(0));
44+
assertEquals(2, handler.getDelay(1));
45+
assertEquals(2, handler.getDelay(2));
46+
assertEquals(2, handler.getDelay(Integer.MAX_VALUE));
47+
}
48+
49+
@Test(expected=IllegalArgumentException.class)
50+
public void testExponentialBackoffDelayHandler_sequence_null() {
51+
new ExponentialBackoffDelayHandler(null);
52+
}
53+
54+
@Test(expected=IllegalArgumentException.class)
55+
public void testExponentialBackoffDelayHandler_sequence_empty() {
56+
new ExponentialBackoffDelayHandler(Collections.<Long>emptyList());
57+
}
58+
}

0 commit comments

Comments
 (0)