可以将现有的 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 一起使用吗?

将现有的 django 应用程序与 django-cms 集成

我可以将现有的 html 主页谷歌分析代码添加到新的 wordpress 主页吗?