我正在尝试使用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之间的映射?
有人暗示我做错了什么,或者应该怎么声明呢?
答案 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的预期方式吗?