2013-01-16 2 views
1

프로그래밍 방식의 원격 JMX 클라이언트로 실행 중이며 WebSphere Application Server의 MBean 서버에 연결합니다. 지금까지는 적절한 JMXServiceURL을 사용하여 연결하고 Bean의 알림을 구독 할 수 있습니다.JMX 원격 클라이언트에서 누락 된 로컬 클래스를 안전하게 처리하는 방법

그러나 - 빈 내 로컬 클래스 경로에 클래스를하지 포함하는 통지를 보내는 경우, 그것은 좋은 스택 추적과 불면 :

SEVERE: Failed to fetch notification, stopping thread. Error is: java.rmi.RemoteException: CORBA NO_IMPLEMENT 1330646337 No; nested exception is: 
    org.omg.CORBA.NO_IMPLEMENT: The sender's class RMI:com.mycompany.MyWeirdClass:143EC4C84209B825:EAD08F0965BC6044 is not present on the local classpath, and the class is not marked as truncatable, so it cannot be unmarshaled. vmcid: OMG minor code: 1 completed: No 
java.rmi.RemoteException: CORBA NO_IMPLEMENT 
... more frames ... 

궁극적으로 인해 발생 :

Caused by: java.lang.ClassNotFoundException: com.mycompany.MyWeirdClass 
    at com.ibm.rmi.util.RepositoryId.loadClass(RepositoryId.java:675) 
    at com.ibm.rmi.util.RepositoryId.checkClassCache(RepositoryId.java:644) 
    ... 

IBM의 코드 안에 깊이 파고 드는 것처럼 보입니다. 그리고 아무 것도 할 수없는 것 같습니다. 문제가있는 알림은 결코 내 NotificationListener에 도착하지 않습니다.

그래서; 내가 더 이상 알림을받지 못하게하지 않고도이 시나리오를 처리하려면 어떻게해야합니까?

명백한 진술하지만, 포괄적하려고 클라이언트 클래스 경로

에 클래스 라이브러리를 추가 : 나는 복잡한 순서 (내 생각)을 오름차순,이 문제를 해결하기 위해 4 가지의

답변

3

을 생각할 수 .

가 포맷 된 문자열로 com.mycompany.MyWeirdClass 예를 교체하기 위해 서버 생성 알림을 수정하십시오 알림을 수정합니다. 객체가 복잡한 경우 XML 또는 JSON 사용을 고려하십시오. 인스턴스를 마샬링하도록 알림 발신자를 수정할 수 있다면 가장 간단 할 것입니다. 그렇지 않다면 com.mycompany.MyWeirdClass 클래스 (정확히 Serializable이어야 함)를 수정하고 writeReplace 메서드를 추가하여 인스턴스의 String 표현을 반환 할 수 있습니다.

원격 클래스 로더

com.mycompany.MyWeirdClass 클래스를 포함하는 JAR을 반환는 WebSphere 응용 프로그램에서 HTTP 서버를 구현하고 모든 그것은 종속성을합니다. 기술적으로 HTTP 서버는 올바른 클래스를 제공하는 한 어디에서나 사용할 수 있습니다. JAR을 http://classloader.mycompany.com/Weird.jar에서 사용할 수 있다고 가정 해 보겠습니다. 이제이 같은 추가 시스템 속성을 사용하여 클라이언트를 시작합니다 : 동적 클래스 로딩 here을 제공하는 HTTP 서버 구현의 예는있다

java ..... -D-Djava.rmi.server.codebase=http://classloader.mycompany.com/Weird.jar ... 

.

이 작업을 수행하는 가장 일반적인 방법에서 JMX 오픈

로 클래스를 구현하는 클래스 MXBean을 만드는 것입니다, 또는 당신은 CompositeData을 구현하거나 CompositeDataSupport을 확장 할 수 있습니다. com.sun 클래스를 사용하면 신경 쓰이지 않아도 자바 런타임 (1.6+)에는 DefaultMXBeanMappingFactory이 포함되어있어 복합 데이터 인스턴스를 생성하므로이 유용한 유틸리티를 위의 솔루션 중 하나와 함께 사용할 수 있습니다. 예를 들어,이 같은 에 writeReplace 트랙을 구현 :

import com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory; 
import com.sun.jmx.mbeanserver.MXBeanMapping; 
final MXBeanMapping mapping = 
    DefaultMXBeanMappingFactory.DEFAULT.mappingForType(
     com.mycompany.MyWeirdClass.class, 
     DefaultMXBeanMappingFactory.DEFAULT 
    ); 
private Object writeReplace() throws ObjectStreamException { 
    try { 
     return mapping.toOpenValue(this); 
    } catch (Exception ex) { 
     throw new RuntimeException(ex); 
    } 
} 
+0

멋진 대답을, 그것을 할 시간을내어 주셔서 감사합니다! – Brabster

관련 문제