启用C应用程序作为Web服务

时间:2009-06-08 02:56:48

标签: java c web-services java-native-interface

我们有一个用C语言编写的应用程序,它与Oracle数据库交互。此应用程序是可执行文件,可在unix平台上运行。我们需要通过http公开此应用程序作为Web服务,供其他人使用。

我想过将JNI和CXF用于webservice并在tomcat中运行应用程序。

这是一个正确的解决方案还是有其他可能性?

我发现Axis2支持C语言来编写webservice。我没有C语言的经验。 C中的Axis2是好的吗?我可以使用什么http服务器来部署应用程序?在这种情况下,Apache webserver会不会发生什么事?

编辑:命令行不是一个选项,好像我提到它的exe,但我必须公开的部分没有任何可用的命令行,它有点难,因为它需要复杂的数据结构作为输入。

3 个答案:

答案 0 :(得分:1)

这取决于几个因素。 Vinko的方法要求应用程序具有良好的干净命令行界面。此外,为每个Web服务请求创建新进程将限制可以服务的请求数。这可能会也可能不会取决于观众的预期。

如果没有那么棒的命令行界面,并且您希望最大化您可以提供的请求数量,那么您将有两个主要选择。用Java编写Web服务,并使用JNI或JNA调用C语言。或者,用纯C或C ++编写。如果负责任的开发人员不知道任何C,那么最后一个可能是不可取的。

编辑:鉴于命令行不是一个选项,我推荐使用JNI或JNA的Java。

答案 1 :(得分:1)

考虑使用Apache Foundation软件包Axis2/C。它是一个非常可靠的界面,但它的可移植性仍然有限(在Linux上开箱即用,但在Solaris上没有,例如 - 需要一些调整)。

但是,既然你说你没有C语言的经验,那可能会让你感到畏惧。另一方面,您说您尝试转换为Web服务的代码是C(加上Oracle OCI);这意味着你会发现很难避免学习一些C来使事情发挥作用。

答案 2 :(得分:0)

在服务器端使用Axis2 / C超过两年后,我强烈建议不要将Axis2 / C用于任何服务器端代码,原因如下:

  1. 内存泄漏。即,从WSDL泄漏,简单的HTTP服务器泄漏,CGI模块泄漏生成的服务代码(如果您将其用作基本CGI,这不是问题,但如果您使用FastCGI或类似的,或者重用代码,则是一个主要问题) 。到目前为止,我没有检查Axis2 / C中HTTP服务器代码的唯一部分是Apache2的mod_axis2模块。也许它会更好。

  2. Axis2 / C没有任何可以轻松嵌入C应用程序的HTTP服务器实现:“简单HTTP服务器”泄漏且不支持HTTP保持活动(在每次请求后关闭连接) )。我必须自己实现一个基于boost :: asio HTTP服务器示例和Axis2 / C CGI模块的服务器。花了1天实施,4天删除所有内存泄漏。这个比例似乎是任何Axis2 / C相关工作的标准。你想和valgrind一起度过几天昼夜,调试内存泄漏和双重免费吗?

  3. 最重要的是,项目没有得到积极维护:JIRA中有很多补丁问题,但需要花费数月甚至数年时间来审核和应用补丁。我怀疑是否有任何严肃的项目将它用于服务器端。我的长期计划是将其克隆到GIT并在github上维护修补版本(我必须支持已经用Axis2 / C实现的代码多年)。

  4. P.S。在我的下一个与Web服务相关的子项目中,我将使用JNI嵌入Jetty + CXF。