实现思路如下:
部署服务
部署服务器操作可分为两步,首先是配置服务器参数,其次是启动服务器。
服务器配置
在集算器安装目录的 esProc\bin 路径下,找到 esprocs.exe 文件,可以直接运行它来启动或配置服务器,运行后,打开窗口如下:
在 esprocs.exe 执行时,窗口中会显示加载初始设定的信息,这些设定实际上是由配置文件 raqsoftConfig.xml 决定的。在右侧的菜单栏中点击 Options,可以配置服务器的相关信息,点击后弹出服务器配置窗口如下:
在该界面中,可以配置授权文件、主路径、寻址路径、日期时间格式、默认字符编码、日志等级、文件缓存区字节数等信息。
下面我们继续来了解服务器的配置,选择 Http Server ,在右侧的菜单栏中点击 Config,可以打开集算器 HTTP 端口设置窗口如下:
在该界面中,可配置服务器的 IP 地址、端口号和最大并行数,服务器设定完成后,点击 OK,此时可以自动设定对应的配置文件 HttpServer.xml,如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--Note: In order to avoid problems while the program is running, the charset of HttpServer.xml must be UTF-8 -->
<Server Version="1" host="127.0.0.1" port="8503" parallelNum="10"/>
运行服务器
服务配置完成后,在 Http Server 窗口点击 Start 即可开始运行服务器,如下:
需要停止服务可以点击 Stop,服务器停止后可以点击 Quit 退出。如果点击 Reset,服务将初始化重新启动,清除所有的全局变量以及内存区。
在 Linux 系统中,可以运行 ServerConsole.sh 来启动服务器类,打开的服务器运行窗口和在 Windows 下是相同的。
此外,还可以在执行命令时添加 -h 参数,非图形启动服务器,此时可直接执行命令:
./ServerConsole.sh -h
HTTP 调用
HTTP 调用 SPL,原理上就是通过 url 读取 dfx 文件的结果集,被调用的 dfx 脚本中,结果要求用 return 语句返回,下面来看下具体是怎样实现的:
调用单个 dfx
比如通过 HTTP 服务读取 HSQL 数据库中的员工表,首先需要在 raqsoftConfig.xml 的 < Runtime ></ Runtime > 节点中配置数据源信息:
<DB name="HSQLDB"> <!-- 数据源名称-->
<!-- url连接-->
<property name="url" value="jdbc:hsqldb:hsql://127.0.0.1/demo" />
<!--数据库驱动-->
<property name="driver" value="org.hsqldb.jdbcDriver" />
<property name="type" value="13" /> <!--数据库类型-->
<property name="user" value="sa" /> <!-- 用户名称 -->
<property name="password" value="123456"/> <!-- 密码 -->
<property name="batchSize" value="1000" />
<property name="autoConnect" value="true" /> <!--是否自动连接-->
<property name="useSchema" value="false" />
<property name="addTilde" value="false" />
<property name="dbCharset" value="UTF-8" />
<property name="clientCharset" value="UTF-8" />
<property name="needTransContent" value="false" />
<property name="needTransSentence" value="false" />
<property name="caseSentence" value="false" />
</DB>
dfx 脚本内容如下:
A | |
1 | =connect("HSQLDB") |
2 | =A1.query("select * from employee") |
3 | =A1.close() |
4 | return A2 |
dfx 文件命名为emp.dfx并保存在主目录下,HTTP 调用时 URL 写法为:
http://127.0.0.1:8503/emp.dfx
其中 127.0.0.1:8503 为前面服务器中配置的 IP 及端口号,后面连接带扩展名的 dfx 名称。
浏览器访问 URL 结果如下:
通过浏览器访问 URL 时,返回结果显示为无格式的文本,所以浏览器常用作调试使用。日常业务中,用户可在自己的程序中调用 URL,结果集可自由使用。下面我们以 java 程序为例,访问上面的 URL:
java 代码如下:
URL url = new URL("http://127.0.0.1:8503/emp.dfx"); //传入URL串
HttpURLConnection urlcon = (HttpURLConnection)url.openConnection();
urlcon.connect(); //获取连接
InputStream is = urlcon.getInputStream();
BufferedReader buffer = new BufferedReader(new InputStreamReader(is));
StringBuffer bs = new StringBuffer();
String l = null;
while((l=buffer.readLine())!=null){
bs.append(l).append("\n");
}
System.out.println(bs.toString());
结果如下:
调用带参数的 dfx
HTTP 还可以调用带有参数的 dfx 文件,比如从数据源中查询 SALES 表,过滤出 SELLERID 为 3 的员工,在 2014 年 11 月 11 号到 2014 年 12 月 12 号期间的所有订单信息。
dfx 脚本内容如下:
A | |
1 | =connect("HSQLDB") |
2 | =A1.query("select * from SALES where SELLERID = ? and ORDERDATE>? and ORDERDATE<?",arg1,arg2,arg3) |
3 | =A1.close() |
4 | return A2 |
网格参数:
dfx 文件命名为 sales.dfx 并保存在主目录下,此时,HTTP 调用时 URL 写法为:
http://127.0.0.1:8503/sales.dfx(3,2014-11-11,2014-12-12)
其中,dfx 后括号中的内容为各个参数所对应的值,多个参数值之间用逗号分隔。
调用多个 dfx
使用 HTTP 调用 dfx 时,如果返回的结果集格式不理想,还可以通过另一个 dfx 文件格式化当前的结果集,此时可同时调用两个 dfx。
该用法中 URL 调用时格式为
http://IP:port/dfx1.dfx(...)dfx2.dfx
其中 dfx1.dfx 被 dfx2.dfx 引用,要求 dfx1 返回结果必须为单结果集,dfx2 中必须有一个参数,且参数值为 dfx1 的返回值。
比如,在 dfx1 中查询本地数据文件 Sales.txt,统计所有的 STATE 字段值:
p1.dfx脚本内容如下:
A | |
1 | $()select * from D:\Sales.txt |
2 | =A1.(STATE) |
3 | return A2 |
缺省返回由 STATE 字段值组成的序列,但是用户期望的效果是以逗号作为分隔符以字符串的形式返回,此时就可以使用 p2.fx 对 p1.dfx 的结果进行格式处理:
p2.dfx脚本内容如下:
A | |
1 | =arg1.concat@c() |
2 | return A1 |
网格参数:
HTTP 调用时,URL 写法:
http://127.0.0.1:8503/dfx1.dfx()dfx2.dfx()
SAP 风格
从上面的例子中可以发现,所调用的 dfx 文件皆是保存在主目录下的,如果 dfx 保存在主目录的子目录中,应该怎么调用呢?
集算器中提供了类似 SAP 的 result 风格的用法,首先,在 httpServer.xml 的 sapPath 属性中配置 dfx 相对与主目录的路径,可以是多层目录结构,也可以是空串,空串则表示位于主目录下,多个路径间用逗号隔开,比如:
<?xml version="1.0" encoding="UTF-8"?>
<Server Version="1" host="127.0.0.1" port="8503" parallelNum="10"sapPath="/sf,,/sr/pm"/>
该 xml 中,sapPath 配置了三个相对路径,分别表示 [主目录]/sf、[主目录]、[主目录]/sr/pm。
该风格调用,dfx 无参数时,URL 格式为:
http://IP:port/sapPath/dfxName
dfx 带参数时,URL 格式为:
http://IP:port/sapPath/dfxName/arg1[value1]/arg2[value2],...
其中,sapPath 表示 httpServer.xml 中 sapPath 属性中设置过的路径;
dfxName 表示 dfx 名称,调用时不带扩展名;
arg1[value1]/arg2[value2],… 表示 dfx 中的参数名称及参数值,要求参数名称必须为纯字母组成的字符串,参数值必须为首字符为数字的字符串,调用时参数名称与参数值拼接成一个字符串使用,多个参数之间用“/”隔开。
示例一:查询本地数据文件,gy.dfx脚本内容如下:
A | |
1 | $()select * from Geography.txt |
2 | return A1 |
该 dfx 位于 [主目录]/sf 路径下,则 URL 写法如下:
http://127.0.0.1:8503/sf/gy
其中 /sf 表示 dfx 文件相对于主目录的位置,gy 则表示调用的 dfx 为 gy.dfx。
示例二:带参数的 dfx 文件,gypb.dfx脚本内容如下:
A | |
1 | $()select * from Geography.txt where ID>? and Parent=?;id,parent |
2 | return A1 |
网格参数:
该 dfx 中用到了两个参数,参数名称分别为 id、parent,dfx 位于 [主目录]/sr/pm 下,调用时 URL 写法如下:
http://127.0.0.1:8503/sr/pm/gypb/id3/parent15
其中,/sr/pm 表示 dfx 相对于主目录的位置,gypb 表示调用的 dfx 为 gypb.dfx,id3/parent15 表示参数 id 的值为 3,参数 parent 的值为 15。
示例三:
当 xml 中的 sapPath 中配置了空串时,可以使用该风格的调用来访问位于主目录下的 dfx,这里依然使用前面的 emp.dfx 为例,则 URL 写法如下:
http://127.0.0.1:8503/emp
对比可以看到,URL 的区别就是这里不需要写 dfx 的扩展名。
IPV6 协议时的用法
服务器中配置的 IP 地址支持 IPV6 协议,使用 IPV6 协议时,要求的 JDK 版本最低为 1.8,HTTP 调用时 URL 写法也略有不同,需要在 IP 地址外加上“[]”。
例如服务器中配置:
此时访问 dfx 时 URL 写法为:
http://[fe80::9c9d:a071:3abc:e207]:8503/localData.dfx
需要注意的是,把 IP 地址写入 URL 时,"%“为特殊符号,要用指定字符”%25" 来代替 ,由于 IPV6 地址末尾的 % 及其后内容是非必要的字符,所以也可以直接去掉不写。
以上就是 HTTP 调用 SPL 的全部用法了。