6

我现在已经使用 scala actor 编写了一些应用程序,并且我对人们如何处理或处理我遇到的一些问题感兴趣。

过多的消息类或!?

我有一个对用户操作做出反应并且必须导致某些事情发生的演员。假设它react是一条消息UserRequestsX(id)。我遇到的一个持续问题是,因为我想模块化我的程序,一个演员自己无法在不涉及其他演员的情况下完成动作。例如,假设我需要使用id参数来检索一堆值,然后需要通过其他一些参与者删除这些值。如果我正在编写一个普通的 Java 程序,我可能会执行以下操作:

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

这很简单。然而,使用演员这变得有点痛苦,因为我想避免使用 !?. 一个参与者对消息做出反应,ReportTrades(date)但它必须要求 aPersistenceActor进行交易,然后 aReportActor报告它们。我发现这样做的唯一方法是:

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

所以在我的PersistenceActor我有一个反应块:

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

但现在我有两个问题:

  1. 我必须创建额外的消息类来表示相同的请求(即“报告交易”)。事实上,在这种情况下我有三个,但我可能还有更多 - 跟踪这些成为一个问题
  2. 我应该怎么称呼第一条和第三条消息ReportTrades?将它们都称为是令人困惑的ReportTrades(或者如果我这样做,我必须将它们放在单独的包中)。本质上不存在overloadingval类型划分的类。

有什么我想念的吗?我可以避免这种情况吗?我应该放弃并使用!?人们是否使用某种组织结构来澄清正在发生的事情?

4

2 回答 2

2

对我来说,你的ReportTrades信息混合了两个不同的概念。一个是请求,命令是响应。例如,它们可能被命名为GetTradesReport(Date)and SendTradesReport(List[Trade])。或者,也许,ReportTradesByDate(Date)GenerateTradesReport(List[Trade])

于 2009-08-21T17:31:43.780 回答
0

使用 是否有一些反对意见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)))
}

分别。

于 2009-08-22T20:28:51.370 回答