Использование диспетчера Akka для обработки фьючерсов
У меня есть HTTP-сервис на основе спрея. У меня есть поток, который работает внутри этого приложения HTTP. Теперь, когда этот поток выполняет много операций ввода-вывода, я решил использовать отдельный пул потоков. Я посмотрел документацию Akka, чтобы увидеть, что я могу сделать, чтобы мой пул потоков был настраиваемым. Я наткнулся на концепцию диспетчера в Акке. Поэтому я попытался использовать его, как показано ниже в моем application.conf:
akka {
io-dispatcher {
# Dispatcher is the name of the event-based dispatcher
type = Dispatcher
# What kind of ExecutionService to use
executor = "fork-join-executor"
# Configuration for the fork join pool
fork-join-executor {
# Min number of threads to cap factor-based parallelism number to
parallelism-min = 2
# Parallelism (threads) ... ceil(available processors * factor)
parallelism-factor = 2.0
# Max number of threads to cap factor-based parallelism number to
parallelism-max = 10
}
# Throughput defines the maximum number of messages to be
# processed per actor before the thread jumps to the next actor.
# Set to 1 for as fair as possible.
throughput = 20
}
}
В моем актере я попытался найти эту конфигурацию как:
context.system.dispatchers.lookup("akka.io-dispatcher")
Когда я запускаю свой сервис, я получаю следующую ошибку:
[ERROR] [05/03/2016 12:59:08.673] [my-app-akka.actor.default-dispatcher-2] [akka://my-app/user/myAppSupervisorActor] Dispatcher [akka.io-dispatcher] not configured
akka.ConfigurationException: Dispatcher [akka.io-dispatcher] not configured
at akka.dispatch.Dispatchers.lookupConfigurator(Dispatchers.scala:99)
at akka.dispatch.Dispatchers.lookup(Dispatchers.scala:81)
Мои вопросы:
Этот пул потоков io-dispatcher, который я создаю, предназначен для использования только для Actor? Мое намерение состояло в том, чтобы использовать этот пул потоков для моих потоков, который создается одним из актеров. Затем я передаю этот пул потоков в мой поток.
Как я могу создать ExecutionContext, просто загрузив диспетчер из application.conf? Должен ли я использовать какую-либо конкретную библиотеку, которая считала бы мою конфигурацию для пула потоков и дала бы мне ExecutionContext?
1 ответ
Конфигурация правильная. Все, что вам нужно сделать, это передать загруженный файл конфигурации в систему Akka ActorSystem, например:
ActorSystem("yourActorSystem", ConfigFactory.load())