天天看點

Java 如何遠端調用 SPL 腳本

在《Java 如何調用 SPL 腳本》中我們介紹了在 Java 中可以部署集算器 JDBC 來調用本地 SPL 腳本,那如何能在 Java 中遠端調用 SPL 腳本呢?這就是接下來要說的重點!

實作思路通過下圖一目了然:

Java 如何遠端調用 SPL 腳本

部署伺服器

伺服器是運作在 Java 平台上面向分析型的高性能資料庫,作為高性能計算資料倉庫,伺服器可以在離線跑批、線上查詢、多元分析和記憶體計算等方面提供高效的計算輸出,幫助使用者解決計算中的多種問題。

下面我們先來了解一下伺服器的使用及配置,更多關于伺服器的介紹可參考集算器線上文檔《教程》伺服器小節。

1. 伺服器配置

在集算器安裝目錄的 esProc\bin 路徑下,可以找到 esprocs.exe 檔案,可以直接運作它來啟動或配置伺服器。使用 esprocs 時,會自動在安裝路徑下加載所需的 jar 包,但是需要注意此時使用的配置檔案 raqsoftConfig.xml 和 unitServer.xml 必須放置在集算器安裝目錄的 esProc\config 路徑下。運作後,打開視窗如下:

Java 如何遠端調用 SPL 腳本

在 esprocs.exe 執行時,視窗中會顯示加載初始設定的資訊,這些設定實際上是由配置檔案 raqsoftConfig.xml 決定的。在右側的菜單欄中點選 Options,可以配置伺服器的相關資訊,點選後彈出伺服器配置視窗如下:

Java 如何遠端調用 SPL 腳本

在頁面中,可以配置授權檔案、主路徑、尋址路徑、日期時間格式、預設字元編碼、日志等級、檔案緩存區位元組數等資訊。

下面我們繼續來了解伺服器的配置,在右側的菜單欄中點選 Config,可以配置分機的相關資訊,點選後在 Unit 頁面中可以配置分機資訊,如下:

Java 如何遠端調用 SPL 腳本

Temp file timeout 設定臨時檔案的生命周期小時數;Check interval 必須設定為正值或 0,為檢查過期的間隔秒數;Proxy timeout 為代理生命周期,即遠端遊标、任務空間的生命小時數。如果 Temp file timeout 或者 Proxy timeout 設定為 0,則不檢查過期。

分機清單 Host list 中,可以配置本機上所有可能用來運作伺服器的分機,配置它們的 IP 位址,在程序清單 Process list 中,可以為一個 IP 位址配置多個程序的端口 Port,其中第一個為主程序。伺服器啟動時,會自動在分機清單中,尋找有空閑程序的分機,然後再由分機将任務交由某個程序執行。需要注意的是,IP 位址需要是本機的真實 IP,在使用多網卡的情況下可以設定多個 IP。

分機配置中,Max task number 是該分機允許執行的最大作業數,而 Preferred task number 是該分機的适合作業數,當分機中使用了多個程序時,适合作業數就是分程序的總數。在 Partitions 一欄中,可以選擇每個分機上所使用的分區。

伺服器的 Enable clients 頁面中可以設定用戶端白名單,如下:

Java 如何遠端調用 SPL 腳本

標明 Check clients 後,可以在 Clients hosts 清單中,設定允許調用伺服器的 IP 位址白名單,不在設定範圍中的 IP 位址将無法調用伺服器執行計算。

伺服器設定完成後,點選 OK,此時可以自動設定對應的配置檔案 unitServer.xml 如下:

<?xml version="1.0" encoding="UTF-8"?>

<SERVER Version="3">

<TempTimeOut>12</TempTimeOut>

<Interval>1800</Interval>

<ProxyTimeOut>12</ProxyTimeOut>

<Hosts>

<Host ip="192.168.107.1" maxTaskNum="8" preferredTaskNum="3">

<Partitions>

<Partition name="0" path="d:/file/parallel/node1/0">

</Partition>

<Partition name="1" path="d:/file/parallel/node1/1">

</Partition>

</Partitions>

<Units>

<Unit port="8281">

</Unit>

<Unit port="8282">

</Unit>

</Units>

</Host>

</Hosts>

<EnabledClients check="true">

<Host start="192.168.107.1" end="192.168.107.1">

</Host>

</EnabledClients>

</SERVER><?xml version="1.0" encoding="UTF-8"?><SERVER Version="3"><TempTimeOut>12</TempTimeOut><Interval>1800</Interval><ProxyTimeOut>12</ProxyTimeOut><Hosts><Host ip="192.168.107.1" maxTaskNum="8" preferredTaskNum="3"><Partitions><Partition name="0" path="d:/file/parallel/node1/0"></Partition><Partition name="1" path="d:/file/parallel/node1/1"></Partition></Partitions><Units><Unit port="8281"></Unit><Unit port="8282"></Unit></Units></Host></Hosts><EnabledClients check="true"><Host start="192.168.107.1" end="192.168.107.1"></Host></EnabledClients></SERVER>      

