Akka: приоритетный почтовый ящик не работает с Akka Typed

Я пытаюсь создать почтовый ящик с настраиваемым приоритетом с типом akka, который расставляет приоритеты для сообщений в зависимости от типа сообщения. Ниже приведен мой код, который создает актера и отправляет ему сообщения. Однако сообщения обрабатываются в порядке их получения, а не в порядке, определенном настраиваемым почтовым ящиком.

package com.akka.prac

import akka.actor.typed.{ActorSystem, Behavior, DispatcherSelector, Props, Settings}
import akka.actor.typed.scaladsl.Behaviors
import akka.dispatch.{PriorityGenerator, UnboundedPriorityMailbox}
import com.typesafe.config.{Config, ConfigFactory}

object PriorityMailBoxTyped extends App {

  val config = ConfigFactory.load("applicationtyped.conf")
  val actorSystem = ActorSystem(
    MyPriorityActorTyped.receive,
    "PriorityMailBox",
    config,
    DispatcherSelector.fromConfig("prio-dispatcher")
  )

  actorSystem ! DoubleMessage(6.0)
  actorSystem ! IntMessage(1)
  actorSystem ! DoubleMessage(5.0)
  actorSystem ! IntMessage(3)
  actorSystem ! StringMessage("Hello")
  actorSystem ! IntMessage(5)
  actorSystem ! StringMessage("I am priority actor")
  actorSystem ! StringMessage(
    "I process string messages first,then integer, long and others"
  )

}

class MyPriorityActorMailBoxTyped(settings: Settings, config: Config)
    extends UnboundedPriorityMailbox(
      // Create a new PriorityGenerator,lower prio means more important
      PriorityGenerator {
        // Int Messages
        case x: IntMessage => 1
        // String Messages
        case x: StringMessage => 0
        // Long messages
        case x: LongMessage => 2
        // other messages
        case x: DoubleMessage => 3
        case _                => 4
      }
    )

trait MyMessage
case class IntMessage(x: Int) extends MyMessage
case class LongMessage(x: Long) extends MyMessage
case class StringMessage(x: String) extends MyMessage
case class DoubleMessage(x: Double) extends MyMessage

object MyPriorityActorTyped {

  def receive: Behavior[MyMessage] = Behaviors.receive { (context, message) =>
    message match {
      case IntMessage(x)    => println(x)
      case StringMessage(x) => println(x)
      case LongMessage(x)   => println(x)
      case DoubleMessage(x) => println(x)
      case _                => println()
    }
    Behaviors.same
  }
}

Файл конфигурации

prio-dispatcher {
    mailbox-type = "com.akka.prac.MyPriorityActorMailBoxTyped"
}

Тот же пример работает с Akka Classic. Что мне здесь не хватает?

Спасибо.


person mudassir    schedule 08.03.2021    source источник
comment
Я предполагаю, что это происходит из-за того, что сообщения обрабатываются слишком быстро, поэтому у ActorSystem нет изменений для определения приоритетов сообщений. Попробуйте добавить сон для приема.   -  person Ivan Kurchenko    schedule 09.03.2021
comment
Спасибо @IvanKurchenko. Я попытался добавить 1 секунду сна, чтобы получить, но получил тот же результат. \n Обновленный актер: 'object MyPriorityActorTyped { def receive: Behavior[MyMessage] = Behaviors.receive{ (context,message) => Thread.sleep(1000) message match { case IntMessage(x) => println(x) case StringMessage (x) => println(x) case LongMessage(x) => println(x) case DoubleMessage(x) => println(x) case _ => println() } Behaviors.same } } ` Вывод: 6.0 1 5.0 3 Привет 5 Я являюсь приоритетным субъектом, я обрабатываю строковые сообщения...   -  person mudassir    schedule 09.03.2021
comment
Вы использовали MailboxSelector при создании актера? Кажется, это новый типизированный способ: doc.akka.io/docs/ akka/current/typed/mailboxes.html   -  person Florian Schaetz    schedule 09.03.2021
comment
Спасибо @FlorianSchaetz. Я изменил DispatcherSelector в своем коде на MailboxSelector. Тот же результат, к сожалению!   -  person mudassir    schedule 09.03.2021
comment
Не уверен точно, что происходит, но это работает, если вы делаете это для актера, отличного от актера-хранителя. Не уверен, что это ошибка, или вы просто не можете переопределить почтовый ящик актера-хранителя. В документации по этому поводу ничего не нашел....   -  person artur    schedule 10.03.2021
comment
Да, я нашел то же самое. Для детского актера это работает нормально, но мне не удалось получить его и для актера-хранителя.   -  person Florian Schaetz    schedule 10.03.2021
comment
Я добавил сообщение об ошибке в akka tracker, поэтому надеюсь, что либо документация будет обновлена ​​(и, возможно, добавлен журнал предупреждений), либо, если это ошибка, она будет исправлена.   -  person Florian Schaetz    schedule 11.03.2021
comment
Благодарю вас! Вы не против поделиться записью об ошибке?   -  person mudassir    schedule 12.03.2021
comment
github.com/akka/akka/issues/30108   -  person artur    schedule 12.03.2021
comment
Исправление было добавлено в основную ветку, я предполагаю, что оно будет в следующем выпуске. Если я вспомню это, я проверю это, а затем добавлю ответ, чтобы мы могли закрыть это.   -  person Florian Schaetz    schedule 17.03.2021
comment
Спасибо @FlorianSchaetz   -  person mudassir    schedule 18.03.2021


Ответы (1)


Похоже, это была ошибка, которая теперь исправлена ​​в 2.6.14.

Justed протестировал его, и он работает с конфигурацией из документации. :

ActorSystem.create(Behaviors.setup(ctx -> someStaticBehavior(ctx)), "system", ConfigFactory.load("application.conf"), MailboxSelector.fromConfig("my-app.my-special-mailbox"));
person Florian Schaetz    schedule 08.04.2021