5장. MX4J 예제

차례

Services
RelationService
MBeans
RMI MBean
Tools
XDoclet: 인터페이스와 description 소스 생성 자동화
FilePersister 사용하기

Services

RelationService

Bronwen Cassidy

(번역)전 준식(locus@nextel.co.kr)

고친 과정
고침 $Revision: 1.1 $$Date: 2002/04/10 14:11:51 $

소개

RelationService의 전체 설명, 이것이 하는 일과 왜 이렇케 하는지는 JMX 스펙에서 찾아볼 수 있다.

예제 Java 소스 파일들은 examples 디렉토리의 services/relation 아래에서 찾을 수 있다.

  • RelationServiceExample (the main class)
  • SimpleBooks
  • SimpleOwner
  • SimplePersonalLibrary (which extends the javax.mangement.relation.RelationTypeSupport and provides the definitions of our roles)

Simple use-case for the example / 예제에 대한 간단한 use-case

  • 1)책 추가하기 Use-Case: Main 시나리오
사용자는 개인 도서관에 1개의 책을 추가한다. 이미 3권을 가졌다. 체크는 완료되었고, 그가 4권의 책을 가졌다. 그가 책을 추가하는데 아무 문제가 없다.
  • 2)책 추가하기 Use-Case: Alternate 시나리오:
사용자는 다른 책을 추가하기로 했다, 그는 책의 수를 최소 1개에서 4개의 책을 가진다고 정의했다. 5번째 책을 추가하려 할 때, 그는 더이상의 책을 추가할 수 없다...
  • 3)책 제거하기 Use-Case: Main 시나리오
사용자는 개인서가에서 3권의 책을 제거하려한다.책의 수자를 1에서 4개를 허용한다고 정의했기 때문에 , 책은 제거되고 RelationService로 부터 더이상 읽거나 쓸수 없다...
  • 4)책 제거하기 Use-Case: Alternate 시나리오:
책 소유자는 그의 모든 책을 제거하기로 결정했다. relation은 소유자 역할을 포함해 무효화되고 더 이상 레코드에 접속할 수 없다.

사용법 코드

어떤 관계들이 설정되기 전에 RelationService가 MBeanServer에 등록되어야 한다.

예 5.1. RelationService 만들기

import javax.management.relation.RelationService;

MBeanServer server = MBeanServerFactory.createMBeanServer();
String className = "javax.management.relation.RelationService";
ObjectName objectName = new ObjectName("Relations:name=RelationService");

// The boolean value is to enable a purge of relations to determine invalid relations when an unregistration occurs of MBeans
Object[] params = {new Boolean(true)};
String[] signature = {"boolean"};
server.createMBean(className, objectName, null, params, signature);

등록된 RelationService를 갖게 되면, 우리의 use-case 시나리오에서 역할을 실행하게될 MBean들을 서버에서 생성하게 된다. 이는 우리의 RelationType인 반드시 javax.management.relation.RelationTypeSupport를 상속한 SimplePersonalLibrary 를 추가하여 가능하다. 이 클래스는 MBeanServer에 등록될 수 없다. 이것은 단지 RelationService에서 우리의 역할을 정의하는 것 뿐이다. RelationService에 RelationType을 추가하는 예제는 다음과 같다 :

예 5.2. RelationType 추가하기

// SimplePersonalLibrary is our RelationTypeSupport class
String relationTypeName = "my_library";
SimplePersonalLibrary library = new SimplePersonalLibrary(relationTypeName);

Object[] params = {library};
String[] signature = {"javax.management.relation.RelationType"};

server.invoke(objectName, "addRelationType", params, signature);

다음 단계는 지원 클래스에서 정의한 역할을 채우는 것과 SimplePersonalLibrary 클래스에서 정의한 최대 수자를 MBean에 추가하는 데에서 시작하게 될 것이다. MBeanServer에 MBean을 등록하는 것이 먼저라는 것을 뜻한다. 일단 등록되면, 우리 역할을 추가할 수 있다.

예 5.3. 역할 만들기

// building the owner Role
ArrayList ownerList = new ArrayList();
ownerList.add(ownerName1);  // can only add owner to an owner role cardinality defined as 1
Role ownerRole = new Role("owner", ownerList);

// building the book role
ArrayList bookList = new ArrayList();
// we can have between 1 and 4 books more than 4 invalidates out relation and less than 1 invalidates it
bookList.add(bookName1);
bookList.add(bookName2);
bookList.add(bookName3);
Role bookRole = new Role("books", bookList);

// add our roles to the RoleList
RoleList libraryList = new RoleList();
libraryList.add(ownerRole);
libraryList.add(bookRole);

// now create the relation
Object[] params = {personalLibraryId, libraryTypeName, libraryList};
String[] signature = {"java.lang.String", "java.lang.String", "javax.management.relation.RoleList"};
m_server.invoke(m_relationObjectName, "createRelation", params, signature);

alternate 시나리오에 대해 보자 : 기본 역할이 관계를 무효화하게 되면 RelationService에서 제거되며, 비록 MBeanServer에 등록된 MBean을 통해서 개별적으로 접근할 수 있지만, RelationService를 통해 더이상 접근할 수 없게 된다.

JMX Reference Implementation의 예제를 사용하기

SUN의 JMX 웹사이트에서 다운로드 받을 수 있는 RelationService 에제는 MX4J 구현에서도 실행할 수 있다. MX4J는 MBean의 접근자들에 대한 구현을 server.getAttribute(..)server.setAttribute(...) 를 사용했지만, JMX 구현은 모두 server.invoke(..)를 사용하여 메소드 호출을 했기 때문에 몇가지 변경이 필요하다.

JMX에서 다운받은 예제를 사용기위헤서는 RelationAgent에 대해 다음과 같은 변경이 필요하다 :

  • Remove: import com.sun.jdmk.Trace;
  • Remove: Trace.parseTraceProperties();
  • 다음 호출을 모두 변경한다.
    • getAllRelationTypeNames
    • getRelationServiceName
    • getRelationId
    • getAllRelationIds
    • getReferencedMBeans Note: except where the call comes from an external relation(represented by a subclass of javax.management.relation.RelationSupport or a type of javax.management.relation.Relation
    • getRelationTypeName Note: same as above
    • getAllRoles Note: same as above
    • setRole Note: same as above
    from server.invoke(...) to server.getAttribute(....) , server.setAttribute(...) depending on whether it sets or gets.