首页 > 解决方案 > 通过 JNI 线程安全地使用 GraphViz 库

问题描述

我正在尝试在 Linux 下的 REST 服务中使用 GraphViz 2.40.1 来布置图形。该服务是一个 Java Spring Boot 应用程序。我目前的方法是将共享库加载到我的 JVM 中,并使用库cgraphgvc中的函数通过 JNI 调用本机代码。我想在内存中做所有事情并避免文件 I/O。但是我已经阅读了 GraphViz 库指南中的以下警告,在第 1 节末尾以粗体打印:“注意使用 Graphviz 作为库不是线程安全的。

我正在寻求有关我应该从该声明中得出的后果的帮助。没有给出细节。例如,我可以想象,对于图形解析中发生的错误保持可变状态的函数不是线程安全的,但我没有使用这些。我只使用以下函数:agmemreadand agclosefrom cgraphgvContext, gvParseArgs, gvLayout, gvRenderData, gvFreeRenderData, gvFreeLayout, gvFreeContextfrom gvc。我只在 Java、本地变量和方法参数中没有缓存任何内容。这种对库的使用会是线程安全的吗?

如果不是,非线程安全是否只影响单个函数的使用,而不影响跨函数的使用?那么制作我的 Java 本地方法就足够了static synchronized吗?还是我必须在每个 REST 请求上进行同步?

或者,我可以为每个请求派生一个新的操作系统进程,并使用 GraphViz 的 dot 程序和 Runtime.exec() 进行文件操作。

哪种方法最适合扩展?

标签: javamultithreadingjava-native-interfacegraphviz

解决方案


推荐阅读