Java的世界屬於開源的世界,所謂開源的世界,只要你能想到的點子就一定有人實現了,沒有你就自己造一個啊。
最近遇到了一個項目需求,技術選型選擇了webservice
,需要對外提供webservice
接口。實現webserice
功能可以有多種做法的,比如servlet
+ tomcat
的方式,Java Main
方法+嵌入jetty server
的方式,本質上是XML/HTTP
的原理(誤?)。
項目組對外提供接口的功能已經選擇了HTTP/Netty
的方式,既然已經有HTTP
的支持了,那麼XML/HTTP On Netty
或許是個不錯的點子,這樣我們不用再引入tomcat
等服務應用了。
經過一番搜索,終於發現了netty-jax-ws這款組件,非常符合我們的需求,於是就採用了它完成了開發工作。
考慮到我們的對外接口需要進行分類,需要在原來的URL
路徑映射加上前綴。
這個開源組件原來的示例
mappings.put("/echoService", echoWebService);
key
表示URL
路徑,value
表示webservice
的具體實現。
此時我們給它加上前綴
mappings.put("/honey/echoService", echoWebService);
比如之前的訪問方式http://localhost:4040/echoService?wsdl
,這回我們的訪問路徑應該是http://localhost:4040/honey/echoService?wsdl
,
只不過這回意外的是服務給我們返回的是404
的結果,看來我們的路徑是不正確的,或者這個訪問路徑找不到實現的webservice
(類似MVC
框架中的Controller
)。
這個問題的原因很快就排查出來的,我覺得可能自己就能解決,於是乎就fork了項目試着改動起來,參見這個提交commit1,至此暫告一段落了。
這部分功能代碼就加入到了原來的項目中,只不過已經打包部署就發現,只要訪問webservice
功能http://localhost:4040/honey/echoService?wsdl
,
就會報錯:NoSuchMethodError
, 然後是xx.jboss.netty.xx.ChannelFactory
諸如此類的錯誤,我第一個感覺就是netty-jax-ws
和原來的項目使用的Netty
版本衝突了。
此時我請教我們組經驗豐富的同事,遇到這種情況要不要迎難而上呢,還是另闢蹊徑呢?(當然,當時肯定是口語化的表達)。
既然我前面已經改造過一回,不在乎再一次了,所以就有了這次commit2。
以上算是我真正意義地上參與了一次開源貢獻,我只是做了一點工作而已了。
-- EDIT --
這次修改是爲了支持通過代理的方式訪問webservice
,支持了HTTP Host
請求頭,修改參見commit3
文章屬個人觀點,與本人工作僱主無關!