2

У нас есть распределенное приложение на кластере akka. Актер «А» отправляет сообщение большого размера удаленному актеру. И мы получаем следующее предупреждение:Akka/scala-OversizedPayloadException Как это сделать?

2016-08-10 23: 08: 29,737 [EndpointWriter] ERROR - Transient ассоциации ошибки (ассоциация остается живой) akka.remote.OversizedPayloadException: Отбрасывая негабаритный полезный груз отправлен Actor [akka.tcp: //[email protected]: 51665/temp/$ b]: max allowed размер 128000 байт, действительный размер кодированного класса common.data.model.configuration.UserList был 571444 байт.

Мы знаем, что мы можем увеличить значение в configuration. Но мы хотели проверить, превышает ли размер предел по умолчанию, который мы хотим отправить другому сообщению. Пробовал поиск, но не повезло, что большинство из них только рассказывают о том, как настроить его, никто не говорит о том, как его обрабатывать, и отправить сообщение удаленной машине. Любое предложение или помощь будут оценены.

ответ

1

На самом деле, мы можем справиться с этим, нужно просто подписаться на akka.event.Logging.Error, и проверить, если причина OversizedPayloadException:

import akka.actor.{Actor, Props} 

class Listener extends Actor { 
    override def receive: Receive = { 
    case akka.event.Logging.Error(cause, _, _, _) 
     // this internal Akka class is package-private, hence we have to check it's classname :(
     if cause.getClass.getName == "akka.remote.OversizedPayloadException" => 
     // handle it here! 
    } 
} 

val listener = system.actorOf(Props(new Listener)) 
system.eventStream.subscribe(listener, classOf[akka.event.Logging.Error]) 
+0

фантастический ... попытается использовать его. Спасибо. – Prakash

0

Постарайтесь подписаться на поток событий. Будем надеяться, что исключение заканчивается:

import akka.actor.{Actor, Props} 
import akka.remote.OversizedPayloadException 

class Listener extends Actor { 
    def receive = { 
    case d: OversizedPayloadException => { 
     // DO SOMETHING 
    } 
    } 
} 
val listener = system.actorOf(Props(classOf[Listener], this)) 
system.eventStream.subscribe(listener, classOf[OversizedPayloadException]) 

Подробнее here

+0

Когда я пытаюсь сделать выше я получаю ошибку «класс OversizedPayloadException в пакете удаленный доступ не может быть получен в пакете akka.remote ". Я уверен, что я делаю некоторые основные ошибки. Можете ли вы, пожалуйста, направить меня. – Prakash

+0

Любая причина, по которой я получаю это исключение? – Prakash

+1

@Prakash вы не можете получить к нему доступ, потому что 'OversizedPayloadException' является частным внутри пакета akka.remote. p.s. Я знаю, что это, вероятно, слишком поздно для вас, но для других, возможно, нет ... :) –

2

Добавлено тот же запрос для рассылки группы Акко. Они сказали, что нет возможности передать это «OversizedPayloadException». Предлагаем вам проверить размер данных и перенести его, прежде чем мы вернемся к актеру.

+0

Я пытаюсь проверить размер json, который я отправляю как часть clustermessage, но затем в пограничном случае, когда размер моего сообщения очень близок к установленному пределу (но все же меньше), он выдает ошибку, говорящую, что это кодирование сообщение далее и увеличивает его размер из-за некоторой кодировки. Можете ли вы мне помочь, как получить размер кодированного сообщения, которое отправляется? –