java - 通过 JNI 线程安全地使用 GraphViz 库
问题描述
我正在尝试在 Linux 下的 REST 服务中使用 GraphViz 2.40.1 来布置图形。该服务是一个 Java Spring Boot 应用程序。我目前的方法是将共享库加载到我的 JVM 中,并使用库cgraph和gvc中的函数通过 JNI 调用本机代码。我想在内存中做所有事情并避免文件 I/O。但是我已经阅读了 GraphViz 库指南中的以下警告,在第 1 节末尾以粗体打印:“注意使用 Graphviz 作为库不是线程安全的。 ”
我正在寻求有关我应该从该声明中得出的后果的帮助。没有给出细节。例如,我可以想象,对于图形解析中发生的错误保持可变状态的函数不是线程安全的,但我没有使用这些。我只使用以下函数:agmemread
and agclose
from cgraph和gvContext
, gvParseArgs
, gvLayout
, gvRenderData
, gvFreeRenderData
, gvFreeLayout
, gvFreeContext
from gvc。我只在 Java、本地变量和方法参数中没有缓存任何内容。这种对库的使用会是线程安全的吗?
如果不是,非线程安全是否只影响单个函数的使用,而不影响跨函数的使用?那么制作我的 Java 本地方法就足够了static synchronized
吗?还是我必须在每个 REST 请求上进行同步?
或者,我可以为每个请求派生一个新的操作系统进程,并使用 GraphViz 的 dot 程序和 Runtime.exec() 进行文件操作。
哪种方法最适合扩展?
解决方案
推荐阅读
- java - Switch 语句打印大小写不正确?
- ruby-on-rails - 我无法使用向导表单(多步表单)将数据(图像)保存到数据库
- java - 是否可以使用双簧管库同时在 Android 中打开 2 个麦克风?
- angular - 如何从扩展面板跳过标签顺序?
- angular - Angular 中的 *ng for 循环内的 *ng for 循环中是否可以有多个工具功能
- amazon-web-services - 如何通过项目的属性对 dynamodb 查询结果进行排序?
- flutter - Flutter 邮件程序正在发送重复的电子邮件,同时发送两封
- r - 如何在没有for循环的情况下获得相同的结果?
- ios - 通过声音和振动推送通知
- mysql - select 语句也可以查询除列之外的行吗?