summary |
shortlog |
log |
commit | commitdiff |
review |
tree
raw |
patch |
inline | side by side (from parent 1:
c59d11d)
The API contract is indicative of the fact that a Context is really
a resource which needs to be closed. Express this in code and take
advantage of availability of try-with.
Change-Id: I17ebc9e458ad43888fed868a89256cbb0fca7b87
Signed-off-by: Robert Varga <rovarga@cisco.com>
- * MessageTracker.Context context = tracker.received(message);
+ * try (MessageTracker.Context context = tracker.received(message)) {
- * if(context.error().isPresent()){
- * LOG.error("{}", context.error().get());
- * }
- *
- * // Some custom processing
- * process(message);
+ * if (context.error().isPresent()){
+ * LOG.error("{}", context.error().get());
+ * }
+ * // Some custom processing
+ * process(message);
+ * }
*
* </pre>
*/
@Beta
@NotThreadSafe
public final class MessageTracker {
*
* </pre>
*/
@Beta
@NotThreadSafe
public final class MessageTracker {
- public static abstract class Context {
+ public static abstract class Context implements AutoCloseable {
Context() {
// Hidden to prevent outside instantiation
}
Context() {
// Hidden to prevent outside instantiation
}
- public abstract Context done();
public abstract Optional<Error> error();
public abstract Optional<Error> error();
+
+ @Override
+ public abstract void close();
}
public interface Error {
}
public interface Error {
private static final Logger LOG = LoggerFactory.getLogger(MessageTracker.class);
private static final Context NO_OP_CONTEXT = new Context() {
@Override
private static final Logger LOG = LoggerFactory.getLogger(MessageTracker.class);
private static final Context NO_OP_CONTEXT = new Context() {
@Override
- public Context done() {
- return this;
+ public void close() {
+ // No-op
abstract Stopwatch stopTimer();
@Override
abstract Stopwatch stopTimer();
@Override
- public final Context done() {
+ public final void close() {
processed(message(), stopTimer().elapsed(NANOSECONDS));
processed(message(), stopTimer().elapsed(NANOSECONDS));
@Override
protected void handleCommand(final Object message) {
@Override
protected void handleCommand(final Object message) {
+ try (final MessageTracker.Context context = appendEntriesReplyTracker.received(message)) {
+ final Optional<Error> maybeError = context.error();
+ if (maybeError.isPresent()) {
+ LOG.trace("{} : AppendEntriesReply failed to arrive at the expected interval {}", persistenceId(),
+ maybeError.get());
+ }
- final MessageTracker.Context context = appendEntriesReplyTracker.received(message);
- final Optional<Error> maybeError = context.error();
- if (maybeError.isPresent()) {
- LOG.trace("{} : AppendEntriesReply failed to arrive at the expected interval {}", persistenceId(),
- maybeError.get());
- }
-
- try {
if (CreateTransaction.isSerializedType(message)) {
handleCreateTransaction(message);
} else if (message instanceof BatchedModifications) {
if (CreateTransaction.isSerializedType(message)) {
handleCreateTransaction(message);
} else if (message instanceof BatchedModifications) {
} else {
super.handleCommand(message);
}
} else {
super.handleCommand(message);
}
- } finally {
- context.done();
@Test
public void testNoTracking() {
MessageTracker.Context context1 = messageTracker.received(new Foo());
@Test
public void testNoTracking() {
MessageTracker.Context context1 = messageTracker.received(new Foo());
ticker.increment(MILLISECONDS.toNanos(20));
MessageTracker.Context context2 = messageTracker.received(new Foo());
ticker.increment(MILLISECONDS.toNanos(20));
MessageTracker.Context context2 = messageTracker.received(new Foo());
messageTracker.begin();
MessageTracker.Context context1 = messageTracker.received(new Foo());
messageTracker.begin();
MessageTracker.Context context1 = messageTracker.received(new Foo());
ticker.increment(MILLISECONDS.toNanos(20));
ticker.increment(MILLISECONDS.toNanos(20));
messageTracker.begin();
MessageTracker.Context context1 = messageTracker.received(new Foo());
messageTracker.begin();
MessageTracker.Context context1 = messageTracker.received(new Foo());
- messageTracker.received("A").done();
- messageTracker.received(10L).done();
+ messageTracker.received("A").close();
+ messageTracker.received(10L).close();
MessageTracker.Context c = messageTracker.received(100);
ticker.increment(MILLISECONDS.toNanos(20));
MessageTracker.Context c = messageTracker.received(100);
ticker.increment(MILLISECONDS.toNanos(20));
MessageTracker.Context context2 = messageTracker.received(new Foo());
MessageTracker.Context context2 = messageTracker.received(new Foo());
messageTracker.begin();
MessageTracker.Context context1 = messageTracker.received(new Foo());
messageTracker.begin();
MessageTracker.Context context1 = messageTracker.received(new Foo());
ticker.increment(MILLISECONDS.toNanos(1));
ticker.increment(MILLISECONDS.toNanos(1));
- MessageTracker.Context context1 = messageTracker.received(Integer.valueOf(45)).done();
-
- Assert.assertEquals(false, context1.error().isPresent());
-
- MessageTracker.Context context2 = messageTracker.received(Long.valueOf(45)).done();
-
- Assert.assertEquals(false, context2.error().isPresent());
+ try (MessageTracker.Context ctx = messageTracker.received(45)) {
+ Assert.assertEquals(false, ctx.error().isPresent());
+ }
+ try (MessageTracker.Context ctx = messageTracker.received(45L)) {
+ Assert.assertEquals(false, ctx.error().isPresent());
+ }
List<MessageTracker.MessageProcessingTime> processingTimeList =
messageTracker.getMessagesSinceLastExpectedMessage();
List<MessageTracker.MessageProcessingTime> processingTimeList =
messageTracker.getMessagesSinceLastExpectedMessage();