我现在已经使用 scala actor 编写了一些应用程序,并且我对人们如何处理或处理我遇到的一些问题感兴趣。
过多的消息类或!?
我有一个 Actor ,它对用户操作使用react,并且必须导致某些事情发生。假设它对消息 UserRequestsX(id)
使用react。我遇到的一个持续的问题是,因为我想模块化我的程序,所以单个 Actor 本身无法在不涉及其他 Actor 的情况下完成 Action 。例如,假设我需要使用 id 参数来检索一堆值,然后需要通过其他参与者删除这些值。如果我正在编写一个普通的 Java 程序,我可能会这样做:
public void reportTrades(Date date) {
Set<Trade> trades = persistence.lookup(date);
reportService.report(trades);
}
这很简单。然而,使用 actor 这会变得有点痛苦,因为我想避免使用 !?
。一个参与者对 ReportTrades(date)
消息作出 react ,但它必须向 PersistenceActor
请求交易,然后向 ReportActor
请求报告交易。我发现这样做的唯一方法是:
react {
case ReportTrades(date) =>
persistenceActor ! GetTradesAndReport(date)
}
因此,在我的 PersistenceActor
中,我有一个 react block :
react {
case GetTradesAndReport(date) =>
val ts = trades.get(date) //from persietent store
reportActor ! ReportTrades(ts)
}
但现在我有两个问题:
- 我必须创建额外的消息类来表示相同的请求(即“报告交易”)。事实上,在这种情况下我有三个,但我可能有更多 - 跟踪这些就成了一个问题
- 我应该如何称呼第一条和第三条消息
ReportTrades
?将它们都称为ReportTrades 会令人困惑(或者如果我这样做,我必须将它们放在单独的包中)。本质上不存在通过val
类型重载
类这样的事情。
我有什么遗漏的吗?我可以避免这种情况吗?我是否应该放弃并使用!?
人们是否使用某种组织结构来澄清正在发生的事情?
最佳答案
对我来说,您的 ReportTrades
消息混合了两个不同的概念。一个是请求,命令是响应。例如,它们可能被命名为 GetTradesReport(Date)
和 SendTradesReport(List[Trade])
。或者,也许是 ReportTradesByDate(Date)
和 GenerateTradesReport(List[Trade])
。
关于scala - 在实践中使用 Scala Actor 编写应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1310846/