swim
swim copied to clipboard
Join Map Lane creates duplicate didUpdate callbacks
If a Join Map Lane is created with a didUpdate
callback and another one is added in the didStart
method of the agent, the first one is duplicated.
Example:
BasicPlane.java
public class BasicPlane extends AbstractPlane {
@SwimRoute("/unit/:id")
AgentRoute<UnitAgent> unitAgentType;
public static void main(String[] args) {
final Kernel kernel = ServerLoader.loadServer();
final ActorSpace space = (ActorSpace) kernel.getSpace("basic");
kernel.start();
System.out.println("Running Basic server...");
kernel.run();
space.command("/unit/foo", "wakeup", Value.absent());
}
}
UnitAgent.java
public class UnitAgent extends AbstractAgent {
@SwimLane("shoppingCart")
MapLane<String, Integer> shoppingCart = this.<String, Integer>mapLane();
@SwimLane("addItem")
CommandLane<String> publish = this.<String>commandLane()
.onCommand(msg -> {
final int n = this.shoppingCart.getOrDefault(msg, 0) + 1;
this.shoppingCart.put(msg, n);
});
@SwimLane("join")
JoinMapLane<String, String, Integer> stateStreetStats = this.<String, String, Integer>joinMapLane().didUpdate((key, newValue, oldValue) -> {
System.out.println("join map lane: " + key + " count changed to " + newValue + " from " + oldValue);
});
@Override
public void didStart() {
stateStreetStats.downlink("foo").hostUri("warp://127.0.0.1:9001").nodeUri("/unit/foo").laneUri("shoppingCart").open()
.didUpdate((key, newValue, oldValue) -> {
System.out.println("join map lane agent didStart: " + key + " count changed to " + newValue + " from " + oldValue);
});
}
}
Input
@command(node:"/unit/foo", lane:"addItem")"foo"
Output
join map lane: foo count changed to 1 from 1
join map lane agent didStart: foo count changed to 1 from 0
join map lane: foo count changed to 1 from 1
(The last line should not be present)
The problem does NOT happen if the second downlink and didUpadate
method are created using the plane context.