Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Akka演员返回不同类型的输出_Scala_Generics_Akka - Fatal编程技术网

Scala Akka演员返回不同类型的输出

Scala Akka演员返回不同类型的输出,scala,generics,akka,Scala,Generics,Akka,我有一个在scala中使用Akka Actors的项目,我遇到了一些关于执行处理并将结果发送回发件人的Actor的问题 为了更好地解释,这里是我的项目的工作流程 指挥官将消息发送给轮询器 轮询器向指挥官发送成功消息(self,List[String]) 指挥官将列表[字符串]发送给处理器 处理器向指挥官发送成功消息(self,File) 指挥官向上传者发送文件 上传程序向指挥官发送成功消息(self,布尔值) 等等 基本上,我有两个问题: 现在,我将演员返回给指挥官(主管)的所有

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

为了更好地解释,这里是我的项目的工作流程

  • 指挥官将消息发送给轮询器
    • 轮询器向指挥官发送成功消息(self,List[String])
  • 指挥官将列表[字符串]发送给处理器
    • 处理器向指挥官发送成功消息(self,File)
  • 指挥官向上传者发送文件
    • 上传程序向指挥官发送成功消息(self,布尔值)
  • 等等
基本上,我有两个问题:

现在,我将演员返回给指挥官(主管)的所有内容包装在一条成功消息中。这是最好的方法,还是有其他方法来处理许多不同类型的回报


成功消息还将有一个“有效负载”。我正在争论是对有效负载类型使用泛型,还是仅仅将其作为一个选项[Any],然后在将其发送给任何参与者(轮询器、处理器等)之前,在指挥官端进行大量转换。我知道在Java中,akka演员只是投射对象;我也必须这样做吗?

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

  • 为成功创建不同类型的消息。例如

    • 消息填充(列表[字符串])
    • 消息处理(文件)
    • messagesupload
      messagesnotupload(错误)
    这样,您的逻辑将被正确地划分,连接到每条消息的逻辑将被保存在不同的位置(稍后可以在不影响其他逻辑的情况下进行更改)

  • 创建参与者的层次结构,使每个参与者负责一件事(包括顶级参与者),例如:

    • Commander
      引用了三个参与者(它们有自己的worker
      层次结构
      ):
      • Poller
        仅将消息路由到动态创建的
        PollerWorker
        s
      • 处理器
        仅将消息路由到动态创建的
        处理器工作者
        s
      • Uploader
        仅将消息路由到动态创建的
        UploaderWorker
        s
    • Commander
      接收一条触发消息,并使用
      ActorRef
      将第一条消息发送到
      Poller
      下一步执行器
    通过这种方式,您将能够将逻辑封装在不同的参与者中,轻松地进行扩展,并且不会压倒
    指挥官
    参与者


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

  • 为成功创建不同类型的消息。例如

    • 消息填充(列表[字符串])
    • 消息处理(文件)
    • messagesupload
      messagesnotupload(错误)
    这样,您的逻辑将被正确地划分,连接到每条消息的逻辑将被保存在不同的位置(稍后可以在不影响其他逻辑的情况下进行更改)

  • 创建参与者的层次结构,使每个参与者负责一件事(包括顶级参与者),例如:

    • Commander
      引用了三个参与者(它们有自己的worker
      层次结构
      ):
      • Poller
        仅将消息路由到动态创建的
        PollerWorker
        s
      • 处理器
        仅将消息路由到动态创建的
        处理器工作者
        s
      • Uploader
        仅将消息路由到动态创建的
        UploaderWorker
        s
    • Commander
      接收一条触发消息,并使用
      ActorRef
      将第一条消息发送到
      Poller
      下一步执行器
    通过这种方式,您将能够将逻辑封装在不同的参与者中,轻松地进行扩展,并且不会压倒
    指挥官
    参与者


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

  • 为成功创建不同类型的消息。例如

    • 消息填充(列表[字符串])
    • 消息处理(文件)
    • messagesupload
      messagesnotupload(错误)
    这样,您的逻辑将被正确地划分,连接到每条消息的逻辑将被保存在不同的位置(稍后可以在不影响其他逻辑的情况下进行更改)

  • 创建参与者的层次结构,使每个参与者负责一件事(包括顶级参与者),例如:

    • Commander
      引用了三个参与者(它们有自己的worker
      层次结构
      ):
      • Poller
        仅将消息路由到动态创建的
        PollerWorker
        s
      • 处理器
        仅将消息路由到动态创建的
        处理器工作者
        s
      • Uploader
        仅将消息路由到动态创建的
        UploaderWorker
        s
    • Commander
      接收一条触发消息,并使用
      ActorRef
      将第一条消息发送到
      Poller
      下一步执行器
    通过这种方式,您将能够将逻辑封装在不同的参与者中,轻松地进行扩展,并且不会压倒
    指挥官
    参与者


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

  • 为成功创建不同类型的消息。例如

    • 消息填充(列表[字符串])
    • 消息处理(文件)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
      }