在实践 II 中使用 Scala Actor 编写应用程序 [关闭]

2024-01-24

因为我的第一个问题太长,所以我将其作为一个单独的问题提出。这是关于基于参与者的应用程序架构的另一篇文章。

跟踪应用程序中的消息路径

我们看一段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.

对此进行建模Actor并用 4 个独立的参与者替换我的 4 个组件,我如何(在我的脑海中)跟踪程序涉及的内容?特别是如果我避免使用!?接线员,那么我可能会发送一条消息ConditionalDelete to my PermissionActor,这将发送一条消息GetTradesAndDelete to my PersistenceActor然后将发送进一步的消息等。处理删除的代码将散布在我的应用程序中。

这也意味着几乎每个参与者都需要每个其他参与者的句柄(以便转发消息)。

正如我之前的问题,人们如何处理这个问题?有没有一个好的建模工具可以让您跟踪这一切?人们使用吗!?我是否将太多组件变成了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)
}

在这里,我们使用柯里化来传递第一个返回答案中的“日期”。如果有很多与交互相关的参数,最好将所有正在进行的事务的信息保留在本地 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]
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在实践 II 中使用 Scala Actor 编写应用程序 [关闭] 的相关文章

随机推荐

  • .htaccess 如果 url 不以扩展名结尾,则在末尾添加斜杠

    我刚刚开始学习正则表达式 但我无法弄清楚这一点 如果 URL 不包含扩展名 我需要在 URL 末尾强制添加斜杠 更清楚地说 example com test stays the same example com test php stays
  • 如何以及在哪里通过 macOS 基于 Python 的应用程序上的本机 GUI 最好地检索 sudo 密码 - (同时维护交互式输出流 (stdout))

    好的 情况是这样的 我正在使用 Python 和 wx wxphoenix 构建 macOS GUI 应用程序 用户可以使用 GUI 例如 script1 启动文件删除过程 包含在script2 为了顺利运行script2需要以 sudo
  • Ruby 字符串剥离定义的字符

    在Python中 我们可以使用 strip https docs python org library stdtypes html str strip字符串的方法 用于删除所选字符的前导或尾随出现 gt gt gt print Remove
  • 如何在 VS 项目中禁用 clang-cl 特定警告

    我使用一个第三方项目 它会产生大量警告 我在 VS 项目属性中禁用了所有这些 有时 我会切换到LLVM clang cl用于检查 clang 警告的工具集 第 3 方项目使用 clang cl 产生如此多的警告 以至于 VS 的输出量令人窒
  • 分析多进程 Python 脚本时出现神秘的 pickle 错误 [重复]

    这个问题在这里已经有答案了 我正在使用multiprocessing模块 我正在使用UpdateMessage对象 我自己的类 通过发送multiprocessing Queue对象 用于进程之间的通信 这是课程 class UpdateM
  • JBoss Netty 与 JSON

    我希望我的 Ajax 代码能够通过 Netty 连接服务器 为此 我需要在服务器端 Netty 处理程序中使用 JSON 解码器和编码器 是否有任何开箱即用的实现 或者我应该编写自己的实现 Thanks Gil 据我所知 没有内置的 JSO
  • rspec 集成测试中的会话对象

    我正在使用 rspec 和 capybara 进行集成测试 他们是在请求规范中创建会话对象的一种方法吗 我有一个视图页面 在其中使用会话对象来检查其值以显示选择性内容 我面临的问题是我无法在请求规范中创建会话对象 这是视图的示例 conte
  • 在子类和 UIViewController 中使用 UITextViewDelegate

    我正在子类化 UITextView 并在子类中实现一些委托方法 例如textViewDidChangeSelection但我还需要在视图控制器中获取 UITextView 委托的通知 因此 如果我创建子类的对象并在视图控制器中设置 text
  • 以编程方式更改 WPF 可编辑组合框的背景颜色

    我正在尝试动态更改可编辑的背景颜色ComboBox在运行时 使用代码 特别是 我想更改可编辑的背景TextBox这是ComboBox SO 上有几个关于这个问题的答案 比如 WPF更改代码中可编辑组合框的背景颜色 https stackov
  • 观看过程替换

    我经常运行命令 squeue u USER tee gt wc l where squeue is a 泥浆命令 https slurm schedmd com squeue html查看您正在运行多少个作业 这给了我两个输出squeue并
  • mysqldb 总是将整个查询结果拉入一个块,即使我只是执行 fetchone?

    所以如果我这样做 import MySQLdb conn MySQLdb connect cur conn cursor cur execute SELECT FROM HUGE TABLE print hello print cur fe
  • 适用于 TB 级结构化数据的 Greenplum、Pivo​​tal HD + Spark 还是 HAWQ?

    我在 Greenplum DB 中有 TB 的结构化数据 我需要对我的数据运行本质上是 MapReduce 作业 我发现自己至少重新实现了 MapReduce 的功能 以便这些数据适合内存 以流式传输方式 然后我决定到别处寻找更完整的解决方
  • 将图像裁剪为正方形 - Android

    如何从左侧和右侧剪切矩形图像 600 x 300 以适合方形 ImageView 我不想调整图像大小 我只想将其裁剪为 300 x 300 解决方案 正如 blackbelt所说 Bitmap cropImg Bitmap createBi
  • 如何将 Aeson 的解析器与 IO 结合使用

    我的数据类型包含许多字段 如果不是由 JSON 配置文件手动指定 则应随机设置 我正在使用 Aeson 来解析配置文件 做这个的最好方式是什么 目前 我将值设置为等于某个不可能的值 然后检查该值以进行编辑 data Example Exam
  • iPhone:点击透明 UIScrollView 后面的视图

    我有一个 UIScrollView 设置为具有清晰的背景 滚动视图的一部分确实有内容 但一部分没有 因此它显示了后面的其他视图 我希望能够单击 UIScrollView 并单击后面的 MKMapView 但仅限于 UIScrollView
  • oracle存储过程中如何创建和使用临时表?

    我想在存储过程中创建临时表并以相同的方式访问它 但出现错误ORA 00942 Table or view does not exists 以下是我尝试过的过程 Create procedure myproc IS stmt varchar2
  • Flutter firebase 消息传递中的双重通知

    最近我升级到 firebase messaging 10 0 0 当应用程序未运行时 如果收到通知 它会显示两次 我收到后在代码中修改了通知数据并显示了它 即使如此 我也可以看到已修改和未修改的通知 我不知道该通知在哪里触发 但是当应用程序
  • DOORS数据库中的动态数组值得使用吗?

    我是 DOORS 数据库的新开发人员 正在使用 dxl 编写脚本 如您所知 dxl 中有一维数组 我想使用多个维度 因此决定使用动态数组 但这大大减慢了我的脚本速度 当每个模块大约有 14 000 个对象时 脚本运行需要一天左右的时间 我想
  • 浏览核心数据对象图 [2]

    我问了一个question https stackoverflow com questions 12733490 navigating the core data object graph昨天我真的应该从一个更简单的例子开始 将我的问题提炼
  • 在实践 II 中使用 Scala Actor 编写应用程序 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 因为我的第一个问题太长 所以我将其作为一个单独的问题提出 这是关于基于参与者的应用程序架构的另一篇文章