因為在多模塊項目中引入了spring security,消費方(控制層)的工程有兩個包,一個controller,一個config。引入之前消費方工程的application.properties中spring.dubbo.scan=com.***.***.controller沒有問題,引入之后由於config包下面的一個文件也要調用提供方(服務層)的服務,所以改為spring.dubbo.scan=com.***.***,即config包和controller包的上級目錄。啟動項目時報錯java.net.BindException: Address already in use: bind,意思推測為端口占用。檢查消費方工程和提供方工程的application.properties,發現兩個都是spring.dubbo.protocol.port=20880。改掉其中一個,項目正常啟動,且config和controller兩個包都可以被dubbo掃描到。
這里就產生了一個問題,既然之前消費方工程和提供方工程設置的dubbo端口一樣,為什么之前不會報錯,修改掃描路徑之后就會報錯呢?
既然推測是修改掃描包路徑導致了端口占用問題(盡管直接這么說有些莫名其妙),就來比較一下修改前后的掃描包路徑:
消費方工程 提供方工程
修改前:com.***.***.controller com.***.***.service.impl
修改后:com.***.*** com.***.***.service.impl
區別在哪?
區別在於修改前的兩個路徑相互獨立,而修改后消費方工程的掃描路徑包含了提供方工程的掃描路徑,dubbo重復掃描了提供方工程,第二次發布至相同端口時就會報錯。
以上僅為一時之淺見,並不能保證百分百正確。
————強勢分割————
當天晚上的補充:
在按照上面的思路自以為解決了問題之后,雖然好幾次測試都成功了,但是后來卻出現了mybatis報invalid bound statement。由於修改之后的掃描路徑讓我感覺到違和,再加上走投無路之下的我將config包拖到controller包下面,將消費方工程的dubbo掃描路徑重新改為com.***.***.controller以避免和提供方的掃描路徑重復,問題再一次解決了(確信)。