How to solve Direct self-reference leading to cycle error saving ActorRef on redis in playframework 2.4.6

kml_ckr

I am using playframework 2.4.6 for a mobile chat backend. Everything is ok if I use memory instead of db. I am trying to save states in redis db. The code is below..

This is controller method accepting socket requests..

public WebSocket<String> chat(String roomId,String nick){
    return WebSocket.withActor(new Function<ActorRef, Props>(){
        @Override
        public Props apply(ActorRef actorRef) throws Throwable {
            return WebSocketActor.props(actorRef,new ChatUser(roomId, nick));
        }
    });
}

My Websocket Actor is below

public class WebSocketActor extends UntypedActor{
...
public WebSocketActor(ActorRef actorRef,ChatUser chatUser) {
            mChatUser = chatUser;
            mActorRef = actorRef;
            //redis room fetch
            mRoom = Room.fetchFromRedis(mChatUser.roomId);
            if(mRoom==null)
                mRoom = new Room(mChatUser.roomId);
            mRoom.addSocket(mActorRef);
        }
class Room{
    private String mRoomId;
    //TODO: this list causes error while saving to redis
    private List<ActorRef> mActorRefList;
    public Room() {
        //default no arg constructor
    }
    public Room(String roomId) {
        this.mRoomId = roomId;
        this.mActorRefList = new ArrayList<>();
    }

    public void addSocket(ActorRef actorRef){
        this.mActorRefList.add(actorRef);
        saveToRedis();
    }

    public static Room fetchFromRedis(String roomId){
        Jedis jedis = new Jedis("localhost");
        String roomJson = jedis.get(roomId);
        if(roomJson!=null&&!roomJson.equals(""))
            return Json.fromJson(Json.parse(roomJson),Room.class);
        return null;
    }

    private void saveToRedis(){
        Jedis jedis = new Jedis("localhost");
        JsonNode jsonNode = Json.toJson(this);
        String roomStr = Json.stringify(jsonNode);
        jedis.set(mRoomId, roomStr);
    }
}

I get error while saving my room object to redis because of List type mActorRefList parameter.

Stack trace is below..

[error] - akka.actor.OneForOneStrategy - exception during creation
akka.actor.ActorInitializationException: exception during creation
    at akka.actor.ActorInitializationException$.apply(Actor.scala:166) ~[akka-actor_2.11-2.3.13.jar:na]
    at akka.actor.ActorCell.create(ActorCell.scala:596) ~[akka-actor_2.11-2.3.13.jar:na]
    at akka.actor.ActorCell.invokeAll$1(ActorCell.scala:456) ~[akka-actor_2.11-2.3.13.jar:na]
    at akka.actor.ActorCell.systemInvoke(ActorCell.scala:478) ~[akka-actor_2.11-2.3.13.jar:na]
    at akka.dispatch.Mailbox.processAllSystemMessages(Mailbox.scala:263) ~[akka-actor_2.11-2.3.13.jar:na]
    at akka.dispatch.Mailbox.run(Mailbox.scala:219) ~[akka-actor_2.11-2.3.13.jar:na]
    at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:397) [akka-actor_2.11-2.3.13.jar:na]
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) [scala-library-2.11.6.jar:na]
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) [scala-library-2.11.6.jar:na]
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) [scala-library-2.11.6.jar:na]
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) [scala-library-2.11.6.jar:na]
Caused by: java.lang.reflect.InvocationTargetException: null
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_66]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_66]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_66]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422) ~[na:1.8.0_66]
    at akka.util.Reflect$.instantiate(Reflect.scala:66) ~[akka-actor_2.11-2.3.13.jar:na]
    at akka.actor.ArgsReflectConstructor.produce(Props.scala:355) ~[akka-actor_2.11-2.3.13.jar:na]
    at akka.actor.Props.newActor(Props.scala:255) ~[akka-actor_2.11-2.3.13.jar:na]
    at akka.actor.ActorCell.newActor(ActorCell.scala:552) ~[akka-actor_2.11-2.3.13.jar:na]
    at akka.actor.ActorCell.create(ActorCell.scala:578) ~[akka-actor_2.11-2.3.13.jar:na]
    ... 9 common frames omitted
Caused by: java.lang.RuntimeException: java.lang.IllegalArgumentException: Direct self-reference leading to cycle (through reference chain: actors.Room["mActorRefList"]->java.util.ArrayList[0]->akka.actor.LocalActorRef["parent"]->akka.actor.RepointableActorRef["parent"]->akka.actor.LocalActorRef["parent"]->akka.actor.$anon$1["parent"])
    at play.libs.Json.toJson(Json.java:78) ~[play-json_2.11-2.4.6.jar:2.4.6]
    at actors.Room.saveToRedis(WebSocketActor.java:85) ~[classes/:na]
    at actors.Room.addSocket(WebSocketActor.java:72) ~[classes/:na]
    at actors.WebSocketActor.<init>(WebSocketActor.java:31) ~[classes/:na]
    ... 18 common frames omitted
