봄에 RMI를 사용하는 일부 서비스가 노출됩니다. 모든 서비스는 실제 처리 작업을 수행하는 다른 서비스 빈에 종속됩니다. 예를 들어 :RMI에 노출 된 서비스의 참조가 일시적이어야합니까?
<bean id="accountService" class="example.AccountServiceImpl">
<!-- any additional properties, maybe a DAO? -->
</bean>
<bean id="rmiAccount" class="example.AccountRmiServiceImpl"/>
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
<!-- does not necessarily have to be the same name as the bean to be exported -->
<property name="serviceName" value="AccountService"/>
<property name="service" ref="accountService"/>
<property name="serviceInterface" value="example.AccountService"/>
<!-- defaults to 1099 -->
<property name="registryPort" value="1199"/>
</bean>
내 AccountRmiServiceImpl은 다음과 같습니다
public class AccountRmiServiceImpl implements AccountRmiService {
private static final long serialVersionUID = -8839362521253363446L;
private AccountService accountService;
@Autowired
public void setAccountService(AccountService accountService) {
this.accountService = accountService;
}
}
내 질문은 : AccountServiceImpl
Serializable
마커 인터페이스를 구현하지 않고 생성 될 수 있을까? 그렇다면 AccountRmiServiceImpl
에있는 참조를 일시적으로 만들어야합니다. 즉, 직렬화되지 않고 RMI 호출이 수행되는 클라이언트로 전송됩니다. 가능한가?
답장 dtsazza 주셔서 감사합니다. AccountServiceImpl이 Serializable을 구현한다고 가정 해 보겠습니다. 같은 문제가 있지만 DAO 개체 참조가 다시 발생합니다. DAO 구현은 직렬화 가능하지 않으며 Spring이 이들을 종속으로 삽입하기 때문에이 인터페이스를 구현하게하는 것은 의미가 없다. –
클래스의 * 내용 * (즉, 필드)이 Serializable이 아니면 클래스는 Serializable이 아닙니다. "상향식"으로 행동 할 필요가 있습니다. 그리고 필드 중 하나를 Serializable으로 만들 수 없다면 수동으로 다시 구성 할 수 없다면 운이 없어집니다. 그러나 영구 상태의 일부가 아닌 경우 (예 : 캐시 또는 현재 스레드) 필드를 '일시적'으로 표시하는 것을 잊지 마십시오. –