我正在开发一个Web应用程序,但我需要调用某些专有的C ++库函数。据我所知,本机方法不是线程安全的,因此本机代码中的访问冲突可能会使应用程序服务器JVM崩溃。 (Tomcat)的。这个本机API只是整个Web应用程序功能的一小部分,我想只有5%的用户会访问此功能。无论应用程序的测试程度如何(我无法访问本机源代码),本机库中存在潜在错误的风险可能导致整个应用程序服务器注销用户并可能导致停机。
所以问题 - 哪种策略更好?
1)我是否应该在单独的进程中包装本机库,以便主Web服务器不受本机代码中的错误影响。我可以使用UNIX套接字从我的Web服务器与这个单独的进程通信。 (避免TCP套接字的开销)。如果发生这种情况,请尽快解决问题并接受5%用户的停机时间。
或者
2)咬紧牙关并继续在servlet容器中使用JNI。 (存在可能导致每个人停机的风险)
此致 罗希特夏尔
答案 0 :(得分:0)
取决于:
考虑到,如果函数不是线程安全的,那么这并不一定意味着如果从多线程调用它会崩溃。它可能只会返回完全错误的结果。
如果您的应用程序无法以某种方式克服它,那么您没有其他选项,您需要序列化对本机代码的访问。
如果您确定调用非线程安全函数的唯一副作用是它可能崩溃,那么您需要确保崩溃不会导致其他类型的错误,例如不一致您的应用程序中的数据在后端(数据库损坏等)。 (您可以使用交易来防止这种情况。)
如果您的应用程序能够克服以上所有问题,那么仍然需要第三条信息: 您需要研究用户容忍的停机/崩溃程度。如果他们容忍可能的停机时间,那么继续并且不关心崩溃,你可以安全地咬紧牙关",因为它不会伤害你的用户或你的应用程序。
在所有其他情况下,您必须序列化对本机函数的访问。
将它们包装到进程中可能是一个好主意,但您必须确保函数一次只能在一个线程中运行。所以你可能需要实现一些机制来让其他线程/ servlet等到其中一个完成调用函数之后。