使用JMS作爲底層通信協議,Spring提供了很好的支持。我們可以基於JMS將服務暴露給外部,這一切對於外部完全透明。這裏我們基於開源消息中間件ActiveMQ作爲中間代理,通過在服務端將服務以消息的形式發佈到代理服務器上,然後客戶端通過代理服務器實現對服務的遠程調用。
ActiveMQ的BrokerService可以非常容易地實現服務端與客戶端進行通信的中間代理,Spring配置broker.xml內容如下所示:
通過Spring的IOC容器來管理BrokerService。實現一個基於ActiveMQ的消息代理服務,如下所示:
啓動後,代理監聽61616,等待服務端發佈服務,以及遠程客戶端調用服務。
看一下,服務端如何進行實現。
定義服務接口和服務實現。服務接口,代碼如下所示:
實現上述接口,示例代碼如下所示:
然後,服務端的配置server.xml,內容如下所示:
通過Spring的org.springframework.jms.listener.SimpleMessageListenerContainer實現服務的發佈,可以配置的屬性有:
connectionFactory 連接工廠
destination 消息目的地,基於ActiveMQ則是一個消息隊列
concurrentConsumers 併發消息消費者數量
messageListener 消息監聽器
taskExecutor 線程池
通過上面配置可以看到,連接工廠指定了代理監聽服務的端口,我們通過服務端發佈服務,作爲消息生產者將服務以消息的形式發佈,然後客戶端作爲服務的消費者,通過代理來實現對遠程發佈服務的調用。
服務端啓動的實現,如下所示:
再看一下,客戶端如何進行遠程訪問。
對應的客戶端的配置client.xml,內容如下所示:
主要是基於Spring提供的org.springframework.jms.remoting.JmsInvokerProxyFactoryBean來實現,通過消息中間件代理,調用遠程發佈的服務。
需要注意的是,客戶端是通過消息隊列(org.apache.activemq.command.ActiveMQQueue)的名稱(如上述爲shirdrnQ)來獲取消息(遠程服務),如果無法識別消息隊列是無法實現服務的遠程訪問的。
客戶端實現遠程訪問,示例代碼如下所示: