차례
고친 과정 | |
---|---|
고침 $Revision: 1.2 $ | $Date: 2002/09/27 09:34:40 $ |
http Adaptor는 MX4J 에이전트와 interface하는 기본적인 방법을 제공한다. HTTP 요청을 JMX 요청으로 변환하는 기능을 가지는 HTTP 1.0 서버를 포함하고 있다. 이는 스트링, 숫자, boolean이 아닌 데이터를 조작할 수 없다는 어려운 몇가지 제약을 가진다. HTTP 트래픽의 장점으로 방화벽과 일반적인 브라우저 클라이언트에서 가능하다는 장점을 가진다.
MX4J의 HttpAdaptor는 기본적으로 XML 데이터를 처리하도록 만들어졌다. 요청은 대개 http 방식으로 만들어지며, 기본적으로 XML 트리를 구축하여 응답한다. 그러나 ProcessorMBean을 정의하여 "skin"을 만들수 있다. 이는 XML 트리를 처리하며, 그것을 가지고 다른 일을 할 수 있다. 프로세서는 또한 서버가 이해하지 못하는 요청을 처리하는 책임을 가지게 될 것이다. 이런 방식으로 적합한 프로세서가 이미지와 원본 HTML파일을 제공할 수 있다. 현재 두개의 프로세서들이 정의되어 있다 :
DefaultProcessorMBean: 트리를 Text로 Publish하도록 XML 트리를 변경하지 않는다. content-type은 text/xml로 정의한다. 이렇케하면 대개 사용자 브라우저가 XML 텍스트를 표시하게 될 것이다. 이 프로세서는 XML 파일 이외에 다른 데이터를 제공하지 않는다.
XSLTProcessorMBean: 이 프로세서는 XSLT를 이용하여 XML 트리를 HTML로 변환하는 일을 한다. JAXP-호환 XSLT를 사용하여야 한다. 이 프로그램은 Xalan XSLT processor 와 Saxon XSLT processor(이 글을 작성할 때 어떠한 Saxon 버전에서도 동작하지 않았다)에서 테스트되었다. 또 프로세서는 이미지나 HTML 데이터를 제공할 수 있다.
VelocityProcessorMBean: To be built...
프로세서가 MBean이라는 것은 deploy 될 수 있고, runtime시에 변경할 수 있다는 것을 의미한다. HttpAdaptorMBean는 Processor를 설정하는 두가지 메소드들을 정의한다. 프로세서가 정의되지 않았거나 에러가 난다면, DefaultProcessor가 사용될 것이다.
HttpAdaptor는 HttpAdaptorMBean 인터페이스에 정의된 MBean이다. 다음과 같은 파라미터를 가진다.
Port: 서버가 리슨할 포트를 정의한다. 기본값은 8080이다.
Host: 리슨할 서버의 호스트이름을 정의한다. 기본값은 localhost이다. 이는 다른 컴퓨터에서는 서버에 접속할수 없다는 것이다. 이는 보안상의 이유때문이다. 명시적으로 서버를 오픈해야 된다. 모든 로컬 인터페이스에 서버를 열려면 0.0.0.0을 사용하면 된다.
Alive: 서버가 동작중인지 아닌지를 알려주는 Boolean 프로퍼티
AuthenticationMethod: 인증 방법을 설정한다. 유효한 값은 none / basic / digest가 있다. security 장을 참고하라.
Processor: XML 트리 생성후에 사용될 프로세서를 설정한다. ProcessorName을 설정하면 null이 된다.
ProcessorName: XML 프로세서로 사용될 MBean's ObjectName을 설정한다. 설정하면 Processor가 null이 된다. MBean은 mx4j.adaptor.http.ProcessorMBean 인터페이스를 구현하여야 한다.
ProcessorNameString: 위와 같으나 object name이 string으로 전달된다.
ProcessorClass: 이것은 클래스 이름을 가져오고 클래스 객체를 초기화한다. 이 클래스는 mx4j.adaptor.http.ProcessorMBean 인터페이스를 구현해야 하며 ProcessorName 이나 ProcessorNameString 속성을 설정해야 한다.
SocketFactory: 기본 소켓 Factory를 다른 것으로 대체한다. 예를 들어, mx4j.adaptor.http.ssl.SSLFactory와 같은..
SocketFactoryName: 기본 소켓 factory를 ObjectName을 사용하는 다른 것으로 대체한고, 지정한 mbean은 public ServerSocket createServerSocket(int port, int backlog, String host) throws IOException 를 포함하고 있어야 한다.
SocketFactoryNameString: 위와 같으나 문자열 객체로 전달한다.
StartDate: adaptor가 시작할 때의 날짜와 시간
RequestsCount: 제공한 총 요청 수
Version: HttpAdaptor의 버전
HttpAdaptor는 몇가지 메쏘드를 수용한다.
start() HttpAdaptor를 시작하고 서버가 시작하지 않았다고 알린다.
stop() 서버를 중지한다.
addCommandProcessor(String path,HttpCommandProcessor processor) 이것은 명령 프로세서(command processor)를 추가하고 그것을 경로에 할당한다. 사용자는 이것을 사용해서 사용자 정의 XML 트리구조를 만드는 사용자만의 명령 프로세서를 만들 수 있다. 만약 경로가 전에 할당되어 있다면 이 명령이 이전의 정의를 대체할 수 있으니 주의하시오.
addCommandProcessor(String path,String classname) 위와 같으나 프로세서 객체는 클래스이름으로 표시하고 메쏘드는 주어진 클래스의 객체를 초기화하고 mx4j.adaptor.http.HttpCommandProcessor 인터페이스를 구현했는지 검사하고, 지정한 경로에 할당하려고 시도할 것이다.
void removeCommandProcessor(String path) 주어진 경로에서 할당된 명령 프로세서를 삭제한다.
HttpAdaptor는 보안을 보장하기위한 방법이 없다. 그러나, 기본적은 인증은 제공된다.
기본 인증은 보호의 미약한 형태를 제공하는 방법이다. 설정되면, 사용자 브라우저가 사용자 이름과 패스우드를 묻고, Adaptor에 저장된 것과 비교 하는 방법이다. 사용자 이름/패스워드 쌍을 추가하려면 addAuthorization메소드를 사용하면 된다. 전에 언급했듯이, 사용자 이름과 패스워드는 약한 encoding(base64)으로 전송되어 basic 인증은 미약한다. 그러나, 이는 secured 네트웍이나 SSL을 통하는 데에 사용되면, 완벽해 질 수 있다.
HttpAdaptor는 일반 소켓대신 SSL을 사용할 수 있다. 이를 위해 다음 3 단계가 필요하다 :
Install JSSE:
SSL 지원되도록 Adaptor를 실행하려면 JSSE가 필요하다. 여기 서 제공하는 JSSE 1.0.2 버전을 사용하거나 JDK 1.4를 사용할 수 있다. JSSE는 3개의 jar파일들이 들어있고, 이를 classpath에 추가해야 한다. : jsse.jar, jcert.jar, jnet.jar파일이다. 또 다른 방법은 이 파일들을 JAVA_HOME/lib/ext 디렉토리에 놓는 방법이다. JDK 1.4를 사용하는 경우에는 이런 과정이 필요없다.서버 인증서 생성하기:
서버 인증서를 생성하기 위해서 keytool 명령어를 사용할 수 있다. 예를 들어
keytool -genkey -keystore certs,
여기서 certs는 keystore파일 이름이다. keystore에 대한 패스워드와 인증서 구분 이름에 대한 프롬프트가 나올 것이다. 브라우저는 아마도 자신이 키를 사인했기 때문에(self-signed) 키의 유효성에 대한 경고메시지를 표시할 것이다.
Configure HttpAdaptor:
마지막으로 기본 소켓 factory를 SSL Factory로 변경하여야 한다. 이를 하기 위해서 SocketFactory 속성을 mx4j.adaptor.http.ssl.SSLFactory객체에 전달하여야 한다. SSLFactory는 방금전에 당신의 keystore와 key로 설정되어야 한다.이후, HttpAdaptor를 실행하고, http://host:port대신에 https://host:port를 사용한다.
SSLFactory는 인증서 keystore를 찾기위한 몇가지 파라미터를 포함한다. 이들은 SSLFactory 관리 인터페이스에 있다.
HttpAdaptor를 사용하려면, MBean을 인스턴스화해야 하며, 서버에 등록해야 한다. 그 후 원하는 파라미터를 설정하고, operation을 초기화 하기위해서 start를 invoke한다. 주의할 것은 xerces와 같은 JAXP-호환 파서를 CLASSPATH에 추가해야 한다. XSLTAdaptor를 사용하려면, xalan.jar를 CLASSPATH에 추가해야 한다. SSL를 사용하려면, JSSE jar파일들을 추가해야 한다.
예 3.1. HttpAdaptor 초기화 하기
import mx4j.adapter.http.HttpAdaptor; MBeanServer server = ...; HttpAdaptor adapter = new HttpAdaptor(); ObjectName name = new ObjectName("Server:name=HttpAdaptor"); server.registerMBean(adapter, name); adapter.setPort(XXX); adapter.setHost("XXX"); adapter.start(); or... server.createMBean("mx4j.adaptor.http.HttpAdaptor", name, null); server.setAttribute(name, new Attribute("Port", new Integer(XXX))); server.setAttribute(name, new Attribute("Host", "XXX")); server.invoke(name, "start", null, null);
기본이외의 프로세서를 사용하려면, 다음과 초기화하고 설치해야 한다.
예 3.2. 기본외 프로세서 설치
MBeanServer server = ...; ObjectName name = new ObjectName("Server:name=HttpAdaptor"); ObjectName processorName = new ObjectName("Server:name=XSLTProcessor"); server.createMBean("mx4j.adaptor.http.HttpAdaptor", name, null); server.createMBean("mx4j.adaptor.http.XSLTProcessor", processorName, null); server.setAttribute(name, new Attribute("ProcessorName", processorName));
HttpAdaptor는 요청을 해석하고 어떤 동작을 실행하는 일을 한다. Adaptor는 사용가능한 요청의 리스트를 가지고 있고, XML 결과(혹은 예외 등..) 트리를 만든다. 새로운 request 처리기(handler)는 mx4j.adaptor.http.HttpCommandProcessor를 구현을 만들어 추가하고, HttpAdaptor에 추가하여 사용할 수 있다. 그러나, 이것은 일반 사용자에 의해 일반적으로 될 수 있는 것은 아니다.
다음이 현재 사용가능한 요청(request)와 결과, 필요한 파라미터의 목록이다.
http://host:port/serverbydomain도메인 그룹별로 사용가능한 MBean의 리스트를 반환한다. 결과 트리는 다음과 같다.
<Server> <Domain name="Http"> <MBean classname="mx4j.adaptor.http.HttpAdaptor" description="HttpAdaptor MBean" objectname="Http:name=HttpAdaptor"></MBean> <MBean classname="mx4j.adaptor.http.XSLTProcessor" description="XSLT Processor" objectname="Http:name=XSLTProcessor"></MBean> </Domain> <Domain name="JMImplementation"> <MBean classname="javax.management.MBeanServerDelegate" description="" objectname="JMImplementation:type=MBeanServerDelegate"></MBean> </Domain><Domain name="Test"> </Server>
request는 다음 파라미터를 받아들일(accept) 수 있다 :
http://host:port/server는 서버에 있는 모든 MBean들의 리스트를 반환한다. 결과트리는 다음과 같다:
<Server> <MBean objectname="Http:name=HttpAdaptor"></MBean> <MBean objectname="Http:name=XSLTProcessor"></MBean> <MBean objectname="JMImplementation:type=MBeanServerDelegate"></MBean> </Server>
이 request는 다음의 파라미터를 처리할 수 있다:
http://host:port/mbean?objectname=XXX http://host:port/mbean?objectname=Test:name=test1 참고하는 MBean의 설명을 반환한다. request에 대상 objectname이 전달되어야만 한다. request ~ 에 대한 결과는 다음과 같다.
<MBean classname="test.mx4j.adaptor.http.HttpAdaptorXMLTest$TestClass" description="" objectname="Test:name=test1"> <Attribute availability="RO" description="" name="Double" type="java.lang.Double" value="0.0"/> <Attribute availability="RW" description="" name="Str" type="java.lang.String" value="t1"/> <Attribute availability="RO" description="" name="True" type="boolean" value="true"/> <Constructor description="" name="test.mx4j.adaptor.http.HttpAdaptorXMLTest$TestClass"> <Parameter description="" id="0" name="" type="java.lang.String"/> </Constructor> <Operation description="" impact="unknown" name="aMethod" return="java.lang.Boolean"> <Parameter description="" id="0" name="" type="java.lang.String"> </Parameter> </Operation> <Operation description="" impact="unknown" name="anotherMethod" return="void"> <Parameter description="" id="0" name="" type="java.lang.String"></Parameter> <Parameter description="" id="1" name="" type="int"></Parameter> </Operation> <Notification description="test" name="name"> <Type name="test1"></Type> <Type name="test2"></Type> </Notification> </MBean>
request다음과 같은 추가 파라미터를 수용할 수 있다 :
http://host:port/getattribute?objectname=XXX&attribute=XXX&format=ZZZ 속성값을 가져온다. 이것은 특히 배열같은 사용가능한 형식으로 된 확실한 형태의 값을 가져오기 위한 명령이다. �첸� 형식이 생략되거나 이해할 수 없는 것이라면 기본적인 리턴값은:
<MBean objectname="Test:name=test1"> <Attribute classname="java.lang.String" name="Str" value="t1"/>" + </MBean>"그러나 만약 형식이 배열(array)이면 다음과 같이 결과가 나타난다.
<MBean objectname="Test:name=test3"> <Attribute classname="[Ljava.lang.String;" name="StrArray"> <Array componentclass="java.lang.String" length="3"> <Element element="a" index="0"/> <Element element="b" index="1"/> <Element element="c" index="2"/> </Array> </Attribute> </MBean>형식이 collection이면 결과는 다음과 같다.
<MBean objectname="Test:name=test3"> <Attribute classname="java.util.List" name="List"> <Collection length="3"> <Element elementclass="java.lang.String" element="a" index="0"/> <Element elementclass="java.lang.String" element="b" index="1"/> <Element elementclass="java.lang.String" element="c" index="2"/> </Collection> </Attribute> </MBean>형식이 map이면 결돠는 다음과 같다.
<MBean objectname="Test:name=test3"> <Attribute classname="java.util.Map" name="Map"> <Map length="3"> <Element elementclass="java.lang.String" element="a" keyclass="java.lang.Integer" key="0"/> <Element elementclass="java.lang.String" element="b" keyclass="java.lang.Integer" key="1"/> <Element elementclass="java.lang.String" element="c" keyclass="java.lang.Integer" key="2"/> </Map> </Attribute> </MBean>
요청은 다음의 파라미터를 필요로 한다.
http://host:port/setattribute?objectname=XXX&attribute=XXX&value=XXX Sets the value of an attribute. This is an operation request attribute의 값을 설정한다. 이 request는 데이터 요청이 아니라, 동작 요청이다. 모든 operation request는 아래와 같이 MBeanOperation 트리로 반환된다.
<MBeanOperation> <Operation objectname="Test:name=test1" operation="setattribute" result="success"/> </MBeanOperation>오류가 있다면 다음과 같이 표시된다.
<MBeanOperation> <Operation errorMsg="Attribute Number not found" objectname="Test:name=test1" operation="setattribute" result="error"/> </MBeanOperation>
request는 다음과 같은 파라미터를 필요로 한다.
http://host:port/invoke?objectname=XXX&operation=XXX&type0=XXX&value0=XXX... 대상 MBean의 operation을 invoke한다.
<MBeanOperation> <Operation objectname="Test:name=test1" operation="invoke" result="success" return="true"/> </MBeanOperation>
다음 파라미터들이 필요하다 :
http://host:port/delete?objectname=XXX 대상 MBean을 제거함
<MBeanOperation> <Operation objectname="Test:name=test1" operation="delete" result="success"/> </MBeanOperation>
다음 파라미터가 필요함 :
http://host:port/create?class=XXX&objectname=XXX&type0=XXX&value0=XXX... 해당되는 생성자를 invoke(호출)하여 대상 MBean을 생성한다.
<MBeanOperation> <Operation objectname="Test:name=test1" operation="invoke" result="success" return="true"/> </MBeanOperation>
다음 파라미터가 필요함 :
http://host:port/constructors?classname=mx4j.adaptor.http.HttpAdaptor 클래스에 대한 사용가능한 생성자를 MBean 서버에 쿼리한 결과는 다음과 같다.
<Class classname="mx4j.adaptor.http.HttpAdaptor"> <Constructor name="mx4j.adaptor.http.HttpAdaptor"> <Parameters ...> </Parameters> </Constructor> </Class>
다음 파라미터가 필요함 :
클래스를 찾을 수 없는 경우 다음과 같은 exception을 보낸다.
<Exception classname="mx4j.adaptor.http.HttpAdaptor" errorMsg="class XXX not found"/>
http://empty 빈 요청을 생성한다. 이것은 템플릿 인자를 보내는 정적 리소스인 xsl stylesheet를 처리할 때 사용된다. 결과 트리는 다음과 같다.
<empty/>
http://host:port/empty 빈 요청은 빈 xml트리를 반환한다. 이것은 기본적으로 순수 xsl로 된 '정적' 요청을 생성하는 사용된다. 결과 트리는 다음과 같다.
<empty/>