2. 運作伺服器

伺服器配置完成後,在分機運作視窗中,點選 Start 即可開始運作伺服器,需要停止服務可以點選 Stop,伺服器停止後可以點選 Quit 退出。如果點選 Reset,服務将初始化重新啟動,清除所有的全局變量以及記憶體區。

Java 如何遠端調用 SPL 腳本

在分機啟動時,設定的各個程序會同時啟動,可以點選 Main 檢視分機主程序的執行情況,或者點選對應的端口号檢視分機的其它分程序執行頁面。

在 Linux 系統中,可以運作 ServerConsole.sh 來啟動伺服器類:

Java 如何遠端調用 SPL 腳本

打開的分機運作視窗和在 Windows 下是相同的:

Java 如何遠端調用 SPL 腳本

此外,還可以在執行指令時添加 -p 參數,非圖形啟動伺服器,此時伺服器将直接執行:

Java 如何遠端調用 SPL 腳本

部署集算器 JDBC

将啟動 JAVA 應用程式時加載集算器所需的 jar 包及配置檔案放到項目中。需要注意的是,集算器 JDBC 所要求的 JDK 版本不得低于 1.6。

1. 加載驅動 jar

集算器 JDBC 類似一個不帶實體表的資料庫 JDBC 驅動,可以把它簡單的看成是一個隻有存儲過程的資料庫。另外,集算器 JDBC 是個完全嵌入式計算引擎,已經在 JDBC 中完成了所有運算,不象資料庫那樣 JDBC 隻是個接口,實際運算在獨立的資料庫伺服器完成。

如果在 web 應用項目下,可以把這些 jar 包放在 WEB-INF/lib 目錄下。集算器 JDBC 需要三個基礎 jar 包,都可以在 [安裝目錄]\esProc\lib 目錄下找到:

dm.jar //集算器計算引擎及JDBC驅動包

icu4j_3_4_5.jar //處理國際化

jdom.jar  //解析配置檔案dm.jar //集算器計算引擎及JDBC驅動包icu4j_3_4_5.jar //處理國際化jdom.jar  //解析配置檔案      

除了以上的必需 jar,還有一些為完成特定功能的 jar 包:

比如資料庫作為資料源,那麼還需要相應資料庫的驅動 jar 包;

要讀寫 Office 檔案,則需要加入 poi*.jar 和 xmlbeans.jar; 要使用繪制圖形功能,則需要加入 SVG 圖形處理相關的 jar 包,包括 batik*.jar、js.jar、pdf-transcoder.jar、xalan-2.6.0.jar、xercesImpl.jar、xml-apis.jar、xml-apis-ext.jar。

2. 部署 raqsoftConfig.xml

集算器還有個重要的配置檔案 raqsoftConfig.xml,可以在 [安裝目錄]\esProc\config 下找到,需複制後放置在應用項目的類路徑下,配置檔案的名稱不可改變。

在 raqsoftConfig.xml 檔案中,配置了授權資訊、集算器主路徑、dfx 檔案尋址路徑、JDBC 遠端通路的伺服器位址等各類資訊。我們先看下最基本的配置,即集算器授權檔案和伺服器位址的配置:

<?xml version="1.0" encoding=" UTF-8"?>  
<Config Version="2">  
 <Runtime>  
 <Esproc>  
    <!--集算器授權檔案配置,可以是絕對路徑,也可以是相對路徑,使用相對路徑時是相對于類路徑-->  
    <license>esproc.xml</license>  
    <!--試用授權檔案可從潤乾公司官網中下載下傳-->  
 </Esproc>  
 </Runtime>  
<JDBC>  
<!--配置JDBC需遠端通路的伺服器位址-->  
<Units>  
<!--為友善多機熱備,可配置多台伺服器位址,添加多個<Unit></Unit>節點-->  
<Unit>192.168.107.1:8281</Unit>  
</Units>                
 </JDBC>  
</Config><?xml version="1.0" encoding=" UTF-8"?>  <Config Version="2">   <Runtime>   <Esproc>      <!--集算器授權檔案配置,可以是絕對路徑,也可以是相對路徑,使用相對路徑時是相對于類路徑-->      <license>esproc.xml</license>      <!--試用授權檔案可從潤乾公司官網中下載下傳-->   </Esproc>   </Runtime>  <JDBC>  <!--配置JDBC需遠端通路的伺服器位址-->  <Units>  <!--為友善多機熱備,可配置多台伺服器位址,添加多個<Unit/>節點-->  <Unit>192.168.107.1:8281</Unit>  </Units>                
 </JDBC>  </Config>      

