LRA 컨트롤러 생성
LRA 컨트롤러는 개발도구 [New –> 컨트롤러] 메뉴를 선택한 후 타입 이름과 논리 이름, RequestMapping URL정보를 입력하고, 템플릿을 Long Running Action을 선택하여 생성한다.
다음 화면에서 LRA를 처리하기 위한 추가 정보를 입력할 수 있다.
해당 위자드에서는 LRA 참여(시작), 완료, 취소처리 대한 정보를 입력 할 수 있다.
-
LRA : LRA 참여(시작)하기 위한 정보를 입력하는 영역이다.
-
Complete : LRA가 정상적으로 처리가 완료가 되었을 때 호출 되는 정보를 입력하는 영역이다.
-
Compensate : LRA수행시 예외가 발생할 경우 호출 되는 정보를 입력하는 영역이다.
위자드에 정상적으로 기입한 후 Finish 버튼을 클릭하면 아래와 같은 LRA를 수행하기 위한 기본적인 소스코드가 아래와 같이 생성된다
/**
*
*
* @author sysadmin
*/
@RestController
@RequestMapping("/employee-lra")
@BxmCategory(logicalName="Emp LRA 컨트롤러", description="")
public class EmployeeLraController {
private Logger logger= LoggerFactory.getLogger(getClass());
@RequestMapping(
method= RequestMethod.GET
, path= "/updateEmployee"
)
/*(1)*/@LRA(value= LRA.Type.REQUIRED, timeLimit= 10, timeUnit= ChronoUnit.SECONDS)
public ResponseEntity<String> updateEmployee(
/*(2)*/@RequestHeader(name= LRA_HTTP_CONTEXT_HEADER, required= true) String lraId
)
{
Map<Object, Object> terminationData= new HashMap<>();
//terminationData.put("key", "value");
/*(3)*/LRAContext.storeTerminationData(terminationData);
// TODO 트랜잭션 내에서 수행할 내용과 결과를 반환 하는 코드를 작성 하십시오.
return ResponseEntity.ok("completed");
}
@RequestMapping(
method= RequestMethod.PUT
, path= "/completeEmployee"
)
/*(4)*/@Complete
public ResponseEntity<String> completeEmployee(
@RequestHeader( name= LRA_HTTP_CONTEXT_HEADER, required= true) String lraId
/*(5)*/, @RequestBody Map<Object, Object> terminationData
)
{
// TODO 트랜잭션이 성공한 경우 수행할 코드를 작성 하십시오.
return ResponseEntity.ok( ParticipantStatus.Completed.name());
}
@RequestMapping(
method= RequestMethod.PUT
, path= "/cancelEmployee"
)
/*(6)*/@Compensate
public ResponseEntity<String> cancelEmployee(
@RequestHeader( name= LRA_HTTP_CONTEXT_HEADER, required= true) String lraId
, @RequestBody Map<Object, Object> terminationData
)
{
// TODO 트랜잭션이 실패한 경우 수행할 코드를 작성 하십시오.
return ResponseEntity.ok(ParticipantStatus.Compensated.name());
}
}
다음은 위자드를 통해 생성된 코드에 대해서 기술한 내용이다.
(1) LRA 트랜잭션에 참여하기 위한 속성이 설정된다. 참고로 LRA의 타입 설정은 Spring Framework 트랜잭션의 Propagation 의 속성 설정과 거의 동일하다.
LRA.Type.REQUIRED : LRA에 트랜잭션이 수행중이면, 해당 트랜잭션에 참여하고, 트랜잭션이 없으면 새로운 LRA 트랜잭션을 생성한다.
LRA.Type.REQUIRES_NEW : 항상 새로운 LRA 트랜잭션을 생성한다.
LRA.Type.MANDATORY : 이미 시작된 LRA 트랜잭션이 있으면 참여하고, 그렇지 않으면 예외를 발생시킨다. (412 Precondition Failed)
LRA.Type.SUPPORTS : LRA 트랜잭션이 있으면 해당 트랜잭션에 참여하고, 없으면 LRA 트랜잭션 없이 수행한다.
LRA.Type.NOT_SUPPORTS : 항상 LRA 트랜잭션 참여 없이 수행한다.
LRA.Type.NEVER : LRA 트랜잭션을 사용하지 않도록 한다. 이미 진행 중인 LRA트랜잭션이 있는 경우 예외를 발생시킨다. (412 Precondition Failed)
(2) LRA 트랜잭션에 참여가 시작한 경우에는 해당 트랜잭션에 대한 Unique한 ID값을 발행하며, 컨트롤러에서는 해당 값을 가져올 수 있다.
(3) LRA에 참여 시 생성되는 공유 Context로 변경된 데이터를 확정하거나, 복원하기위해 사용된다.
(4) @Complete 어노테이션은 LRA가 정상적으로 수행이 완료가 되었을 때 호출 되는 메소드이다. 해당 메소드에서는 변경 사항에 대해서 확정(완료) 처리를 수행하면 된다.
(5) (3) 에서 생성된 공유 Context를 파라미터로 전달 받아, 변경 사항에 대하여 확정(완료)처리를 하면 된다.
(6) @Compensate 어노테이션은 LRA가 실패하였을 경우에 호출 되는 메소드이다. 해당 메소드에서는 변경 사항에 대해서 취소 처리를 수행하면 된다.