2012-06-12 2 views
1

배포시 별도의 JVM에서 스레드를 시작하는 Tomcat (6.0.35)에 배포하는 Spring MVC 웹 응용 프로그램 (WAR)이 있습니다 (이유는 묻지 않음 - 은 내 디자인이) 그런 다음 RMI를 통해 포트 8888을 통해 해당 스레드와 통신합니다.스프링/RMI 서버 오류

어쨌든 완전히 까다로워졌지만 지금까지는 스레드가 시작될 때 실패하고 있으며 믹스에 로깅을 추가하려고했지만, 우리는 벽을 치고있다. 이것은 우리가 로그에 찾을 수있는 유일한 예외입니다 :

Jun 12, 2012 3:11:36 AM com.ourapp.ImageController destroy 
SEVERE: Shutdown Error: Lookup of RMI stub failed; nested exception is  java.rmi.ConnectException: Connection refused to host: localhost; nested exception is: 
    java.net.ConnectException: Connection refused 
Jun 12, 2012 3:11:37 AM org.apache.catalina.core.StandardContext listenerStop 
SEVERE: Exception sending context destroyed event to listener instance of class org.springframework.web.context.ContextLoaderListener 
java.lang.NoClassDefFoundError: org/springframework/web/context/ContextCleanupListener 
    at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:80) 
    at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:3973) 
    at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4577) 
    at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1165) 
    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1271) 
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:296) 
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) 
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1337) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1601) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1590) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: java.lang.ClassNotFoundException: org.springframework.web.context.ContextCleanupListener 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233) 
    ... 12 more 

ImageController이 데몬을 발로을 담당하는 스프링 MVC Controller입니다/RMI 스레드를 산란. 이 오류의 verbage를 기반으로 아무도 을 가지고 있습니까? 아이디어가 "연결이 거부되었습니다"오류의 원인 일 수 있습니까?

netstat -an | grep 8888 (이것은 Linux 머신입니다)을 실행하면 출력이 나오지 않으므로 해당 포트에서 수신 대기 중입니다. 수정 제안으로 이끄는 아이디어 나 제안에 미리 감사드립니다.

편집 : 여기 우리가보고있는 또 다른 ConnectionException입니다 :

Caused by: 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.<init>(Socket.java:375) 
    at java.net.Socket.<init>(Socket.java:189) 
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22) 
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128) 
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595) 
    ... 74 more 
+0

연결하려는 포트/소켓이 차단되거나 닫히지 않았습니까? –

+1

이 로그는 기본적으로 RMI를 통해 연결할 수 없다는 불만이있는 webapp JVM에서 나온 것 같습니다. 다른 서비스의 로그를 조사 할 필요가 있으며 8888에서 수신을 시작하지 않은 이유는 무엇입니까? – maksimov

+0

@indyaah - Linux에 익숙하지 않습니다. 포트 8888이 차단/종료되었는지 알려면 어떤 명령을 사용해야합니까? – IAmYourFaja

답변

2

나는이 대답에 내 의견을 이동할 수 있습니다 .

로그에있는 모든 내용은 포트 8888에 연결되어있는 다른 컴퓨터에 문제가 있음을 나타냅니다. netstat 결과는 포트에서 수신 대기중인 프로세스가 없음을 나타냅니다. 따라서 로그에 연결 오류가 발생합니다.

다음 단계는 다른 컴퓨터 (또는 다른 JVM)의 응용 프로그램이 전혀 실행되지 않는지 확인하는 것입니다 (예 : ps ax|grep java). 그리고 만약 그렇다면 로그에서 RMI 서비스를 시작하지 못한 이유에 대한 단서를 확인하거나 그렇지 않으면 RMI 서비스를 시작하십시오.

일반적으로 응용 프로그램이 소켓을 열 수 없으면 다른 응용 프로그램이 이미 포트를 사용하고 있기 때문입니다. 그것은 당신의 상황에 해당하지 않습니다. 동일한 응용 프로그램의 두 인스턴스가 시작된 경우 일 수 있습니다. 첫 번째 응용 프로그램은 8888 포트를 사용하고 두 번째 응용 프로그램은 8888을 사용할 수 없으며 실패하고 첫 번째 응용 프로그램이 종료되었습니다. 결국 당신은 아무도 항구에서 듣지 못하게됩니다.

+0

Tomcat 웹 응용 프로그램과이 다른 스레드가 동일한 서버 시스템에 있으며 둘 모두가 동일한 로그 파일에 출력됩니다. – IAmYourFaja

+0

시스템 수준에서 포트를 차단하거나 닫는 것이 있다면 배제 할 필요가 있습니다. 그 이유를 설명해주십시오! 그러나 그것은 어제 코드 변경 사항이 전파되지 않는 것을 보는 것이 당연한 것입니다 ... – IAmYourFaja

+0

이제 편집이 의미가 있습니다! 우리의 빌드 스크립트는 이상한 일들을 수행하고 Tomcat을 빌드 단계 중 하나로서 다시 시작합니다 (WAR를 핫 전개하는 대신). 실패한 응용 프로그램이 "사용"(호깅)하는 경우 포트를 해제 할 수 있습니까? – IAmYourFaja

0

는 사람이 오류를 "거부 연결"이 원인이 될 수있는 어떤 생각을 가지고 있습니까?

그것은 스택 추적에 바로 거기에있다 :. 그것에서 오는 JAR 파일, 즉

java.lang.NoClassDefFoundError: org/springframework/web/context/ContextCleanupListener 

당신의 배포가 그 클래스가 누락

+0

이것이 맞는지 확실하지 않습니다. 기본적으로'ContextLoaderListener'와'ContextCleanupListener'는 같은 JAR의 같은 패키지에 있어야합니다 - 'spring-web-x.x.x.x.jar',이 오류는 이상하지만 의심 할 여지없이이 문제의 원인입니다. – maksimov

+0

나는 maksimov에 동의한다 - 어제부터 아무것도 (* 배치 없음, 빌드 없음, 아무것도) 변경되지 않았으므로 classpath가 변경되지 않았다. 방금 작업이 중단되었습니다. – IAmYourFaja

+0

@ maksimov 그렇지 않은 경우 왜 예외가 발생합니까? 왜 스택 추적 *에 '연결 거부'예외가 나타 납니까? – EJP