我有一个在scala中使用Akka Actors的项目,我遇到了一些有关处理结果并将结果发送回发件人的参与者的问题。
为了更好地解释,下面是我的项目的工作流
基本上,我有两个问题:
现在,我将从参与者返回给SuccessMessage中的指挥官(主管)的所有内容打包。这是最好的方式,还是有其他方法来处理许多不同类型的回报?
SuccessMessage也将有一个“有效载荷”。我在争论如何在有效负载类型中使用泛型,或者只是让它成为一个OptionAny,然后在将它发送给任何参与者(poller、处理器等)之前,在指挥官端进行大量的转换。我知道,在Java中,akka演员只是投出对象;我是否也必须这样做呢?
发布于 2015-07-31 14:18:02
没有“正确”的方法,但我会这样做:
使消息对于每个参与者类型对都是唯一的。将实际数据包装在以下消息中:Poll(something)、Polled(result)、Process(something)、Processed(result)、Upload(something)和Uploaded(result)。
然后要么创建PollFailed(details)、ProcessingFailed(details)和UploadFailed(details)消息,要么将Option放入正常的结果消息中。我喜欢使用Option。
我会在Poller、Processer和Uploader的伙伴对象中定义这些消息。
指挥官的接收方法非常漂亮:
def receive = {
case Polled(Some(result)) => // handle
case Polled(None) => // handle
case Processed(Some(result)) => // handle
case Processed(None) => // handle
case Uploaded(Some(result)) => // handle
case Uploaded(None) => // handle
}远离仿制药。由于类型擦除,您无法在接收方法中匹配泛型。
发布于 2015-07-31 14:17:46
我还没有看过您的代码,但我建议您做两件事:
- `MessagesPolled(List[String])`,
- `MessagesProcessed(File)`
- `MessagesUploaded` and `MessagesNotUploaded(Error)`这样,您的逻辑将被正确地划分,连接到每条消息的逻辑将被保存在不同的位置(稍后可以更改而不影响其他逻辑)。
- `Commander` has references to three actors (which have their own worker `hierarchies`):
- `Poller` which only routes messages to dynamically created `PollerWorker`s
- `Processor` which only routes messages to dynamically created `ProcessorWorker`s
- `Uploader` which only routes messages to dynamically created `UploaderWorker`s
- `Commander` receives a trigger message and sends first message to `Poller` with a `ActorRef` to the `nextStepActor` which, in the case of first message, will be `ProcessorWorker`通过这种方式,您将能够将逻辑封装在不同的参与者中,轻松地进行缩放,而不会压倒Commander参与者。
https://stackoverflow.com/questions/31747444
复制相似问题