bboss釋出apache cxf 2.7.6服務和定義用戶端服務執行個體放到一起可能會産生沖突并導緻服務釋出失敗,本文介紹這個沖突的解決辦法。
首先介紹一下沖突現象,假設在bboss mvc的xml配置檔案中定義一個控制器,并為這個控制器注入通過org.apache.cxf.jaxws.JaxWsProxyFactoryBean建立的一個服務用戶端執行個體:
<properties>
<property name="/salary/*.page" class="org.frameworkset.hrm.SalaryControler"
f:salaryService="attr:salaryServiceClient"/>
<property name="salaryServiceClient" factory-class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"
factory-method="create" f:serviceClass="org.frameworkset.web.ws.SalaryService"
f:address="http://localhost:8080/bboss-mvc/cxfservices/salaryServicePort"/>
</properties>
同時通過以下配置在bboss mvc中釋出一個cxf webservice服務:
<property name="rpc.webservice.RPCCall"
singlable="true"
ws:servicePort="RPCCallServicePort"
class="org.frameworkset.spi.remote.webservice.RPCCall"/>
由于bboss mvc在釋出webservice服務之前會先加載所有的mvc 控制器,這樣就會先通過org.apache.cxf.jaxws.JaxWsProxyFactoryBean建立salaryServiceClient用戶端執行個體,同時也會調用org.apache.cxf.BusFactory實作類建立cxf的服務總線org.apache.cxf.Bus的執行個體,cxf 2.7.6 jar包預設配置了Spring提供的BusFactory子類,bboss中并沒有引入Spring的BusFactory子類,肯定建立不起來,是以會導緻服務用戶端salaryServiceClient建立失敗,由于BusFactory隻會建立一次,是以即使後續bboss在釋出cxf服務強制指定了cxf預設提供的類org.apache.cxf.bus.CXFBusFactory,也無法将服務正确地釋出到cxf引擎中。
為了解決上述問題,隻需要修改cxf-2.7.6.jar包中META-INF\services目錄中的檔案
org.apache.cxf.bus.factory内容為:
org.apache.cxf.bus.CXFBusFactory

即可(org.apache.cxf.bus.CXFBusFactory是cxf預設提供的org.apache.cxf.BusFactory實作類)。同時,對bboss釋出cxfwebservice服務機制進行改進,在加載所有mvc控制器之前先釋出cxf webservice服務。這樣上述的沖突就得到徹底解決。
參考文檔:
bbossgroups webservice引擎使用方法