Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions sdk/src/main/java/io/dapr/actors/runtime/ActorTimer.java
Original file line number Diff line number Diff line change
@@ -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();
}
88 changes: 88 additions & 0 deletions sdk/src/main/java/io/dapr/actors/runtime/ActorTimerImpl.java
Original file line number Diff line number Diff line change
@@ -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;
Comment thread
LMWF marked this conversation as resolved.
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()
{
Comment thread
artursouza marked this conversation as resolved.
JSONObject j = new JSONObject();
j.put("dueTime", ConverterUtils.ConvertDurationToDaprFormat(this.getDueTime()));
j.put("period", ConverterUtils.ConvertDurationToDaprFormat(this.getPeriod()));
return j.toString();
}
}
57 changes: 57 additions & 0 deletions sdk/src/test/java/io/dapr/actors/runtime/ActorTimerImplTest.java
Original file line number Diff line number Diff line change
@@ -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);
}
}