【问题标题】:KML marshal produces zero-length filesKML marshal 生成零长度文件
【发布时间】:2012-09-04 16:08:11
【问题描述】:
在 Java 代码中,我生成一个线程,每秒从模拟器收集 DIS 数据包,并尝试格式化 KML 输出。在我的 Java 代码中,我正在创建一个带有样式、地标和多边形的文档。每秒一次,我可以看到“marshal”API 例程确实使用我的数据创建了一个 KML 文件。但是,随机有时会创建一个完整的文件,有时会创建一个零长度文件。即使我关闭了我的 DIS 数据包生成器,让我的 Java 代码仍在运行,它仍会继续随机创建一个完整的文件,有时还会创建一个零长度文件。当我将计时器从每秒更改为每 10 秒时,该行为每 10 秒发生一次。
我尝试将 marshal() 用于 File 对象和 OutputStream 对象;同样奇怪的行为。
【问题讨论】:
标签:
java
marshalling
kml
jak
【解决方案1】:
这可能是由于并发访问。创建编组器是一项昂贵的操作,它需要时间,而且据我所知编组器不是线程安全的。我在 Restlet 中使用 jaxb 连接器,与 JAK 结合使用,这是 good example 关于如何创建编组器并以线程安全的方式缓存它们:
/** Use thread identity to preserve safety of access to marshalers. */
private final ThreadLocal<javax.xml.bind.Marshaller> marshaller = new ThreadLocal<javax.xml.bind.Marshaller>() {
查看如何在同步方法中创建编组器,然后将其存储在 ThreadLocal 变量中。