2016-06-07 82 views
1

我正在研究一个Web应用程序,但我需要调用某些专有的C++库函数。据我所知,本机方法不是线程安全的,因此,本地代码中的访问冲突可能会导致应用程序服务器JVM崩溃。 (Tomcat)的。这个本地API只是整个Web应用程序功能的一小部分,我想说只有5%的用户会访问这个功能。无论测试的应用程序有多彻底(我无法访问本地源代码),本地库中存在潜在错误的风险都可能导致整个应用程序服务器注销用户并导致可能的停机时间。在Servlet容器中使用JNI库

所以这个问题 - 哪种策略更好?

1)我是否应该将本机库封装在单独的进程中,以便主Web服务器不受本机代码中的错误影响。我大概可以使用UNIX套接字与我的Web服务器上的这个独立进程进行通信。 (避免TCP套接字的开销)。如果发生这种情况,请尽快解决问题,并接受5%用户的停机时间。

或者

2)硬着头皮继续在servlet容器使用JNI。 (随着对每个人潜在的停机时间的风险)

问候, 罗希特

+0

“本地方法不是线程安全的” - 不正确!它们要么是线程安全的,要么取决于设计。你也可以在非同步java外观中包装非线程安全的方法。 – Wheezil

回答

0

这取决于:

考虑到,如果一个函数不是线程安全的,也就是说并不一定意味着它会如果从多线程调用,则会崩溃。它可能仅仅返回完全错误的结果。

  1. 如果你的应用程序无法克服它,那么你没有其他选择,你需要序列化访问本地代码。

  2. 如果您确定调用非线程安全函数的唯一副作用是它可能会崩溃,那么您需要确保崩溃不会导致其他类型的错误,如不一致的数据在您的后端应用程序(数据库损坏等)中。 (您可以使用事务,以防止这一点。)

  3. 如果你的应用是能够克服所有上述情况,那么第三个资料片仍需: 你需要学习多长时间的停机/崩溃的用户能够忍受。如果他们容忍可能发生的停机时间,那么请继续前进,不要关心崩溃情况,您可以放心地“咬紧牙关”,因为这不会损害用户或应用程序。

在所有其他情况下,您必须序列化访问本机功能。

将它们包装到一个过程中可能是一个好主意,但是您必须确保函数一次只能在一个线程中运行。所以可能你需要实现一些机制来让其他线程/ servlet等待,直到其中的一个完成调用函数。

+0

谢谢你的洞察力。 – RohitV