Java 調用

接下來我們以通路伺服器上的資料檔案為例,介紹如何在 Java 中遠端通路伺服器。

Java 通過 SPL 不僅可以通路本地檔案,還能遠端通路伺服器上的資料檔案,其中包括 Txt、Excel、Json、Csv、Ctx 等多種類型的檔案。

通路時可以通過絕對路徑查檔案位置,也可以通過相對路徑查找。這裡的絕對路徑和相對路徑都是會到伺服器上去找。使用相對路徑時,則是相對于伺服器中 raqsoftConfig.xml 配置檔案中的主目錄,是以,首先我們來配置下伺服器上的主目錄:

在 raqsoftConfig.xml 檔案的節點中添加以下節點:

<!--集算器主路徑,該路徑為單一的絕對路徑-->

 <mainPath>D:\\mainFile</mainPath><!--集算器主路徑,該路徑為單一的絕對路徑-->

 <mainPath>D:\\mainFile</mainPath>      

我們把要調用的檔案 employee.txt 放到伺服器的主目錄下面,Java 代碼如下:

public  void runSPL() throws ClassNotFoundException, SQLException{  
    Connection con = null;  
    PreparedStatement st;  
    ResultSet set ;  
    //建立連接配接  
    Class.forName("com.esproc.jdbc.InternalDriver");  
//onlyServer用于控制目前jdbc是否對伺服器進行遠端計算,為true表示遠端計算;false時表示本地計算  
//注意:屬性值為false,當SPL語句使用call dfx或dfx時,會先使用本地計算,如未計算成功則會進行遠端計算  
    con= DriverManager.getConnection("jdbc:esproc:local://?onlyServer=true");  
    //直接執行SPL語句,傳回結果集  
    st = (PreparedStatement)con.createStatement();  
    ResultSet rs = st.executeQuery("$select * from employee.txt");  
     
    //簡單處理結果集,将結果集中的字段名與資料輸出   
    ResultSetMetaData rsmd = rs.getMetaData();  
    int colCount = rsmd.getColumnCount();  
    for ( int  c = 1; c <= colCount;c++) {  
    String title = rsmd.getColumnName(c);  
    if( c > 1 ) {  
        System.out.print("\t");  
    }  
    else {  
        System.out.print("\n");  
    }  
        System.out.print(title);  
  }  
    while (rs.next()) {  
     for(int c = 1; c<= colCount; c++) {  
       if ( c > 1 ) {  
            System.out.print("\t");  
  }  
       else {  
            System.out.print("\n");  
  }  
     Object o = rs.getObject(c);  
     System.out.print(o.toString());  
  }  
  }  
   //關閉連接配接  
   if (con!=null) {  
        con.close();  
   }  
}public  void runSPL() throws ClassNotFoundException, SQLException{  
    Connection con = null;  
    PreparedStatement st;  
    ResultSet set ;  
    //建立連接配接      Class.forName("com.esproc.jdbc.InternalDriver");  
//onlyServer用于控制目前jdbc是否對伺服器進行遠端計算,為true表示遠端計算;false時表示本地計算  //注意:屬性值為false,當SPL語句使用call dfx或dfx時,會先使用本地計算,如未計算成功則會進行遠端計算      con= DriverManager.getConnection("jdbc:esproc:local://?onlyServer=true");  
    //直接執行SPL語句,傳回結果集      st = (PreparedStatement)con.createStatement();  
    ResultSet rs = st.executeQuery("$select * from employee.txt");  
     
    //簡單處理結果集,将結果集中的字段名與資料輸出       ResultSetMetaData rsmd = rs.getMetaData();  
    int colCount = rsmd.getColumnCount();  
    for ( int  c = 1; c <= colCount;c++) {  
    String title = rsmd.getColumnName(c);  
    if( c > 1 ) {  
        System.out.print("\t");  
    }  
    else {  
        System.out.print("\n");  
    }  
        System.out.print(title);  
  }  
    while (rs.next()) {  
     for(int c = 1; c<= colCount; c++) {  
       if ( c > 1 ) {  
            System.out.print("\t");  
  }  
       else {  
            System.out.print("\n");  
  }  
     Object o = rs.getObject(c);  
     System.out.print(o.toString());  
  }  
  }  
   //關閉連接配接     if (con!=null) {  
        con.close();  
   }  
}      

執行結果:

Java 如何遠端調用 SPL 腳本

總結

通過上面的使用,相信您已經了解遠端通路伺服器的部署核心了吧,沒錯!Java 程式中調用伺服器上的運算與調用本地的 SPL 運算操作步驟其實大體相同,總結下主要有如下三點差別:

1,部署伺服器

2,JDBC 的 raqsoftConfig.xml 中添加伺服器位址

繼續閱讀