Spring RMI 문제 주의

다음으로 전송:http://yangwencan2002.iteye.com/blog/284249 RMI 문제 1: rmi 서버 의 tomcat 를. / shutdown. sh 로 닫 은 다음. / startup. sh 로 시작 하면 클 라 이언 트 연결 은 항상 다음 과 같은 오류 가 발생 합 니 다. org. springframework. remoting. RemoteLookupFailure Exception: Lookup of RMI stub failed;nested exception is java.rmi.UnmarshalException: error unmarshalling return; nested exception is:       java. io. EOFException 분석: 문제 의 원인 은 Spring 이 서버 웹 앱 의 클 라 스 로 더 를 사용 하여 RMIRegistry 를 생 성 한 다 는 것 입 니 다. 그런 다음 서버 를 다시 시작 할 때 RMIRegistry 가 종료 되 지 않 습 니 다. 다시 시작 한 후 레 지 스 트 리 는 더 이상 존재 하지 않 는 오래된 Stubs 에 대한 참 조 를 유지 합 니 다. 두 가지 솔 루 션 이 있 습 니 다.   1) Start the rmiregistry in a seperate process without the classpath of the server app.    2) (better approach) Let spring start the RMIRegistry throu RmiRegistry Factory Bean, which shuts it down correctly. 해결: 서버 의 spring 설정 코드 를 다음 과 같이 합 니 다.
<bean id = "rmiService" class = "org.springframework.remoting.rmi.RmiServiceExporter" >
    <property name = "serviceName" value = "service1" />
    <property name = "service" ref = "servicebean" />
    <property name = "serviceInterface" value = "com.Iservice" />
    <property name = "registryPort" value = "1099" />
</bean >
다음으로 교체:
<bean id="registry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">
    <property name="port" value="1099"/>
</bean>
<bean id = "rmiService" class = "org.springframework.remoting.rmi.RmiServiceExporter" >
    <property name = "serviceName" value = "service1" />
    <property name = "service" ref = "servicebean" />
    <property name = "serviceInterface" value = "com.Iservice" />
    <property name="registry" ref="registry"/>
</bean >

RMI 문제 2:
RMI 서버 가 재 부팅 되면 항상 클 라 이언 트 연결 이 거부 되 는 문제 가 발생 합 니 다.
분석:
서버 재 부팅 은 클 라 이언 트 에 영향 을 줄 수 있 습 니 다. 이 는 클 라 이언 트 가 재 부팅 전의 서버 연결 관련 기록 을 저장 하고 있다 는 것 을 의미 합 니 다.연구 결과 에 따 르 면 클 라 이언 트 는 캐 시가 있 기 때문에 캐 시 를 새로 고치 면 문 제 를 해결 할 수 있다.
해결:
클 라 이언 트 연결 코드 에 코드 추가:
RmiProxyFactoryBean factory= new RmiProxyFactoryBean();
factory.setServiceInterface(IService. class );
factory.setServiceUrl(url);

//     rmi                        
factory.setLookupStubOnStartup(false);//            Server    
factory.setRefreshStubOnConnectFailure(true);//             

factory.afterPropertiesSet();
IService service=( IService)factory.getObject();

RMI 문제 3:
   Spring RMI 는 두 개의 포트 를 차지 합 니까?
분석:
Spring RMI 는 두 개의 포트 가 있 습 니 다. 하 나 는 등록 포트 (기본 값 1099) 이 고 다른 하 나 는 데이터 전송 포트 입 니 다. 지정 하지 않 으 면 데이터 전송 포트 는 무 작위 로 분 배 됩 니 다.
해결:
xml 설정 시 servicePort 설정
<bean id="registry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">
    <property name="port" value="1099"/>
</bean>
<bean id = "rmiService" class = "org.springframework.remoting.rmi.RmiServiceExporter" >
    <property name = "serviceName" value = "service1" />
    <property name = "service" ref = "servicebean" />
    <property name = "serviceInterface" value = "com.Iservice" />
    <property name="registry" ref="registry"/>
    <property name="servicePort" value="1199" />
</bean >

좋은 웹페이지 즐겨찾기