Spring基於JMS實現遠程訪問

使用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)來獲取消息(遠程服務),如果無法識別消息隊列是無法實現服務的遠程訪問的。

客戶端實現遠程訪問,示例代碼如下所示:

 

發佈了73 篇原創文章 · 獲贊 19 · 訪問量 110萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章