From 2b6e657f9e4f6dbfdb7436bc281ebd0fa9374da4 Mon Sep 17 00:00:00 2001 From: Friedrich von Never Date: Thu, 3 Dec 2015 21:48:11 +0600 Subject: [PATCH 1/2] Add auto rejoin on join errors. --- .../protocol/jabber/JabberProtocol.scala | 42 ++++++++++++------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/src/main/scala/ru/org/codingteam/horta/protocol/jabber/JabberProtocol.scala b/src/main/scala/ru/org/codingteam/horta/protocol/jabber/JabberProtocol.scala index aade8ad..c806aa1 100644 --- a/src/main/scala/ru/org/codingteam/horta/protocol/jabber/JabberProtocol.scala +++ b/src/main/scala/ru/org/codingteam/horta/protocol/jabber/JabberProtocol.scala @@ -33,6 +33,8 @@ class JabberProtocol() extends Actor with ActorLogging { var privateHandler: ActorRef = null var rooms = Map[String, RoomDefinition]() + private val rejoinInterval = 5.seconds + override def preStart() { privateHandler = context.actorOf( Props(new PrivateMessageHandler(Configuration.defaultLocalization, self)), "privateHandler") @@ -52,26 +54,34 @@ class JabberProtocol() extends Actor with ActorLogging { case Reconnect(otherConnection) => log.info(s"Ignored reconnect request from connection $otherConnection") - case JoinRoom(jid, locale, nickname, greeting) => + case message@JoinRoom(jid, locale, nickname, greeting) => log.info(s"Joining room $jid") val actor = context.actorOf( Props(new MucMessageHandler(locale, self, jid, nickname)), jid) - val muc = new MultiUserChat(connection, jid) - rooms = rooms.updated(jid, RoomDefinition(muc, actor)) - - muc.addMessageListener(new MucMessageListener(jid, actor, log)) - muc.addParticipantStatusListener(new MucParticipantStatusListener(muc, actor)) - - val filter = new AndFilter(new PacketTypeFilter(classOf[Message]), new FromContainsFilter(jid)) - connection.addPacketListener( - new MessageAutoRepeater(context.system, self, context.system.scheduler, jid, context.dispatcher), - filter) - - muc.join(nickname) - greeting match { - case Some(message) => muc.sendMessage(message) - case None => + try { + // TODO: Move this code to the room actor and use "let it fall" strategy ~ F + val muc = new MultiUserChat(connection, jid) + rooms = rooms.updated(jid, RoomDefinition(muc, actor)) + + muc.addMessageListener(new MucMessageListener(jid, actor, log)) + muc.addParticipantStatusListener(new MucParticipantStatusListener(muc, actor)) + + val filter = new AndFilter(new PacketTypeFilter(classOf[Message]), new FromContainsFilter(jid)) + connection.addPacketListener( + new MessageAutoRepeater(context.system, self, context.system.scheduler, jid, context.dispatcher), + filter) + + muc.join(nickname) + greeting match { + case Some(text) => muc.sendMessage(text) + case None => + } + } catch { + case t: Throwable => + log.warning(s"Cannot join room $jid, retrying in $rejoinInterval") + context.stop(actor) + context.system.scheduler.scheduleOnce(rejoinInterval, self, message) } case ChatOpened(chat) => { From 98c08bc5bd746571651c8b9a92cb80244639840f Mon Sep 17 00:00:00 2001 From: Friedrich von Never Date: Thu, 3 Dec 2015 22:11:43 +0600 Subject: [PATCH 2/2] Add error cause logging. --- .../org/codingteam/horta/protocol/jabber/JabberProtocol.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/ru/org/codingteam/horta/protocol/jabber/JabberProtocol.scala b/src/main/scala/ru/org/codingteam/horta/protocol/jabber/JabberProtocol.scala index c806aa1..774ba32 100644 --- a/src/main/scala/ru/org/codingteam/horta/protocol/jabber/JabberProtocol.scala +++ b/src/main/scala/ru/org/codingteam/horta/protocol/jabber/JabberProtocol.scala @@ -79,7 +79,7 @@ class JabberProtocol() extends Actor with ActorLogging { } } catch { case t: Throwable => - log.warning(s"Cannot join room $jid, retrying in $rejoinInterval") + log.warning(s"Cannot join room $jid, retrying in $rejoinInterval. Error was $t") context.stop(actor) context.system.scheduler.scheduleOnce(rejoinInterval, self, message) }