2010-06-08 2 views
3

구체적으로 말해서 Spring http-remoting 예제를 사용하여 질문을 설명하겠습니다.다른 VM간에 객체 신원을 유지하는 방법

public SearchServiceImpl implements SearchService { 
    public SearchJdo processSearch(SearchJdo search) { 
     search.name = "a funky name"; 
     return search; 
    } 
} 

SearchJdo 자체가 간단한 POJO이다

우리는 간단한 인터페이스의 이러한 구현 있다고 가정합시다.

public class HTTPClient { 
    public static void main(final String[] arguments) { 
     final ApplicationContext context = new ClassPathXmlApplicationContext(
      "spring-http-client-config.xml"); 
     final SearchService searchService = 
      (SearchService) context.getBean("searchService"); 

     SearchJdo search = new SearchJdo(); 
     search.name = "myName"; 
     // this method actually returns the same object it gets as an argument 
     SearchJdo search2 = searchService.processSearch(search); 
     System.out.println(search == search2); // prints "false" 
    } 
} 

을 문제가 있다는 것입니다 : 우리가 HTTP-원격을 통해 클라이언트에서 메서드를 호출 할 때

이제 우리가 얻을 것이다 (많은 EJB와 같은 원격 객체를 호출하는 봄의 메커니즘은 직렬화를 사용하는) 논리적 장래성에서 동일하지만 검색 객체는 직렬화 때문에 서로 다릅니다.

VM간에 개체 ID를 지원하거나 에뮬레이트 할 수있는 몇 가지 기술이 있는지 여부는 문제입니다.

+1

필요한 것을 전달하고 무국적으로 전화하십시오. –

답변

1

VM간에 객체 동일성을 유지하려고 시도하는 IMHO는 잃어버린 제안입니다. 내 지식에 비추어 볼 때 언어 사양에는 VM을 지원할 필요가 없으므로 진정으로 이식성을 원한다면 어디에서 벗어날 수 있을지는 제한적입니다.

내가 왜 자신이 제공하는 고유 한 ID를 사용하지 않는지 묻습니다. Java GUID는 비싸지 만 직렬화 할 수 있습니다.

+0

GUID를 사용하여 제안한 접근 방식이 좋습니다. 그러나 실제 검색에서 jdo는 GUID를 통해 해결해야하는 다른 객체에 대한 참조를 가질 수 있습니다. 또한 새 참조가 검색 클래스에 추가 될 때마다 GUID 확인을 수행하는 코드를 그에 따라 변경해야합니다. 그런 것들을 자동으로 처리 할 솔루션을 찾고 싶습니다. – wheleph

+0

equals()를 사용하고 적절하게 정의하십시오. 정의에 의해 ==에 효과가있는 솔루션이 없거나 없습니다. – EJP

1

당신이 말했습니까? 객체 정체성은 논리적 평등과 다릅니다.

  • 객체 ID가 ==
  • 논리적 평등과 비교는 .equals(..)

는 그래서 equals() 방법을 무시하고 모두가 잘 될 것입니다과 비교됩니다. 같은 필드를 기준으로 hashCode()을 무시해야합니다. IDE를 사용하여이 두 가지 방법을 생성 할 수 있습니다.

(Teracotta VM clustering는 가상 머신 사이에 공유 오브젝트를 할 수 있습니다,하지만 귀하의 경우에는 적합하지 않습니다.)

0

한번 이런 짓을하지만, 나는 이것이 올바른 접근 방식의 경우 아주 확실하지 않다 :

모든가 사용자는 사용자 이름, 세션 ID, 역할 및 사용자 객체에 첨부 된 로그인 날짜를 가졌습니다. VM에 로그인 할 때마다 시스템은 User 객체를 메모리에로드합니다. 또한 사용자 객체를 응용 프로그램에 반환합니다.

응용 프로그램 서버 내에서 작업을 실행해야한다면 사용자 개체를 인수로 보냅니다. VM에 사용자가 동일한 세션 ID로로드 된 경우 VM에 저장된 객체를 사용하여 할당 된 역할을 알 수 있습니다. 그렇지 않으면 응용 프로그램이 사용자의 역할을 변경할 수 있고 보안되지 않습니다.

응용 프로그램이 응용 프로그램 서버를 변경해야하는 경우 사용자 개체를 새 서버로 보내고 새 서버는 해당 레코드 내에서 사용자를 찾을 수 없습니다.

여기에 비밀 정보가 있습니다 : 세션 ID는 모든 서버에서 공유되는 사용자 이름, 로그인 날짜 및 비밀 암호를 해싱하여 만들어집니다.

새 서버가 세션 ID가 일관된 것으로 확인되면 신뢰할 수있는 정보 소스로 데이터베이스의 역할을로드합니다.

죄송합니다. 이전에는이 ​​글을 쓸 수 없지만 누군가에게 도움이되기를 바랍니다.

관련 문제