Я кодирую приложение с помощью Akka v2.5.23. В приложении задействованы следующие актеры:
- Класс актера маршрутизатора с именем CalculatorRouter
- Класс актера маршрутизатора с именем Calculator
Я настроил PinnedDispatcher при создании Вычислите актера и поместите log.info
в метод получения класса этого актера. Я ожидал увидеть в файле журнала поле имени потока, которое будет содержать pinned
. Однако поле имени потока - default-dispatcher
. Я искал в файле журнала и обнаружил, что все имя потока по отношению к этому log.info
будет default-dispatcher
. Что-то не так с моим кодом?
Фрагмент файла журнала:
09:49:25.116 [server-akka.actor.default-dispatcher-14] INFO handler.Calculator $anonfun$applyOrElse$3 92 - akka://server/user/device/$a/$a Total calc received
Ниже приведены фрагменты кода:
class CalculatorRouter extends Actor with ActorLogging {
var router = {
val routees = Vector.fill(5) {
val r = context.actorOf(Props[Calculator].withDispatcher("calc.my-pinned-dispatcher"))
context.watch(r)
ActorRefRoutee(r)
}
Router(SmallestMailboxRoutingLogic(), routees)
}
def receive = {
case w: Calc => router.route(w, sender)
case Terminated(a) =>
router.removeRoutee(a)
val r = context.actorOf(Props[Calculator].withDispatcher("calc.my-pinned-dispatcher"))
context.watch(r)
router = router.addRoutee(r)
}
}
Cal c .my- закрепленный диспетчер настроен следующим образом:
calc.my-pinned-dispatcher {
executor="thread-pool-executor"
type=PinnedDispatcher
}
Исходный код калькулятора классов выглядит следующим образом:
class Calculator extends Actor with ActorLogging {
val w = new UdanRemoteCalculateTotalBalanceTime
def receive = {
case TotalCalc(fn, ocvFilepath, ratedCapacity, battCount) ⇒
log.info(s"${self.path} Total calc received")
Try{
w.CalculateTotalBalanceTime(1, fn, ocvFilepath, ratedCapacity)
} match {
case Success(t) ⇒
val v = t.getIntData
sender.!(Calculated(v))(context.parent)
case Failure(e) ⇒ log.error(e.getMessage)
}
}
}
object Calculator {
sealed trait Calc
final case class TotalCalc(filename: String, ocvFilepath: String, ratedCapacity: String, batteryCount: Int) extends Calc
}
logback. xml
<configuration debug="true">
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
<!-- reset all previous level configurations of all j.u.l. loggers -->
<resetJUL>true</resetJUL>
</contextListener>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/app.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>/var/log/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- keep 30 days' worth of history capped at 3GB total size -->
<maxHistory>100</maxHistory>
<totalSizeCap>30000MB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} %M %L - %msg%n</pattern>
</encoder>
</appender>
<appender name="ASYNCFILE" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="FILE" />
<queueSize>500</queueSize>
<includeCallerData>true</includeCallerData>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} %M %L - %msg%n</pattern>
</encoder>
</appender>
<logger name="application" level="DEBUG"/>
<root level="INFo">
<appender-ref ref="ASYNCFILE"/>
</root>
</configuration>
'20 4 марта Обновление
Спасибо @ anand-sai. После того, как я поместил akka.loggers-dispatcher = "calc.my-pinned-dispatcher"
в файл conf, я получил my-pinned-dispatcher-xx
в качестве имени потока в каждой строке файла журнала. Я подумал, что имя потока должно указывать на поток, в котором метод receive
субъекта калькулятора выполняет, в данном случае, что-то похожее на 'pinned-dispatcher-xx'
, поскольку поток был получен закрепленным диспетчером в моей конфигурации. Теперь это доказывает, что он указывает поток, полученный диспетчером логгера. Если это так, как записать имя потока для кода обработчика сообщений актера?