现有一个c++程序,如图,我们要将此程序发布为webservice。
文件夹中的samplebase为可执行文件。
1. 配置环境
由于程序中引用了gdal环境,mpi和tomcat,因此我们首先要在Linux上配置好这些环境。
2. 编译
我们对c++程序进行编译,编译时要确保.cpp和.h以及main.cpp在同一个目录下
mpic++ *.cpp -o samplebase -lgdal
打开终端,进入c++程序所在的目录,输入以上命令即可编译,编译成功后即出现上图所示的samplebase可执行文件。其中-lgdal是引用已配置的gdal库。
3. 运行samplebase
由于本程序使用了mpi环境,因此运行samplebase时需要使用mpirun命令:mpirun -n 进程数 程序路径 参数。本程序是在单个计算机上完成的,没有配置集群环境,因此进程数设为本机的计算机核心数。程序路径即为我们生成的samplebase可执行文件的路径。在终端中输入一下命令即可:
mpirun -n 4 samplebase "/home/admin/work/sampleWebservice/data/geo.tif#/home/admin/work/sampleWebservice/data/evap.tif#/home/admin/work/sampleWebservice/data/slp.tif#/home/admin/work/sampleWebservice/data/rain.tif" "/home/admin/work/sampleWebservice/data/allpoints.csv" "Geology?Boolean#Climate?Gower#Terrain?Gower#Climate?Gower" 0.5 "/home/admin/work/sampleWebservice/result/property" "/home/admin/work/sampleWebservice/result/uncertainty"
在终端命令行中输入以上命令,即可成功运行。说明我们已经成功将C++算法封装为了可执行程序。
至此,我们是将一个c++程序封装为了可执行程序。
~~~~~~~~~~~~~~~~~~~~~~~~~下面进入正题~~~~~~~~~~~~~~~~~~~~~~~~
4. 编写java类并发布webservice
4.1 在eclipse中建立一个Java project
这里我们新建了一个Java类,代码如下:
package com.samplebase.solim;
import java.io.IOException;
public class Csolim {
public String calcProperty(String environLyrsPath,String samplePath,String attriRules,String threshold,String propertyResultPath, String uncertaintyResultPath) throws InterruptedException
{
String command="mpirun -n 4 /home/admin/work/sampleWebservice/samplebase/samplebase"+" " +environLyrsPath+" "+
samplePath+" "+attriRules+" "+threshold+" "+propertyResultPath +" "+uncertaintyResultPath;
Process process;
try {
process = Runtime.getRuntime().exec(command);
process.waitFor();
int exitCode = process.exitValue();
if(exitCode == 0)
{
//sucess
System.out.println("The process execution sucess!");
}
else
{
//failed
System.out.println("The process execution failure!");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "success";
}
}
这个Java类的主要作用就是通过Java调用我们已经生成好的c++可执行程序。
4.2 将本java类发布为webservice
右键选择Csolim.java,选择 web services—->create web service,按照如下界面一路next直到finish。
成功之后我们便会在eclipse中看到这样的两个项目:WebServiceProject和WebServiceProjectClient,其中在WebServiceProject下正好是我们所需要的wsdl文件。
右键Csolim.wsdl,选择Web services–>Test with Web Services Exploer。
如图所示,在这里我们便看到了我们在Java类中写的calcProperty方法,下面是方法所需的参数。我们在这里输入参数,便可成功调用我们的C++程序。
5. 导出war包
右键点击Java类的工程名“samplebase”,Export—>WAR file,导出War 包,将导出的War 包放到tomcat 的 webapps 目录下,重启 tomcat,这时我们在浏览器中输入以下地址即可访问我们生成的wsdl。
http://localhost:8080/WebServiceProject/services/Csolim?wsdl
如果其他机器要使用我们的wsdl的话,需要将localhost改为本机的IP地址。
6. 配置防火墙
此时,别的机器有可能还是无法访问我们的wsdl,因此我们要检查一下我们机器的防火墙设置了。
打开终端,输入:
sudo vim /etc/sysconfig/iptables
对防火墙进行配置,允许tomcat的8080端口通过。加入图中标红的语句即可。
输入命令,启动一下防火墙即可
service iptables start
或者,我们换一种方式,直接将防火墙关闭。
sudo service iptables stop
————————————————分割线————————————————————–
我们在步骤4.1中,也可以建立一个dynamic web project,这样在工程名samplebase目录下就会生成我们需要的wsdl。