짱 xmlrpc 구현체
xmlrpc 는 만들어진지는 오래된 프로토콜인데,
soap의 그늘에 가려서 그렇게 많이 사용되지는 않았었죠.
그러나 webservice의 복잡성에 비해
매우 간결한 구조를 갖고 있고, 그에따라 성능역시 soap 보다 훨씬 빠릅니다.
간결한 spec으로 인해 여러 언어로 된 구현체가 많이 나와있는 상태이기도 하죠.(c부터 js에 이르기까지..)
최근에 blog가 유행하면서 blog의 제어 api로도 거의 표준적으로 사용되는 추세죠..
하지만 ,java 구현체는..
몇개 나와 있지 않은 상태고, 그것도 그렇게 유연성있는 구조를 갖고 있지 않아 보이더군요.
퍼포먼스역시 고려되지 않은 듯한 느낌이고.
무엇보다, xmlrpc가 http에 강하게 의존하는 프로토콜이지만
일반적인 ip 기반의 통신에서 이용할때에 대한 유연성이 상당히 떨어지는 느낌입니다.
그래서 만들었습니다.
일단, 특징적인 점은,
가장 큰 병목점인 xmlstream을 parsing 하는 부분과 xmlstream으로 serialling을 모듈화해서
특정 xml parser에 종속되지 않게 했다는 점이겠죠.
사용자는 "kimth.xmlrpc.XmlRpcParserFactory", "kimth.xmlrpc.XmlRpcSeriallizerFactory" System property 를 셋팅함으로써 default로 로딩되는
통해 fatory를 바꿀수 있습니다.
기본적으로 SAX 에 기반해서 구현한 parser를 쓰도록 되어 있고, 기본적으로 pull, sax 방식으로
구현된 두가지 parser를 내장하고 있습니다.(kimth.xmlrpc.impl.DefaultParserFactory, kimth.xmlrpc.impl.PullParserFactory)
(참고)
xml pull parser로 구현한 xmlrpcparser의 경우 sax 기반으로 구현된것보다
보통 20배 이상 빠르더군요.
실제 서버의 로직을 수행하는 부분은
XmlRpcServer 이며, 이 클래스는 추상클래스 입니다.
사용자는 XmlRpcServer의 invoke 함수를 구현함으로써 logic 처리를 정의하게 됩니다.
기본적으로 static method를 invoke 시키는 kimth.xmlrpc.impl.StaticMethodServer를 내장하고 있습니다.
(Requirements)
JRE1.4
jakarta commons-logging http://jakarta.apache.org/commons/logging.html
jakarta commons-codec http://jakarta.apache.org/commons/codec/index.html
Xml pull parser http://www.xmlpull.org
그럼 테스트...코드 한번 볼까요
request 를 읽어서 response 를 뿌리는 소습니다.
public class Test
{
public static void main(String[] args) throws XmlRpcException, IOException, XmlRpcSeriallizerConfigException, XmlRpcParserConfigException
{
XmlRpcServer xmlrpc = new StaticMethodServer();
FileInputStream fis = new FileInputStream("request.xml");
byte[] buf = new byte[fis.available()];
fis.read(buf);
ByteBuffer bbf = ByteBuffer.wrap(buf);
ByteBuffer bout = xmlrpc.execute(bbf);
FileOutputStream fos = new FileOutputStream("response.xml");
FileChannel fch = fos.getChannel();
while (bout.hasRemaining())
{
fch.write(bout);
}
fch.force(true);
fos.flush();
fos.close();
}
public static String hello(String name)
{
return "hello " + name;
}
}
그럼 request.xml 은?
<?xml version="1.0" encoding="EUC-KR"?>
<methodCall>
<!-- Test의 클래스 메소드인 hello를 호출-->
<methodName>Test.hello</methodName>
<params>
<param>
<value>
바붕이
</value>
</param>
</params>
</methodCall>
---------------------------------------------------------------------
apidoc 보러가기 : http://i.80port.net/xmlrpc/apidoc/
jar 받기 : http://i.80port.net/xmlrpc/bin/xmlrpc.jar
---------------------------------------------------------------------
급하게 작성하다 보니 정말 성의 없어 보이네요 제가 봐도 -_-
여러분의 FeedBack을 기다립니다..
요새 할일이 없어서
여러분이 요청만 한다면 바로바로 customizing 할수 있을거 같네요.
패키지와 클래스 명만 변경하지 마시고
맘대로 퍼가세요.