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
文章屬個人觀點,與本人工作僱主無關!