명령 패턴 을 사용하려고 시도 할 수 있습니다 .
class MyServiceManager {
public void execute(MyServiceTask tasks...) {
// set up everyting
MyService service = this.acquireService();
// execute the submitted tasks
foreach (Task task : tasks)
task.executeWith(service);
// cleanup yourself
service.releaseResources();
}
}
이를 통해 리소스 획득 및 릴리스를 완벽하게 제어 할 수 있습니다. 호출자는 서비스에 작업을 제출하기 만하며 사용자는 자원을 확보하고 정리해야합니다.
그러나 캐치가 있습니다. 발신자는 여전히 다음을 수행 할 수 있습니다.
MyServiceTask t1 = // some task
manager.execute(t1);
MyServiceTask t2 = // some task
manager.execute(t2);
그러나 문제가 발생할 때이 문제를 해결할 수 있습니다. 성능 문제가 있고 일부 발신자가이 작업을 수행하는 것을 발견하면 적절한 방법을 보여주고 문제를 해결하십시오.
MyServiceTask t1 = // some task
MyServiceTask t2 = // some task
manager.execute(t1, t2);
다른 작업에 종속 된 작업에 대한 약속을 구현하여이 작업을 임의로 복잡하게 만들 수 있지만 배포하는 작업도 더 복잡해집니다. 이것은 시작일뿐입니다.
비동기
주석에서 지적했듯이 위의 내용은 실제로 비동기 요청에서는 작동하지 않습니다. 맞습니다. 그러나 이것은 CompleteableFuture를 사용하여 Java 8에서 쉽게 해결할 수 있습니다 . 특히 CompleteableFuture#supplyAsync
개별 미래를 만들고 모든 작업이 완료 CompleteableFuture#allOf
되면 리소스를 공개 합니다. 또는 Threads 또는 ExecutorServices를 사용하여 자신의 Futures / Promises 구현을 롤백 할 수도 있습니다.