javaerlangjinterface

How do I handle only the newest message in the erlang queue?


I am writing a game engine in Erlang where the server is constantly sending new positions to the client. I want to just use the latest message and throw the rest away, is there some way I can do that? I am using Jinterface on the client side, so a solution for that would be nice.


Solution

  • In erlang, it is not possible (directly) to do what you say. But you can use an intermediate server to achieve this behavior. the role of this server would be to receive all messages and keep a copy of the latest one, and to answer to a client request by sending this message.

    -module(latest).
    
    -compile([export_all]).
    
    
    start() ->
        P = spawn(fun() -> loop(empty) end),
        register(?MODULE,P).
    
    loop(Last) ->
        receive
            {newpos,X} -> loop(X);
            {getpos,Pid} -> Pid ! Last, loop(empty);
            stop -> stopped
        end.
    % interfaces
    
    storepos(X) -> ?MODULE ! {newpos,X}.
    
    getpos() -> 
        ?MODULE ! {getpos,self()},
        receive
            M -> M
        end.
    
    stop() -> ?MODULE ! stop.
    
    % test func
    
    test() ->
        start(),
        P1 = spawn(fun() -> posloop(0) end),
        P2 = spawn(fun() -> clientloop() end),
        {P1,P2}.
    
    endtest({P1,P2}) ->
        exit(P1,kill),
        exit(P2,kill),
        stop().
    
    posloop(I) ->
        storepos(I),
        timer:sleep(random:uniform(50)),
        posloop(I+1).
    
    clientloop() ->
        io:format("position at ~p is ~p~n",[erlang:now(),getpos()]),
        timer:sleep(random:uniform(200)),
        clientloop().
    

    test result:

    1> A = latest:test().
    position at {1399,377773,874000} is 0
    {<0.64.0>,<0.65.0>}
    position at {1399,377773,967000} is 2
    position at {1399,377774,124000} is 6
    position at {1399,377774,327000} is 12
    position at {1399,377774,436000} is 17
    position at {1399,377774,514000} is 19
    position at {1399,377774,639000} is 24
    position at {1399,377774,827000} is 30
    position at {1399,377774,967000} is 34
    position at {1399,377775,77000} is 38
    position at {1399,377775,202000} is 42
    position at {1399,377775,233000} is 43
    position at {1399,377775,280000} is 44
    position at {1399,377775,436000} is 47
    position at {1399,377775,483000} is 48
    position at {1399,377775,608000} is 52
    position at {1399,377775,655000} is 54
    position at {1399,377775,749000} is 57
    position at {1399,377775,842000} is 60
    position at {1399,377775,858000} is empty
    position at {1399,377775,983000} is 63
    position at {1399,377776,92000} is 66
    position at {1399,377776,186000} is 69
    2> latest:endtest(A).
    stop
    3>