Github user zd-project commented on the issue:
https://github.com/apache/storm/pull/2743
Explanation on abstraction and usage.
```java
//Interface that provides #stopTiming and #hasStopped helper method
public interface TimerDecorated extends AutoCloseable {}
//Subclass of LocalAssignment
public class TimerDecoratedAssignment extends LocalAssignment implements
TimerDecorated {}
//Base implementation of Timed decorators
public class Timed<T> implements TimerDecorated {}
public class TimedResource<T extends AutoCloseable> extends Timed<T> {}
public class TimedWritableByteChannel extends
TimedResource<WritableByteChannel> implements WritableByteChannel {}
```
- Tracking time on the topology jar upload to Nimbus
- Originally, Nimbus gets notified of the upload through callback
`beginFileUpload()`, `uploadChunk()`, and `finishFileUpload()`, all of which
depends on a map from `Path` to `WritableByteChannel`. `WritableByteChannel` is
the actual object that handles data I/O, so by implementing
`WritableByteChannel` with a decorator `TimedWritableByteChannel` , we're able
to track the timing with only one line change in `Nimbus.java`
```java
public String beginFileUpload() throws AuthorizationException, TException {
try {
...
String fileloc = ...;
- uploaders.put(fileloc, Channels.newChannel(new
FileOutputStream(fileloc)));
+ uploaders.put(fileloc, new
TimedWritableByteChannel(Channels.newChannel(new FileOutputStream(fileloc)),
fileUploadDuration));
return fileloc;
} catch (Exception e) {
...;
}
}
```
- Tracking time for a worker to launch an assignment
- A worker slot receives assignment asynchronously and execute based on
a State Machine model. We can attach the timer to the assignment itself to
minimize the code refactoring. However, because `LocalAssignment` itself is
generated from Thrift protocol and does not have a complete interface, it's not
ideal to use a decorator. Hence I choose to inherit from `LocalAssignment`
instead and declare `TimerDecoratedAssignment` class that implements
`TimerDecorated` directly. This way it's less obtrusive to the existing code.
---