随时记录遇到的问题,后续就不会 无数次的遇见同一个问题,都想不起来是怎么回事了~!坚持。
linux下启动tomcat或者关闭tomcat时,都会报错,
如下:
Catalina.stop: java.net.ConnectException: Connection
refused
java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at
java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
at
java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:529)
at java.net.Socket.connect(Socket.java:478)
at java.net.Socket.(Socket.java:375)
at java.net.Socket.(Socket.java:189)
at
org.apache.catalina.startup.Catalina.stopServer(Catalina.java:410)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native
Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:336)
at
org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:427)
原因:
dubbo暴露服务端口已经被占用,会报端口被占用
因为tomcat先占用了dubbo服务暴露需要的20880端口,
那么重新启动或者关闭时,也需要这个端口去暴露服务,这时候就端口自然报被占用了
解决方法一:命令:
netstat -lntup 查看一下PID
直接干掉kill -9
17542 然后重启,OK。
解决方法二:
在启动服务时,动态分配 暴露端口
1. 数据库端表存储几个可用端口
2. 程序获取本机IP 根据IP
查出可用端口
3. 服务启动时动态获取IP 配置如下
"dynamicDubboPortReaderDao"
class="com.test.dubbo.config.dubbo.DynamicDubboPortReaderImpl"
init-method="init" />
public class DynamicDubboPortReaderImpl
implements
DynamicDubboPortReader,ApplicationContextAware{
private ConfigurableApplicationContext applicationContext
= null;
private static final String
PROTOCOL_NAME="dubbo";
private static int
RPOTOCOL_PORT=20880;
@Autowired
private IComputePortService
computePortService;//获取端口服务
public void init(){
RPOTOCOL_PORT = computePortService.getAddressPort();
updateProtocolMessage(PROTOCOL_NAME,RPOTOCOL_PORT);
}
@Override
public void
setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext =
(ConfigurableApplicationContext)applicationContext;
}
@Override
public void updateProtocolMessage(String
protocolConfig,int port) {
//判断初始化
if(!applicationContext.containsBean(protocolConfig)){
System.out.println("没有【"+protocolConfig+"】协议");
}
//获取协议
ProtocolConfig protocolConfigSource=(ProtocolConfig)
applicationContext.getBean(protocolConfig);
//修改协议暴露端口信息
protocolConfigSource.setPort(port);
}
}