在实践II中使用Scala演员编写应用程序
因为我的第一个问题太长了,我要问这是一个单独的问题.这是关于基于actor的应用程序的体系结构的另一个问题.
通过应用程序跟踪消息路径 我们来看一段Java代码: public void deleteTrades(User user,Date date) { PermissionSet ps = permissionService.findPermissions(user) if (ps.hasPermission("delete")) { Set<Trade> ts = peristence.findTrades(date); reportService.sendCancelReports(ts); positionService.updateWithDeletedTrades(ts); } } 在这段代码中,我有4个单独的组件,并且它们之间的交互所需的过程deleteTrades是明确定义的.它完全包含在deleteTrades方法中. 使用Actors进行建模并用4个独立的actor替换我的4个组件,如何跟踪(在我看来)过程涉及的内容?特别是如果我避免使用!运算符,那么我很可能会向我的PermissionActor发送一条消息ConditionalDelete,它将向我的PersistenceActor发送一条消息GetTradesAndDelete,然后发送更多的消息等等.处理删除的代码将遍布我的应用程序. 这也意味着几乎每个actor都需要处理其他每个actor(为了转发消息). 正如我之前的问题,人们如何处理这个问题?有没有一个很好的建模工具,可以让你跟踪所有这些?人们用!?我是否将太多组件转换为Actors? 解决方法
你肯定使用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) } 在这里,我们使用currying在第一个返回的答案中传递“日期”.如果有很多与交互相关的参数,那么最好将所有正在进行的事务的信息保存在本地HashSet中,并且只传递一个令牌,用于在收到答案时找到该信息. 请注意,此单个actor可以处理多个并发操作.在这种特殊情况下,只需删除事务,但您可以添加任意数量的不同操作来处理.当一个操作所需的数据准备就绪时,该操作将继续. 编辑 这是一个如何定义这些类的工作示例: 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) _) 关于currying和功能的一些解释.使用DeleteTradesPermission类进行curry,以便您可以在其上传递Date,并使用PermissionSet完成其他一些功能.这将是答案消息的模式. 现在,类FindPermissions接收一个函数作为第二个参数.接收此消息的actor将返回值传递给此函数,并将接收要作为答案发送的消息.在此示例中,消息将同时具有调用actor发送的Date和应答actor提供的PermissionSet. 如果没有预期答案,例如DeleteTrades,SendCancelReports和UpdateWithDeletedTrades用于此示例的目的,则您不需要传递返回消息的函数. 由于我们期望一个函数返回一个Message作为那些需要答案的消息的参数,我们可以定义这样的特征: trait MessageResponse1[-T1] extends Function1[T1,Message] trait MessageResponse2[-T1,-T2] extends Function2[T1,T2,Message] ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |