Add ActorTimer and related (#51)

* Add ActorTimer and related

* cr
This commit is contained in:
Leon Mai 2019-12-17 13:22:30 -08:00 committed by Artur Souza
parent 6733fcdda8
commit 753ff87d03
3 changed files with 186 additions and 0 deletions

View File

@ -0,0 +1,41 @@
package io.dapr.actors.runtime;
import java.time.Duration;
import java.util.function.Function;
/**
* Represents the timer set on an Actor.
*/
public interface ActorTimer {
/**
* Gets the time when timer is first due.
* @return Time as Duration when timer is first due.
*/
Duration getDueTime();
/**
* Gets the periodic time when timer will be invoked.
* @return Periodic time as Duration when timer will be invoked.
*/
Duration getPeriod();
/**
* Gets the name of the Timer. The name is unique per actor.
* @return The name of the timer.
*/
String getName();
/**
*
* @return Gets a delegate that specifies a method to be called when the timer fires.
* It has one parameter: the state object passed to RegisterTimer.
*/
Function<Object, Void> getAsyncCallback();
/**
*
* @return Gets state containing information to be used by the callback method, or null.
*/
Object getState();
}

View File

@ -0,0 +1,88 @@
package io.dapr.actors.runtime;
import org.json.JSONObject;
import java.time.Duration;
import java.util.function.Function;
/**
* Represents the timer set on an Actor.
*/
class ActorTimerImpl implements ActorTimer {
private final AbstractActor owner;
private String name;
private Function<Object, Void> asyncCallback;
private Object state;
private Duration dueTime;
private Duration period;
/**
*
* @param owner The Actor that owns this timer. The timer callback will be fired for this Actor.
* @param timerName The name of the timer.
* @param asyncCallback The callback to invoke when the timer fires.
* @param state information to be used by the callback method
* @param dueTime the time when timer is first due.
* @param period the periodic time when timer will be invoked.
*/
public ActorTimerImpl(AbstractActor owner, String timerName, Function<Object, Void> asyncCallback, Object state, Duration dueTime, Duration period) {
this.owner = owner;
this.name = timerName;
this.asyncCallback = asyncCallback;
this.state = state;
this.dueTime = dueTime;
this.period = period;
}
/**
* Gets the name of the Timer. The name is unique per actor.
* @return The name of the timer.
*/
public String getName() {
return this.name;
}
/**
* Gets the time when timer is first due.
* @return Time as Duration when timer is first due.
*/
public Duration getDueTime() {
return this.dueTime;
}
/**
* @return Gets a delegate that specifies a method to be called when the timer fires.
* It has one parameter: the state object passed to RegisterTimer.
*/
public Function<Object, Void> getAsyncCallback() {
return this.asyncCallback;
}
/**
* Gets the periodic time when timer will be invoked.
* @return Periodic time as Duration when timer will be invoked.
*/
public Duration getPeriod() {
return this.period;
}
/**
*
* @return Gets state containing information to be used by the callback method, or null.
*/
public Object getState() {
return this.state;
}
/**
*
* @return
*/
String serialize()
{
JSONObject j = new JSONObject();
j.put("dueTime", ConverterUtils.ConvertDurationToDaprFormat(this.getDueTime()));
j.put("period", ConverterUtils.ConvertDurationToDaprFormat(this.getPeriod()));
return j.toString();
}
}

View File

@ -0,0 +1,57 @@
package io.dapr.actors.runtime;
import org.junit.Assert;
import org.junit.Test;
import java.time.Duration;
public class ActorTimerImplTest {
@Test
public void serialize() {
Duration dueTime = Duration.ZERO
.plusMinutes(7)
.plusSeconds(17);
Duration period = Duration.ZERO
.plusHours(1)
.plusSeconds(3);
ActorTimerImpl timer = new ActorTimerImpl(
null,
"testTimer",
null,
null,
dueTime,
period);
String s = timer.serialize();
String expected = "{\"period\":\"1h0m3s0ms\",\"dueTime\":\"0h7m17s0ms\"}";
Assert.assertEquals(expected, s);
}
@Test
public void serializeWithOneTimePeriod() {
Duration dueTime = Duration.ZERO
.plusMinutes(7)
.plusSeconds(17);
// this is intentionally negative
Duration period = Duration.ZERO
.minusHours(1)
.minusMinutes(3);
ActorTimerImpl timer = new ActorTimerImpl(
null,
"testTimer",
null,
null,
dueTime,
period);
String s = timer.serialize();
// A negative period will be serialized to an empty string which is interpreted by Dapr to mean fire once only.
String expected = "{\"period\":\"\",\"dueTime\":\"0h7m17s0ms\"}";
Assert.assertEquals(expected, s);
}
}