Caused by: java.lang.IllegalArgumentException: Direct self-reference leading to cycle (through reference chain: actors.Room["mActorRefList"]->java.util.ArrayList[0]->akka.actor.LocalActorRef["parent"]->akka.actor.RepointableActorRef["parent"]->akka.actor.LocalActorRef["parent"]->akka.actor.$anon$1["parent"])
    at com.fasterxml.jackson.databind.ObjectMapper.valueToTree(ObjectMapper.java:2374) ~[jackson-databind-2.5.4.jar:2.5.4]
    at play.libs.Json.toJson(Json.java:76) ~[play-json_2.11-2.4.6.jar:2.4.6]

Any solution ?

Thx..

kml_ckr

I solved my own problem.

You must serialize your actors by akka way. Look at this link

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

Direct self-reference leading to cycle Superclass issue JSON

From Dev

com.fasterxml.jackson.databind.JsonMappingException: Direct self-reference leading to cycle (through reference chain)

From Dev

com.fasterxml.jackson.databind.JsonMappingException: Direct self-reference leading to cycle (through reference chain)

From Dev

How to break a direct reference cycle in CPython

From Dev

How to break a direct reference cycle in CPython

From Dev

How to create a singleton reference in playframework

From Dev

Understanding direct self-reference in Haskell

From Dev

how to solve a TypeError error in rails 4 in the form?

From Dev

How to solve "error LNK2001: unresolved external symbol _CLSID_D2D1Blend" when using Direct2d Effects?

From Dev

How to solve the "undefined reference to 'ntohl'" compile error in Android NDK?

From Dev

How to reference self in a definition?

From Dev

How to self reference in XSD

From Dev

Cannot solve "Undefined reference to ..." Error

From Dev

Does [self new] in a block creates strong reference cycle?

From Dev

How to solve FTP Error 2 Not a Directory

From Dev

How to solve this error in Swift2?

From Dev

How to solve Webpack 2 and Karma MemoryFileSystem error?

From Dev

How to solve error with rootless docker in github actions self hosted runner: write /proc/sys/net/ipv4/ping_group_range: invalid argument: unknown

From Dev

DeadBolt 2 NullPoniterException error in playframework 2 app

From Dev

How to solve “illegal character” error when saving Google Script for Google Analytics

From Dev

How to solve the null object reference?

From Dev

Django how to solve saving empty form problem?

From Dev

How to construct a class with a constant reference cycle?

From Dev

How to self-reference a control

From Dev

How to reference a self created xsd

From Dev

How to reference a self created xsd

From Dev

I have 2 variables in the same file that reference each other, but I keep getting an error that the latter one is undefined. How do I solve this?

From Dev

Python Neo4j Self reference

From Dev

SQL Schema with self reference in Laravel 4

Related Related

  1. 1

    Direct self-reference leading to cycle Superclass issue JSON

  2. 2

    com.fasterxml.jackson.databind.JsonMappingException: Direct self-reference leading to cycle (through reference chain)

  3. 3

    com.fasterxml.jackson.databind.JsonMappingException: Direct self-reference leading to cycle (through reference chain)

  4. 4

    How to break a direct reference cycle in CPython

  5. 5

    How to break a direct reference cycle in CPython

  6. 6

    How to create a singleton reference in playframework

  7. 7

    Understanding direct self-reference in Haskell

  8. 8

    how to solve a TypeError error in rails 4 in the form?

  9. 9

    How to solve "error LNK2001: unresolved external symbol _CLSID_D2D1Blend" when using Direct2d Effects?

  10. 10

    How to solve the "undefined reference to 'ntohl'" compile error in Android NDK?

  11. 11

    How to reference self in a definition?

  12. 12

    How to self reference in XSD

  13. 13

    Cannot solve "Undefined reference to ..." Error

  14. 14

    Does [self new] in a block creates strong reference cycle?

  15. 15

    How to solve FTP Error 2 Not a Directory

  16. 16

    How to solve this error in Swift2?

  17. 17

    How to solve Webpack 2 and Karma MemoryFileSystem error?

  18. 18

    How to solve error with rootless docker in github actions self hosted runner: write /proc/sys/net/ipv4/ping_group_range: invalid argument: unknown

  19. 19

    DeadBolt 2 NullPoniterException error in playframework 2 app

  20. 20

    How to solve “illegal character” error when saving Google Script for Google Analytics

  21. 21

    How to solve the null object reference?

  22. 22

    Django how to solve saving empty form problem?

  23. 23

    How to construct a class with a constant reference cycle?

  24. 24

    How to self-reference a control

  25. 25

    How to reference a self created xsd

  26. 26

    How to reference a self created xsd

  27. 27

    I have 2 variables in the same file that reference each other, but I keep getting an error that the latter one is undefined. How do I solve this?

  28. 28

    Python Neo4j Self reference

  29. 29

    SQL Schema with self reference in Laravel 4

HotTag

Archive