我可以在Scala Enumeratee中使用非易失性外部变量吗?

时间:2015-01-13 08:12:32

标签: scala concurrency playframework enumeration volatile

我需要根据特定属性(providerId)将我的枚举器的输出分组到不同的ZipEntries中,原始的chartPreparations流按providerId排序,因此我可以保持对提供者的引用,并在提供者chages时添加新条目

        Enumerator.outputStream(os => {
            val currentProvider = new AtomicReference[String]()
            // Step 1. Creating zipped output file
            val zipOs = new ZipOutputStream(os, Charset.forName("UTF8"))
            // Step 2. Processing chart preparation Enumerator
            val chartProcessingTask = (chartPreparations) run Iteratee.foreach(cp => {
                // Step 2.1. Write new entry if needed
                if(currentProvider.get() == null || cp.providerId != currentProvider.get()) {
                    if (currentProvider.get() != null) {
                        zipOs.write("</body></html>".getBytes(Charset.forName("UTF8")))
                    }
                    currentProvider.set(cp.providerId)
                    zipOs.putNextEntry(new ZipEntry(cp.providerName + ".html"))
                    zipOs.write(HTML_HEADER)
                }
                // Step 2.2 Write chart preparation in HTML format
                zipOs.write(toHTML(cp).getBytes(Charset.forName("UTF8")))
            })
            // Step 3. On Complete close stream
            chartProcessingTask.onComplete(_ => zipOs.close())
        })

由于当前的提供者引用正在改变,在输出期间,我将其作为AtomicReference,以便我可以处理来自不同线程的引用。

currentProvider可以只是一个var Option [String],为什么?

0 个答案:

没有答案