强类型流

时间:2018-08-21 17:09:02

标签: scala akka akka-stream

我正在尝试使用Akka Stream DSL。 我无法编译的东西是强类型Flow。 对于Zip,我可以执行以下操作,并且可以正常编译:

val fanIn = builder.add(Zip[LoginResponse, LoginCommand.UserData])

对于Flow,由于以下代码无法编译,我似乎无法使它正常工作:

val encryptLoginData = builder.add(Flow[(LoginResponse, LoginCommand.UserData), LoginCommand.UserData])

从错误消息中我无法真正分辨出我在做什么错。

我注意到apply仅采用一种类型,但这应该如何显示in-- out之间的映射?

有人暗示我做错了什么,或者应该怎么声明呢?

2 个答案:

答案 0 :(得分:1)

通过以下方式定义流程:

val flow =                 
  Flow[(LoginResponse, LoginCommand.UserData)]
    .map { (response, user) =>
      // do something with response and/or user that returns a LoginCommand.UserData
    } // Flow[(LoginResponse, LoginCommand.UserData), LoginCommand.UserData, _]

fanIn.out ~> flow

正如Scaladoc所指出的,Flow.apply[T]方法“返回一个Flow,它输出所有输入。”这是最基本的Flow,是更复杂的Flow的构建块。通常,除了输出所有输入元素外,还需要做更多的事情。常见的用例是定义一个Flow,它以某种方式转换输入并输出转换结果。您尝试添加以下Flow ...

Flow[(LoginResponse, LoginCommand.UserData), LoginCommand.UserData]

...建议您输入(LoginResponse, LoginCommand.UserData)类型的输入并输出LoggingCommand.UserData。但是,为此,您必须将Flow类型的输入元素转换为(LoginResponse, LoginCommand.UserData),作为LoginCommand.UserData 如何的一部分进行定义

答案 1 :(得分:0)

由于@JeffreyChung的回答,我在重新考虑@javax.enterprise.context.RequestScoped是否是此处的最佳用法。 现在,我尝试使用至少可以编译的更基本的Flow

FlowShape

不像我想要的那样优雅,但是我使用 val encryptIn = Inlet[(LoginResponse, LoginCommand.UserData)]("EncryptInput") val encryptOut = Outlet[LoginCommand.UserData]("EncryptOutput") val encryptLoginData = FlowShape(encryptIn, encryptOut) 所见的任何解决方案都没有。

那么这是使用DSL的预期方式吗?