Skip to content

Tutorial : add your services [Korean]

lonslonz edited this page Apr 5, 2013 · 1 revision

top

Cask Service란

Cask 서버에 올릴 수 있는 본인이 개발한 자바 클래스를 의미함. conf 파일에서 개발한 자바 클래스를 http url과 연결할 수 있음. cask는 http url이 호출되었을 때 하나의 thread로 자바 클래스의 한 함수를 호출함

Service 종류

  • Request service (HTTP GET)
  • Request service (HTTP POST)
  • Batch service

Prepare

Cask 프로젝트 tutorial - install & execute이 먼저 되어 있는 상태

Request service (HTTP GET)

모든 Cask service는 SimpleService interface의 handle() 함수를 구현하면 됨. handle 함수는 하나의 http url에 대응하며, cask는 url로 요청이 들어올 때 handle 함수를 수행해 줌. 예를 들어 아래와 같은 클래스를 만들면 됨. 아래 코드는 받은 인자를 출력하는 간단한 echo service.

public class SimpleRequestService implements SimpleService {
     
    private Logger logger = LoggerFactory.getLogger(SimpleRequestService.class);
     
    @Override
    public void handle(SimpleParams request, SimpleParams response, ServiceRuntimeInfo runtimeInfo) throws Exception {
         
        Map<String, Object> data = request.getParams();
        Iterator<String> it = data.keySet().iterator();
         
        Map<String, Object> tempMap = new HashMap<String, Object>();
        while(it.hasNext()) {
            String me =  it.next();
            Object obj = data.get(me);
            logger.debug("key : {}, value : {}", me, obj);
            tempMap.put(me, obj);
        }
         
        Map<String, Object> resultMap = new HashMap<String, Object>();
        resultMap.put("returnCode",  1);
        resultMap.put("returnDesc",  "success");
        resultMap.put("requests",  tempMap);
         
        response.setParams(resultMap);
        logger.info("simple service response : {} ", response.getParams());
    }
}

conf/server.xml에 만든 클래스를 url과 매핑함

<services>
         <service url="/service/simpleget"
                 class="com.skplanet.postino.service.SimpleRequestService"
                 exec="request"
                 method="get"/>
</services>

http://[서버]:[포트]/[contextPath]/[service url] 주소로 작성한 클래스가 호출됨. 위의 예에서는 http://localhost:8080/cask/service/simpleget 이 주소가 됨

  • method="get"으로 지정되면 service/simpleget?test=1234 와 같이 get 방식으로 인자를 줄 수 있음
  • 코드에서는 request.getParams() 혹은 request.get(key), request.getString(key)와 같은 함수를 이용하여 가져올 수 있음
  • 결과는 response.setResult()를 통해 return. json 형태로 클라이언트로 전달됨.

아래와 같은 결과를 볼 수 있음

http get

Request service(HTTP POST)

GET 방식과 http 요청 방식만 바뀌는 것으로 코드는 같음 conf/server.xml 설정시에 method="post"로 설정

  <services>
         <service url="/service/simplepost"
                 class="com.skplanet.postino.service.SimpleRequestService"
                 exec="request"
                 method="post"/>
</services>

firefox REST plugin에서 다음과 같은 요청 결과를 볼 수 있음. accept: application/json 헤더를 추가

HTTP POST req

Batch service

서버가 시작하자 마자 수행되어서 무한 루프로 서버 종료시까지 유지되는 서비스로 특정 시간 주기로 뭔가를 체크해서 일을 하는 작업에 활용될 수 있음

마찬가지로 SimpleService의 handle interface를 구현

  • 대신 아래 예제와 같이 무한 루프를 수행, 그렇지 않으면 바로 종료되어 원하는 수행이 되지 않음.
  • 아래의 예제는 무한 루프를 돌면서 log 메시지를 남김
  • 아래 코드에서 return 문은 수행되지 않을 것임
  • server.xml에서 정의한 sleepMSec을 코드상에서 requets.get("sleepMSec")으로 가져올 수 있음
public class SimpleBatchService implements SimpleService {
    private Logger logger = LoggerFactory.getLogger(FileTransfer.class);
     
    private static final int SLEEP_DEFAULT_MSEC = 1000;
    private boolean stop = false;
     
    @Override
    public void handle(SimpleParams request, SimpleParams response, ServiceRuntimeInfo runtimeInfo) throws Exception {
     
        Map<String, Object> resultMap = new HashMap<String, Object>();
        try {
            Integer sleepMSec = (Integer)request.get("sleepMSec");
            if(sleepMSec == null) {
                sleepMSec = SLEEP_DEFAULT_MSEC;
            }
             
            while(true) {
                try {
                    logger.info("execute batch logic");
                }
                catch(Exception e) {
                    logger.error(StringUtil.exception2Str(e));
                }
                 
                logger.info("batch service sleep {} msec", sleepMSec);
                Thread.sleep(sleepMSec);
                 
                if(stop) {
                    break;
                }
            }
             
            resultMap.put("returnCode",  true);
            resultMap.put("returnDesc",  "success");
             
        } catch(Exception e) {
            resultMap.put("returnCode",  false);
            resultMap.put("returnDesc",  StringUtil.exception2Str(e));
        } finally {
            response.setParams(resultMap);
            logger.info("simple service response : {} ", response.getParams());
        }
    }
}

conf/server.xml 파일에 batch를 위한 서비스를 정의해야 함

  • exec="batch"로 설정
  • method 값은 큰 상관 없음
  • sleepMSec를 정의해야 함. 루프를 돌면서 서비스가 수행됨. mili second 단위
  • 코드상에서 Integer sleepMSec = (Integer)request.get("sleepMSec");으로 얻어올 수 있음
        <service url="/service/simplebatch" 
                 class="com.skplanet.cask.service.SimpleBatchService" 
                 exec="batch" 
                 method="post"
                 sleepMSec="10000 "/>

Service에서 사용할 수 있는 인자 넣기

Service에서 사용하기 위한 값을 전달하기 위해서는 property를 정의하면 됨.

  • conf/server.xml의 property 태그로 key, value로 추가하면 됨
 <properties>
        <property key = "id" value = "1"/>
        <property key = "name" value = "jongmin,Lee"/>
    </properties>

이와 같이 정의되면 코드에서는 ConfigReader 클래스를 통해 얻을 수 있음

while(true) {
           try {
               String id = ConfigReader.getInstance().getServerConfig().getPropValue("id");
               String name = ConfigReader.getInstance().getServerConfig().getPropValue("name");
                
               logger.info("id : {}, name : {}", id, name);
               logger.info("execute batch logic");
                
           }