본문 바로가기
IBM - old/WAS 문제&해결

JMS client 운영중에 정상작동하다 갑자기 java.net.BindException 발생

by freeman98 2016. 5. 6.
1. WAS 버전 : WebSphere ND v6.1.0.21

2. OS : AIX v5.3 9L

3. Error 발생 시점 :  default JMS queue 를 사용하면서 JMS client 를 작성하여 JMS 에 connect 하여 queue 를받아오다가
                            (대량의 message 를 JMS client 가 받아오는 경우일 가능성이 높음)

4. Error message :

   Caused by: javax.jms.JMSException: CWSIA0241E: An exception was received
   during the call to the method
   JmsManagedConnectionFactoryImpl.createConnection:com.ibm.websphere.sib.e
   xception.SIResourceException:
   CWSIC1001E: A client attempted to connect with a remote messaging engine

   ibm.ws.sib.jfapchannel.JFapConnectFailedException: CWSIJ0063E:

   Caused by: java.net.BindException: the Socket name is already using
   at sun.nio.ch.Net.connect(Native Method)
   at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:491)
   at com.ibm.ws.tcp.channel.impl.SocketIOChannel$StartPrivilegedThread.run
   (SocketIOChannel.java:123)
   at java.security.AccessController.doPrivileged
   (AccessController.java:197)
   at com.ibm.ws.tcp.channel.impl.SocketIOChannel.connect
   (SocketIOChannel.java:143)
   at com.ibm.ws.tcp.channel.impl.ConnectionManager.getConnection
   (ConnectionManager.java:142)
   at com.ibm.ws.tcp.channel.impl.TCPConnLink.connectCommon
   (TCPConnLink.java:240)
   at com.ibm.ws.tcp.channel.impl.TCPConnLink.connectAsynch
   (TCPConnLink.java:219)
   at com.ibm.wsspi.channel.base.OutboundProtocolLink.connectAsynch
   (OutboundProtocolLink.java:103)
   at com.ibm.ws.sib.jfapchannel.impl.JFapOutboundConnLink.connectAsynch
   (JFapOutboundConnLink.java:197)
   at
   com.ibm.ws.channel.framework.impl.OutboundVirtualConnectionImpl.connectA
   synch(OutboundVirtualConnectionImpl.java:71)
   at com.ibm.ws.sib.jfapchannel.impl.octracker.ConnectionDataGroup.connect
   (ConnectionDataGroup.java:461)
   ... 16 more


5. 예상 이유 : JMS client 가 JMS 서버에 접속하여 queue 를 받아오기 위하여 connection 을 맺는데 대용량 message 처리의
               경우 배정된 port 를 넘어서 connection 을 맺을 경우 발생할 수 있다.
               다시 말하면, AIX 에서 port 를 배정할 때 순간적으로 사용되는 것을 위해 ephemeral port 를 배정합니다.
               이 port 는 range 가 정해지는데 highest ephemeral port 가 사용되면 자동으로 lowest ephemeral port 로
               connect 가 이루어집니다. SO_REUSEADDR 옵션이 사용되지 않으면 AIX 는 자동으로 사용되지 않는
               ephemeral port 를 찾아서 client socket 으로 할당하지만 SO_REUSEADDR 옵션이 사용되면 그냥  
               lowest ephemeral port 를 찾아서 할당하려고 시도하며 이때 이미 lowest ephemeral port 가
               server ip/port 와 client ip/port 의 쌍으로 존재하면 사용되지 않은 ephemeral port 가 있더라도 찾지 않고
               connect 에 fail 이 발생합니다.
               그런데 WAS 의 경우는 SO_REUSEADDR 옵션이 적용되어 있습니다.

6. 조치 방안 : WAS 콘솔 > 서버 > Application Server > {server name} > 통신: 포트 > SIB_ENDPOINT_ADDRESS 의 연관된 전송 보기 > InboundBasicMessaging > TCP 인바운드 채널 (SIB_TCP_JFAP) > 사용자 정의 특성 > 새로작성
을 선택한 후, 아래 설정을 추가한 후 WAS를 재시작하면 됨.
이름: soReuseAddr
값: 0


댓글