-
Notifications
You must be signed in to change notification settings - Fork 0
Tutorial : add your services [Korean]
Cask 서버에 올릴 수 있는 본인이 개발한 자바 클래스를 의미함. conf 파일에서 개발한 자바 클래스를 http url과 연결할 수 있음. cask는 http url이 호출되었을 때 하나의 thread로 자바 클래스의 한 함수를 호출함
- Request service (HTTP GET)
- Request service (HTTP POST)
- Batch service
Cask 프로젝트 tutorial - install & execute이 먼저 되어 있는 상태
모든 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 형태로 클라이언트로 전달됨.
아래와 같은 결과를 볼 수 있음
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 헤더를 추가
서버가 시작하자 마자 수행되어서 무한 루프로 서버 종료시까지 유지되는 서비스로 특정 시간 주기로 뭔가를 체크해서 일을 하는 작업에 활용될 수 있음
마찬가지로 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에서 사용하기 위한 값을 전달하기 위해서는 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");
}