Написание приложений с актерами Scala на практике - PullRequest
6 голосов
/ 21 августа 2009

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

Множество классов Messageили!?

У меня есть актер, который реагирует на пользовательскую операцию и должен что-то вызвать.Допустим, это react с сообщением UserRequestsX(id).Постоянная проблема, с которой я сталкиваюсь, заключается в том, что, поскольку я хочу модулировать свои программы, один актер сам по себе не может выполнить действие без привлечения других актеров.Например, предположим, что мне нужно использовать параметр id, чтобы получить набор значений, а затем их нужно удалить через какой-то другой субъект.Если бы я писал обычную программу на Java, я мог бы сделать что-то вроде:

public void reportTrades(Date date) {
    Set<Trade> trades = persistence.lookup(date);
    reportService.report(trades);
}

Что достаточно просто.Однако, используя актеров, это становится немного болезненным, потому что я хочу избегать использования !?.Один актер реагирует на сообщение ReportTrades(date), но он должен запросить PersistenceActor о сделках и затем ReportActor, чтобы сообщить о них.Единственный способ, который я нашел, это сделать:

react {
    case ReportTrades(date) =>
       persistenceActor ! GetTradesAndReport(date)
}

Так что в моем PersistenceActor есть блок реагирования:

react {
    case GetTradesAndReport(date) =>
       val ts = trades.get(date) //from persietent store
       reportActor ! ReportTrades(ts)
}

Но теперь у меня есть 2проблемы:

  1. Мне нужно создать дополнительные классы сообщений для представления того же запроса (т. е. "сообщить о сделках").На самом деле у меня есть три в этом сценарии, но у меня может быть намного больше - становится проблемой отслеживать эти
  2. Как мне назвать первое и третье сообщение ReportTrades?Смешно называть их обоих ReportTrades (или, если я это сделаю, я должен поместить их в отдельные пакеты).По существу нет такой вещи, как overloading класс по типу val.

Есть что-то, что я пропускаю?Могу ли я избежать этого?Должен ли я просто сдаться и использовать !? Используют ли люди какую-то организационную структуру, чтобы уточнить, что происходит?

Ответы [ 2 ]

2 голосов
/ 21 августа 2009

Для меня ваше сообщение ReportTrades смешивает два разных понятия. Одним из них является запрос, заказ является ответом. Например, они могут быть названы GetTradesReport(Date) и SendTradesReport(List[Trade]). Или, может быть, ReportTradesByDate(Date) и GenerateTradesReport(List[Trade]).

0 голосов
/ 23 августа 2009

Есть ли возражения против использования reply? Или прохождение trades вокруг? Если нет, ваш код, вероятно, будет выглядеть как

react {
  case ReportTrades(date) => persistenceActor ! GetTrades(date)
  case Trades(ts) => // do smth with trades
}

и

react {
  case GetTrades(date) => reply(Trades(trades.get(date)))
}

соответственно.

...