您肯定使用了 5 个组件。有处理特定任务的演员,也有协调者。
当然,您必须遇到的问题是如何异步链接它。嗯,这实际上有点简单,但它可能会使代码变得模糊。基本上,您向每个组件发送您想要的回复。
react {
case DeleteTrades(user,dates) =>
PermissionService ! FindPermissions(user, DeleteTradesPermissions(dates) _)
case DeleteTradesPermissions(dates)(ps) =>
if (ps hasPermission "delete")
Persistence ! FindTrades(date, DeleteTradesTradeSet _)
case DeleteTradesTradeSet(ts) =>
ReportService ! SendCancelReports(ts)
PositionService ! UpdateWithDeletedTrades(ts)
}
在这里,我们使用柯里化来传递第一个返回答案中的“日期”。如果有很多与交互相关的参数,最好将所有正在进行的事务的信息保留在本地 HashSet 中,并仅传递一个令牌,您将在收到答案时使用该令牌来查找该信息。
请注意,这个单个参与者可以处理多个并发操作。在这种特殊情况下,只需删除事务,但您可以添加任意数量的不同操作以供其处理。当一项操作所需的数据准备就绪时,该操作就会继续。
EDIT
以下是如何定义这些类的工作示例:
class Date
class User
class PermissionSet
abstract class Message
case class DeleteTradesPermission(date: Date)(ps: PermissionSet) extends Message
case class FindPermissions(u: User, r: (PermissionSet) => Message) extends Message
FindPermissions(new User, DeleteTradesPermission(new Date) _)
关于柯里化和函数的一些解释。班上DeleteTradesPermission
被咖喱化,这样你就可以通过Date
在它上面,并让一些其他功能完成它PermissionSet
。这将是应答消息的模式。
现在,班级FindPermissions
接收一个函数作为第二个参数。接收此消息的参与者会将返回值传递给此函数,并会收到一个Message
作为答案发送。在此示例中,消息将同时包含Date
,调用者发送的,以及PermissionSet
,这是应答演员提供的。
如果预计不会有答案,例如以下情况DeleteTrades
, SendCancelReports
and UpdateWithDeletedTrades
出于本示例的目的,您不需要传递返回消息的函数。
由于我们期望有一个函数返回一个消息作为需要答案的消息的参数,因此我们可以定义如下特征:
trait MessageResponse1[-T1] extends Function1[T1, Message]
trait MessageResponse2[-T1, -T2] extends Function2[T1, T2, Message]
...