고친 과정 | |
---|---|
고침 $Revision: 1.2 $ | $Date: 2002/06/07 14:09:56 $ |
이 예제를 통해서 MBean으로 RMI 원격 객체로 노출하는 방법에 대한 가이드라인을 제공하고자 한다.
이 방법은 서버 관리자가 JMX 측면에서 RMI 원격 객체들을 관리할수 있도록 한다. 원격 객체로 구현된 서비스를 시작하고 종료, 재시작 하는 것이 가능하다는 것을 위미한다. 그리고, 서버가 동작중인지를 체크하거나, 설정파일을 다시 읽도록 요청하는 것도 가능하다.
자바 소스 파일의 예제는 examples 디렉토리 아래 mbeans/rmi에서 찾을 수 있고, 다음과 같은 것이 포함되어 있다:
원격 객체는 MBean이면서 동시에 RMI 원격 객체이다.
클라이언트는 두가지 인터페이스를 통해서 볼 수 있다 : 서비스의 사용자는 remote interface(MyRemoteService)를 통해서 볼 수 있고, 반면 HTTP 어댑터와 같은 관리 어플리케이션은 management interface (MyRemoteServiceObjectMBean)를 통해서 서비스를 볼 수 있다. 원격 인터페이스는 단 하나의 메소드만 포함한다 :
public void sayHello(String name)
이것이 클라이언트의 요청을 실행하게 될 것이다. 관리용 인터페이스는 반대로 3개의 메소드를 포함한다 :
public void start()
public void stop()
public boolean isRunning()
이는 HTTP 어댑터와 같은 관리 어플리케이션에서 사용될 것이다.
원격 인터페이스의 사용자가 관리 인터페이스의 메소드를 호출할 수 없고, 관리 어플리케이션이 원격 인터페이스의 메소드를 호출할 수 없다는 점에 유의하여야 한다.
Server클래스의 목적은 MBeanServer를 초기화하여 JMX 에이전트를 시작하는 것과 노출하고자 하는 서비스를 등록하고 시작하는 것 뿐이다.
예 5.4. Server 클래스
public class Server { public static void main(String[] args) throws Exception { MBeanServer server = MBeanServerFactory.createMBeanServer(); ObjectName name = new ObjectName("examples:type=remote"); MyRemoteServiceObject remote = new MyRemoteServiceObject(); server.registerMBean(remote, name); MyRemoteServiceObjectMBean managed = (MyRemoteServiceObjectMBean)StandardMBeanProxy.create(MyRemoteServiceObjectMBean.class, server, name); managed.start(); } }
MyRemoteServiceObject클래스의 인스턴스인 원격 객체는 더 자세하여야 한다. java.rmi.server.UnicastRemoteObject클래스가 아니라 java.rmi.server.RemoteServer 클래스를 상속한다는 것에 유의해야 한다. 관리 인터페이스인 start()와 stop()메소드를 통해서 export와 unexport제어를 하기 원하기 때문에, 객체가 생성될 때 자동적으로 RMI 런타임에 노출됨을 피하기 위해서 이다. start()는 RMI 런타임에 객체를 export하고 이 객체를 naming에 바인드하고, stop()은 naming에서 unbind하고 RMI 런타임에서 unexport 한다.
예 5.5. The MyRemoteServiceObject class / MyRemoteServiceObject클래스
public class MyRemoteServiceObject extends RemoteServer implements MyRemoteService, MyRemoteServiceObjectMBean { private boolean m_running; public MyRemoteServiceObject() throws RemoteException {} public void sayHello(String name) throws RemoteException { System.out.println("Hello, " + name); } public void start() throws Exception { if (!m_running) { UnicastRemoteObject.exportObject(this); InitialContext ctx = new InitialContext(); ctx.rebind(JNDI_NAME, this); m_running = true; System.out.println("My remote service started successfully"); } } public void stop() throws Exception { if (m_running) { InitialContext ctx = new InitialContext(); ctx.unbind(JNDI_NAME); UnicastRemoteObject.unexportObject(this, false); m_running = false; System.out.println("My remote service stopped successfully"); } } public boolean isRunning() { return m_running; } }
이와 같이 관리 어플리케이션을 통해서 서비스를 시작할 수 있게 되며, 사용자에게 사용가능하게 된다 중지시키는 것도 가능하게 될 것이고, 설정 파일을 변경하는 것(간단한 예제에서는 아니지만, 알수 잇을 것이다) , 같은 JMX 에이전트에 의해서 시작된 다른 서비스들을 중지시키지 않고 재시작 할 수 있다.
sayHello(String name) 메소드의 구현은 직접적이며, 관리 어플리케이션에서 접근할 수 있는 isRunning()메서드는 서비스가 실행중인지 아닌지에 대해 알려준다.
예제를 실행하기 위해서는 3개의 콘솔이 필요하다 :
rmiregistry를 위해서 RMI stub인 MyRemoteServiceObject클래스를 클래스 패스에 잡아야 하며, 다음과 같이 입력하여 실행 시킬 수 있다 :
C:\MX4J\examples>rmiregistry [Enter]
서버에 대해서는 모든 클래스들이 컴파일 되어야 하며(Client클래스를 제외하고), mx4j-jmx.jar(JMX 구현), 적절한 jndi.properties파일(예제와 함께 기본설정된 파일이 있다)이 있어야 한다. 그런후에, 다음 명령으로 서버를 시작할 수 있다. 물론 현재 디렉토리에 위에 언급한 파일들이 있어야 한다.
C:\MX4J\examples>java -cp .;mx4j-jmx.jar examples.mbeans.rmi.Server
클라이언트에 대해선, Client 클래스, 원격 인터페이스와 RMI stub, 그리고 적절한 jndi.properties(예제에 포함되어 있음)이 필요하다. 다음 명령으로 클라이언트를 시작할 수 있다. 물론 현재 디렉토리에 위에서 언급한 파일들이 있어야 한다.
C:\MX4J\examples>java -cp . examples.mbeans.rmi.Client