swimos / swim

Full stack application platform for building stateful microservices, streaming APIs, and real-time UIs
https://www.swimos.org
Apache License 2.0
489 stars 39 forks source link

Join Map Lane reporting the same value for both previous and current on didUpdate #66

Open DobromirM opened 3 years ago

DobromirM commented 3 years ago

If a didUpdate callback is added to a JoinMapLane it reports the previous and the current value as the same.

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();
    }

}

Input:

@command(node:"/unit/foo", lane:"addItem")"foo"
@command(node:"/unit/foo", lane:"addItem")"foo"
@command(node:"/unit/foo", lane:"addItem")"foo"

Output:

join map lane: foo count changed to 1 from 1
join map lane: foo count changed to 2 from 2
join map lane: foo count changed to 3 from 3

(The previous value should be one lower than the current)

DobromirM commented 3 years ago

Map lanes and join value lanes are not affected by this.