可以将现有的 Java 类与 Actor 集成吗?
Posted
技术标签:
【中文标题】可以将现有的 Java 类与 Actor 集成吗?【英文标题】:Possible to integrate existing Java class with Actor? 【发布时间】:2013-08-24 16:02:48 【问题描述】:我正在使用 Scala 2.10.2、Akka 2.2.0 并试图确定将现有 Java 类与 Actor 集成是否有意义。我想到的 Java 类是 Apache Commons FileUpload streaming API。
这就是我在不使用 Actor 的情况下所做的工作
class HelloWorld extends HttpServlet
override def doGet(req: HttpServletRequest, resp: HttpServletResponse) =
resp.getWriter().print("Hello World!")
override def doPost(req: HttpServletRequest, resp: HttpServletResponse ) =
if (ServletFileUpload.isMultipartContent(req))
val upload = new ServletFileUpload()
// Parse the request
val iter = upload.getItemIterator(req)
while (iter.hasNext())
val item = iter.next()
val name = item.getFieldName()
val stream = item.openStream()
if (item.isFormField())
println("Form field " + name + " with value " + Streams.asString(stream) + " detected.")
else
println("File field " + name + " with file name " + item.getName() + " detected.")
saveAttachment(item.getName(), stream)
resp.getWriter().print("\nFile uploads success!\n")
else
resp.getWriter().print("\nNo file upload found!\n")
private def saveAttachment(...) ...
通常,actor 在receive
方法中处理其所有消息,但在这种情况下,该类已经具有预定义的方法。由于缺乏更好的术语,有没有办法实现这一点?我考虑的一个选项是创建一个actor来处理doPost
中的上传,因为它是一个处理潜在大文件的阻塞调用。想法?
【问题讨论】:
【参考方案1】:如果有办法“制作”任何界面,我很想知道。 =) 在我看来,最简单的事情就是创建一个值,该值的行为类似于您可以向其发送消息的参与者,并将流处理实现拉入其中。所以,去掉重要的部分,它看起来像下面这样......
import akka.actor.ActorDSL._
class HelloWorld extends HttpServlet
val streamHandler = actor(new Act
become
case req: HttpServletRequest =>
val upload = new ServletFileUpload()
// ...
)
override def doPost(req: HttpServletRequest, resp: HttpServletResponse) =
if (ServletFileUpload.isMultipartContent(req))
streamHandler ! req
resp.getWriter().print("\nFile uploads success!\n") // This is optimistic; we don't really know for sure
else
resp.getWriter().print("\nNo file upload found!\n")
当然,这是一种胶带解决方案;如果您向其发送除 HttpServletRequest 以外的任何内容,则该参与者会崩溃,这显然不是真正可重用的代码。它只是为了演示actor DSL。
【讨论】:
我的一厢情愿,但actorfy
很吸引人,不是吗? :) 你的建议也符合我的想法,我认为没有比胶带更少的方法了,哈以上是关于可以将现有的 Java 类与 Actor 集成吗?的主要内容,如果未能解决你的问题,请参考以下文章
将现有的域类与 Spring Security 插件一起使用
将现有的静态html网站集成到现有的vue js web应用程序中
将现有的 Flutter Kotlin 项目转换为 Flutter Java 项目
可以将现有的 ViewController 与 PerformSegueWithIdentifier 一起使用吗?