当前位置: 首页 > 知识库问答 >
问题:

Spray是否只允许路由代码中的一个线程?

华宣
2023-03-14

喷雾布线基于Akka actor系统。在我记得的所有示例代码中,路由都是“快速”完成的,并且将实际工作派生给其他参与者,除非需要同步完成以获得响应。

换句话说,喷雾路由多线程模型到底是什么?

我可以将验证生成给另一个参与者,但在这种情况下,REST API响应将不再能够报告传入内容是否存在错误。处理这件事的最佳方法是什么?

共有1个答案

庄子平
2023-03-14

1)HTTP.bind.apply()Listener参数可以是一个执行元池。在这种情况下,您将有几个相同的执行元以同时运行多个HTTP请求的路由。

2)通常不应该在执行元(包括喷雾路由执行元)内执行任何阻塞调用和/或繁重任务。一般来说,使用另一个参与者池来执行这些任务会更好,使用喷雾路线中的ask模式,或者创建一个临时的每请求执行元(不要忘记设置SetReceiveTimeout并在其中处理超时),它可以向另一个执行元发送消息并等待应答(并在应答HTTP请求后死亡),或者创建一个简单的Future,将Spray的请求上下文(ctx)包含到这个参与者或未来,并允许他们在各自的线程中完成这样的工作,在所有工作完成时使用适当的HTTP状态和实体完成请求上下文(但是您应该避免将Spray请求上下文作为消息或消息部分传递给任何参与者,因为它有大量的上下文,其中包括不可序列化的部分)。

 类似资料:
  • #include <stdio.h> #include <pthread.h> int a = 0; int b = 0; void *thread1_func(void *p_arg) { while (1) { a++; sleep(1); } } void *thread2_fu

  • 问题内容: 我想使我的网站一次只允许一个会话。例如,假设用户已经登录到我在firefox上的网站,如果该用户再次登录到另一台浏览器(例如同一台计算机或另一台计算机上的Opera),则Firefox上的会话将被破坏。但是,如果仍为一届会议,则有关Firefox的会议仍将保留。我可以知道该怎么做吗?我正在使用php和apache。谢谢。 问候。本杰明 问题答案: 我建议您做这样的事情: 假设用户“ A

  • 我在 Openshift Online v3 入门计划上部署了一个应用程序,该应用程序(过去)运行良好,直到昨天。昨天我不得不发布我的应用程序的新版本。显然,该平台在重新部署它时遇到了一些问题,我不得不取消一些似乎锁定或不断重启的进程。最后,我设法让我的 pod 使用新版本运行,日志看起来很好。 现在的问题是我的应用程序不再暴露。当点击分配给我的URL时,我得到了臭名昭著的“不可用”OO页面: 我

  • 我使用spray-can、spray-http 1.3.2和akka 2.3.6设置了一个http服务器。我的application.conf没有任何akka(或spray)条目。我的演员代码: 开始是这样的: 当我发送10个并发请求时,它们都被spray立即接受并转发给不同的dispatcher Actor(根据akka的日志配置,我已从applicaiton.conf中删除,以免影响结果),但

  • 问题内容: 我知道在Go中,会将goroutine绑定到一个OS线程,并且不允许其他goroutine在该线程中执行。儿童goroutine也是这样吗? 例如: 这两个goroutine是在单个和排他的OS线程中执行还是仅在第一个线程中执行? 问题答案: 文档的说: LockOSThread 将调用goroutine连接 到其当前的操作系统线程。在调用goroutine退出或调用UnlockOST

  • 问题内容: 我正在使用RxJava计算Android中某些传感器数据的标准化自动相关性。奇怪的是,我的代码引发了一个异常(“ java.lang.IllegalStateException:只允许一个订阅者!”),我不确定该怎么做:我知道GroupedObservables订阅多个订阅者时可能会抛出此异常,但是我不认为我在任何地方都在使用这种东西。 在下面,您找到(最有可能)触发异常的方法: 这是