0

私は Scala 2.10.2、Akka 2.2.0 を使用しており、既存の Java クラスをアクターと統合することに意味があるかどうかを判断しようとしています。私が考えている Java クラスは、Apache Commons FileUpload ストリーミング APIです。

これは、アクターを使用せずに作業したものです

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(...) {...}
}

通常、アクターはすべてのメッセージをreceiveメソッド内で処理しますが、この場合、クラスには既に定義済みのメソッドがあります。より良い用語がないため、これを演じる方法はありますか? 私が検討したオプションは、アップロードを処理するためのアクターを作成するdoPostことです。これは、潜在的に大きなファイルを処理するブロッキング コールであるためです。考え?

4

1 に答える 1

0

インターフェイスを「演じる」方法があれば、ぜひ知りたいです。=) 私の意見では、最も簡単なことは、メッセージを送信できるアクターとして動作する値を作成し、それにストリーム処理の実装をプルすることです。したがって、重要なビットを切り取ると、次のようになります...

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 以外のものを送信すると失敗します。これは明らかに再利用可能なコードではありません。アクターの DSL を示すことだけを目的としています。

于 2013-08-25T01:24:02.913 に答える