從2.1.1版本開始,在URule Pro中提供了Spring Bean及Java類的熱部署功能。利用該功能,打開URule Pro控制臺即可將需要熱部署的Spring Bean及相關Java類文件實時部署到正在運行的服務器中。 對于采用客戶端服務器模式運行的URule Pro應用,只需要在服務端部署好需要的Spring Bean及相關Java類文件,客戶端會自動獲取這些已部署的Spring Bean及相關Java類文件信息,并對其進行執(zhí)加載。
有了這個功能,URule Pro中無論是用戶自定義的動作庫還是內置動作庫相關的Spring Bean及Java類,都可以在服務器運行情況下,實時動態(tài)部署。
打開URule Pro控制臺,點擊左側項目列表上方按鈕,即可打開動態(tài)部署Jar文件的配置頁面,如下圖所示:
在上面的部署頁面中,可以點擊“添加”按鈕添加一個新的部署項,接下來點擊具體部署項“操作”列中的“編輯”按鈕,即可在彈出的窗口中添加這個部署項中涉及到的Jar文件信息,如下圖所示:
在這個彈出的窗口中,可以把所有相關的Jar文件通過窗口里選擇文件按鈕上傳到知識庫中,完成之后點擊頁面工具欄上“部署”,即可將所有部署項中上傳的Jar文件動態(tài)部署到當前項目中;如果當前項目被當前URule Server使用,同時又在各個項目里配置了URule的客戶端地址, 那么在Server上部署完成后,系統(tǒng)會提示我們要不要將這些動態(tài)的Jar文件推送到URule客戶端,如果選擇是,那么這些客戶端立即接收到這些Jar文件并動態(tài)加載,如下圖所示:
在URule Server的規(guī)則項目里配置客戶端地址,可以參見客戶端服務器配置介紹,這里不再贅述。
從部署方式上了解到,我們只需要將需要熱部署的Jar包上傳到系統(tǒng)即可,如果其中要加載Spring Bean,那么還需要定義好Spring的xml配置文件放在Jar包中一并上傳,下面來舉例說明Spring配置文件及Jar文件打包方式。
假如我們需要部署下面這個Java類文件,內容如下:
package test;
/**
* @author Jacky.gao
* @since 2019年1月11日
*/
public class BusinessTest {
public String hello(String name) {
System.out.println(new OtherBusiness().getENV());
return "Hello, "+name;
}
}
從上面的代碼中可以看出,這里的hello方法引用了OtherBusiness類中的getENV方法,OtherBusiness類源碼如下:
package test;
/**
* @author Jacky.gao
* @since 2019年1月11日
*/
public class OtherBusiness {
public String getENV() {
return "環(huán)境 is OK...";
}
}
可以看到getENV方法非常簡單,只是返回一個字符串而已,對于BusinessTest類,我們希望它成為一個標準的Spring Bean,所以還要添加一個Spring的xml配置文件,內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
">
<bean id="dybean" class="test.BusinessTest"></bean>
</beans>
在上面這段xml配置中,test.BusinessTest類被配置成為一個標準的Spring Bean,Bean的ID為dybean。到這里Java類的編寫及Spring Bean的xml配置工作就完成了,接下來就需要將它們打包Jar并上傳到URule中實際熱部署。
為了演示Java類引用多個不同Jar包中其它類庫的情形,這里我們把BusinessTest類和OtherBusiness類打成兩個Jar文件,分別是main.jar和slave.jar,至于Spring Bean的xml配置文件放在兩個Jar文件中任何一個中都可以,只是xml的名稱必須是urule-spring-context.xml, 且這個名為urule-spring-context.xml的Spring配置文件必須放在Jar文件的根下,這里我們把這個urule-spring-context.xml文件打包在main.jar文件當中。
打包好的main.jar文件結構如下圖所示:
打包好的slave.jar文件結構如下圖所示:
上面的兩個Jar文件中,BusinessTest類和OtherBusiness類都位于test這個package下,所以截圖中只看到test這個package。
對于URule Pro來說,每個Jar文件中都可以包含一個名為urule-spring-context.xml的Spring的xml配置文件,如果包含每個文件中的Spring配置文件都會被解析并加載;
當然也可以都不包含,這樣熱部署時引擎只會加載Jar包中的類。
當我們點擊“態(tài)部署Jar文件的配置頁面”上的部署按鈕時,系統(tǒng)會嘗試取到知識庫里所有已上傳的Jar文件,然后通過System.getProperty("java.io.tmpdir")取到當前JVM應用的臨時目錄,同時在其下創(chuàng)建名為urule-jars的目錄, 最后取當前系統(tǒng)日期作為Jar文件的最終存儲目錄。
每次點擊“部署”按鈕時,系統(tǒng)都會嘗試刪除原來的由系統(tǒng)日期生成的子目錄,再根據(jù)當前日期重新創(chuàng)建子目錄,再把所有的Jar文件放在這個目錄下。
在臨時目錄中生成好所有的已上傳的Jar文件后,接下來系統(tǒng)會嘗試加載這個目錄下的所有Jar文件,如果這些Jar文件根下包含名為urule-spring-context.xml的Spring配置文件,系統(tǒng)也會將這個文件加載到Spring上下文中。 在實際使用時,如果運行URule Pro的應用采用集群部署,并且集群實例運行在同一個JDK下,這樣多個實例運行時通過System.getProperty("java.io.tmpdir")取到當前JVM應用采用的臨時目錄可能是同一個目錄,不同的實例操作同一個目錄可能會存在問題, 為解決這種因集群而導致的問題,URule Pro允許為每個實例設置一個名為urule.instance.id的JVM參數(shù),要保證每個實例下該參數(shù)值不同, URule Pro在啟動時就會嘗試采用這個JVM參數(shù)值作為通過System.getProperty("java.io.tmpdir")取到當前臨時目錄下的子目錄名稱,這樣每個實例只會在這個子目錄下進行創(chuàng)建存儲Jar文件的目錄,通過這種方式就可以避免在一臺物理機器上搭建多集群實例 而產(chǎn)生的問題。
實際使用中,如果我們不想讓引擎通過System.getProperty("java.io.tmpdir")這種方式,取到的臨時目錄來作為動態(tài)Jar文件的存儲父目錄,那么可以在Spring的Properties文件中添加一個名為urule.dynamicJarsPath的屬性來手工指定一個用于存儲動態(tài)Jar文件的 父目錄,需要注意的是通過urule.dynamicJarsPath屬性指定的目錄一定要存在,否則啟動時會產(chǎn)生錯誤。
對于采用客戶端服務器模式運行的應用來說,如果客戶端是一個Java Web應用,那么只需要按照客戶端服務器配置中介紹的在客戶端中配置好接收服務端推送過來的知識庫的Servlet即可,這樣服務端動態(tài)Jar部署時會提示 是否推送到客戶端,如果選是,那么這些動態(tài)Jar文件會直接推送到目標客戶端,客戶端收到后也會按照上述方式加載這些Jar文件及其中可能存在的名為urule-spring-context.xml的Spring配置文件。
和知識包的客戶端一樣,客戶端也可以主動檢查服務端是否存在動態(tài)Jar文件,檢查方式也是在客戶端上配置“urule.resporityServerUrl”屬性值,所以從2.1.1版本開始,客戶端中配置好“urule.resporityServerUrl”屬性值后,客戶端應用除了會利用這個URL到服務端下載規(guī)則包, 還會在啟動時利用這個URL檢查服務端是否存在動態(tài)加載的Jar文件,如果有則下載到客戶端并加載;這時服務端的“urule/dynamic/checkLatestJarsDir”和“urule/dynamic/loadDynamicJars”這兩個URL要保證匿名可訪問,否則客戶端啟動時會產(chǎn)生錯誤。
如果客戶端是一個標準的Java應用,而非一個Java Web應用,對于這種類型的應用來說,為了可以取到服務端生成的動態(tài)Jar文件,我們可以在客戶端Spring的Properties文件中添加一個名為urule.dynamicJarsRemoteLoadInterval的屬性 來決定客戶端每隔多久利用客戶端上配置的urule.resporityServerUrl屬性值到服務端檢查有沒有新的動態(tài)Jar產(chǎn)生,如果有則從服務端取回并加載。
urule.dynamicJarsRemoteLoadInterval的屬性值單位為分鐘,如果我們設置其值為5,那就表示每隔5分鐘到服務端檢查是否生成新的動態(tài)Jar文件,如果不設置則表示客戶端不會定期檢查服務端是否有新的動態(tài)Jar包產(chǎn)生。
更多建議: