2016-10-21 2 views
2

주기적보고 작업을 설정하려고합니다. 보고서는 사용자 상호 작용없이 작성되어야하며 작업은 응용 프로그램이 시작될 때 예약되어야합니다.Apache ISIS에서 프로그래밍 방식으로 동작 호출

백그라운드 서비스와 스케줄러가 작동합니다. createReport 액션을 UI의 버튼으로 노출하면 다음에 작업이 트리거 될 때 보고서가 만들어집니다. 그러나이 보고서는 사용자 상호 작용없이 반복적으로 작성해야합니다.

프로그래밍 방식으로 동작을 호출하는 방법이 궁금합니다. createReport()를 도메인 서비스로 이동하고 @PostConstruct 주석이있는 메서드에서 호출하면 예외가 발생합니다 (IsisCommand에 명령을 유지하려고 시도). 액션 호출에 대한 일종의 컨텍스트가 있어야한다고 생각하니? 아니면 내가 잘못된 방향으로 접근하고 있습니까? 감사!

@Action(command = CommandReification.ENABLED, 
     commandExecuteIn=CommandExecuteIn.BACKGROUND) 
public Command createReport() { 
    backgroundService.execute(this).generateReport(); 
    return commandContext.getCommand(); 
} 

@Programmatic 
public void generateReport() { 
    .... 
} 

답변

3

메소드를 반복적으로 호출하려는 경우 몇 가지 옵션이 있습니다.

BackgroundService는 나중에 호출 할 작업 호출의 기념일을 만들고 유지합니다 (isisaddons의 isis-command-module을 통해이 기본 제공 구현을 제공합니다 ... 아마도이 기능을 구성했을 것입니다 이미).

명령이 지속되면 명령이 @Programmatic 주석을 달 수 없습니다. 그래서 그것이 하나의 것입니다.

다음은이 동작이 연속적으로 반복되기 때문에 무언가가 다음 번에 배경 호출을 만들어야한다는 것입니다.

이론적으로 createReport (...)에서 마지막 메서드 호출로 backgroundService.execute (this) .createReport (...)를 사용할 수 있습니다. 한가지주의해야 할 것은 최근의 버그 수정 (1.13.1에서 발표되었지만 여전히)이 작업을 안정적으로 수행하기위한 것입니다. 우리의 Kanban board을 참조하십시오.

간단히 접근하면 배경 명령 서비스를 완전히 무시하고 AbstractIsisSessionTemplate을 사용한 다음 RunBackgroundCommandsJob과 비슷한 사용자 지정 Quartz 작업을 호출 할 수 있습니다.

마지막으로 한 가지 : 코드 예제에서 commandExecuteIn = BACKGROUND를 사용하여 작업에 주석을 추가했습니다. 즉, 프레임 워크가 자동으로 액션을 명령으로 지속/지속한다는 것을 의미합니다 ... backgroundCommand.execute (this) .xxx()를 암시 적으로 호출하고 있다고 상상해보십시오. 액션 구현 자체 내에서 그 호출을 할 필요가 없습니다.

HTH 단

+0

고마워요! 내가 필요한 정보. 두 번째 접근 방식으로 갔고 잘 작동합니다. – user5806139

관련 문제