首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >阿克卡演员返回不同类型的作品

阿克卡演员返回不同类型的作品
EN

Stack Overflow用户
提问于 2015-07-31 13:31:18
回答 2查看 134关注 0票数 0

我有一个在scala中使用Akka Actors的项目,我遇到了一些有关处理结果并将结果发送回发件人的参与者的问题。

为了更好地解释,下面是我的项目的工作流

  • 指挥官将消息发送给Poller
    • 波勒派SuccessMessage(self,ListString)给指挥官

  • 指挥官将ListString发送给处理器
    • 处理器将SuccessMessage(自,文件)发送给指挥官

  • 指挥官将文件发送给Uploader
    • 上传器将SuccessMessage(自,布尔)发送给指挥官

  • 诸若此类。

基本上,我有两个问题:

现在,我将从参与者返回给SuccessMessage中的指挥官(主管)的所有内容打包。这是最好的方式,还是有其他方法来处理许多不同类型的回报?

SuccessMessage也将有一个“有效载荷”。我在争论如何在有效负载类型中使用泛型,或者只是让它成为一个OptionAny,然后在将它发送给任何参与者(poller、处理器等)之前,在指挥官端进行大量的转换。我知道,在Java中,akka演员只是投出对象;我是否也必须这样做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

我会在PollerProcesserUploader的伙伴对象中定义这些消息。

指挥官的接收方法非常漂亮:

代码语言:javascript
运行
复制
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
}

远离仿制药。由于类型擦除,您无法在接收方法中匹配泛型。

票数 2
EN

Stack Overflow用户

发布于 2015-07-31 14:17:46

我还没有看过您的代码,但我建议您做两件事:

  1. 为成功创建不同类型的消息。例如。
代码语言:javascript
运行
复制
- `MessagesPolled(List[String])`,
- `MessagesProcessed(File)`
- `MessagesUploaded` and `MessagesNotUploaded(Error)`

这样,您的逻辑将被正确地划分,连接到每条消息的逻辑将被保存在不同的位置(稍后可以更改而不影响其他逻辑)。

  1. 建立行动者的等级制度,使他们每个人都对一件事负责(包括顶级演员),例如:
代码语言:javascript
运行
复制
- `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

代码语言:javascript
运行
复制
- `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参与者。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31747444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档