我正在尝试使用Okku库在Clojure应用程序中使用Akka。我对Akka很新。我被困在如何在actor中创建一个状态变量,该变量为actor的每个实例化进行初始化。
我使用的设置非常类似于Okku项目中的Pi示例。我有一个主协调员演员,它产生了一些工人演员来完成一些工作。主设备读取Avro文件并将包含从每个Avro记录中读取的内容的消息发送给工作人员。
我现在遇到的问题是如何在实例化每个工作者时为每个工作者创建一个对象,以便为每个消息重用它们。我在这里和UIMA一起工作并且创建一个新的jCAS对象是一个昂贵的操作(如果你创建了太多的垃圾收集器它真的会让垃圾收集器变成一个tizzy),所以我想创建一个jCAS对象,其中的工作是实例化的,每次工作人员收到消息时重复使用该对象。
这是我的第一次尝试,显然无法正常工作(它正在创建一个由所有工作人员共享的单个jCas对象。
(defn worker
"Individual worker actor to process a single file."
[countfn]
(let [jcas (atom nil)]
(okku/actor
(preStart [] (reset! jcas (JCasFactory/createJCas)))
(onReceive [{t :type doc :document}]
(okku/dispatch-on t
:processdoc (do (uima/deserialize-xmi-jcas @jcas doc)
(! (m-result (countfn @jcas)))))))))
是否可以使用Okku为每个工作者实例提供自己的jcas
对象,或者我是否需要以某种方式使用gen-class
来创建UntypedActor
的子类?