나는 파이프 라인 패턴을 구현하고있다. 리소스는 리소스를 처리 할 객체의 시리얼에 전달된다. 하나의 객체가 리소스를 사용하여 완료되면 리소스를 후계자에게 전달한다. ?자원이 일련의 객체로 전달되는 경우 자원을 해제하는 방법은 무엇입니까?
답변
chain of responsability 패턴 (또는 하나의 변형)과 같은 의미입니까? 그래, 난 마지막 처리 객체가 자원 해제 수도 있겠죠 경우
public void process(Resource rsrc)
{
writeMessage(msg);
if (next != null)
{
next.process(rsrc);
}
else
{
// release resource
}
}
을하지만 당신의 질문은 나에게 매우 명확하지 않았다, 그래서 내가 정확히 질문에 대답 모르겠어요.
편집
난 당신이 다소 복잡한 시나리오를 가지고 당신의 파이프 라인이 사소한 방법 (예를 들어,이 비동기 인 경우)에 반환하지 않은 가정.
Resource rsrc = new Resource();
chain.process(rsrc);
rsrc.release();
파이프에 리소스를 전달하는 발신자 : 다른 답변에서 제안대로 리소스를 만들 수 있다면, 책임의 사슬을 발사 한 후 리소스를 해제, 그것은 물론 가장 쉬운 방법입니다. 리소스를 할당하고 처리를 시작하므로 정리해야합니다.
컨트롤이 호출자에게 반환되지 않으면 파이프 끝에 터미네이터를 사용할 수 있지만이 터미네이터는 다른 책임을지지 않습니다.
파이프 개체를 책임있게 만드는 것은 반 패턴과 유사합니다. 이는 더 단단한 결합을 의미하고 유지하기가 더 어렵 기 때문입니다.
마치 내가 알고있는 것을 Chain of Responsibility pattern 또는 이와 유사한 것으로 구현하는 것처럼 들립니다.
이 경우 체인의 프로세서 중 하나에 해당 책임을 위임하기보다는 체인 작업을 시작할 때마다 리소스를 해제하는 것이 좋습니다.
"Unit of Work" 패턴을 살펴 보시기 바랍니다.
즉, 데이터, 개체 및 리소스 자체를 파이프 라인이 전달하는 단일 개체의 일부로 만듭니다. 작업 단위를 롤백/릴리스/보류중인 모든 작업을 처리하는 릴리스 메소드로 노출 시키십시오 (가능하면 비정상으로 인한 것인지 구분할 수 있음).
이 릴리스 방법은 파이프 라인의 마지막 단계 (모든 것이 잘 진행되는 경우) 또는 무언가가 고장 난 경우 중간 단계의 catch/finally 부분에 의해 호출됩니다.
이 접근 방식의 단점은 체인의 마지막 프로세서가 릴리스를 확인해야한다는 것입니다. 체인의 다른 어떤 것도 해제를 요구하지 않는다. 이는 체인의 마지막 프로세서를 처리중인 작업 단위에 상당히 밀접하게 연결하며 해당 프로세서가 항상 체인의 끝에 있어야한다는 것을 의미합니다. 다른 위치에서 해당 프로세서로 다른 체인을 설정할 수는 없습니다. – razlebe
음, 그렇습니다. 그러나 나는 솔직히 그 점을 보지 못합니다. 리소스가 자동으로 스스로를 해제하지 않으며, 프로세스가 끝나기 전에 강제로 해제하면 문제가 발생합니다. 작업 단위 (UOW)에서 자원을 패키징하면 UoW 메소드가 자원이 이미 릴리스되었는지 여부를 확인할 수 있고 다시 릴리스하려고 시도 할 때 예외를 throw 할 수 있기 때문에이 문제를 완화합니다. 리소스가 해제되었습니다. –
- 1. 함수에 문자열이나 객체로 전달되는 요소입니까?
- 2. 일련의 함수를 만드는 방법은 무엇입니까?
- 3. 값을 할당 해제하는 방법은 무엇입니까?
- 4. 일련의 수표를 실행하는 방법은 무엇입니까?
- 5. 자원을 전달하는 가장 좋은 방법은 무엇입니까?
- 6. iphone에서 'Accept-Language'헤더가 http로 전달되는 방법은 무엇입니까?
- 7. 참조로 전달되는 언어는 무엇입니까?
- 8. 전달되는 항목은 무엇입니까? 코드에서
- 9. aspx 페이지에 컨트롤을 추가하거나 해제하는 방법은 무엇입니까?
- 10. 기술을 사용하여 일련의 용어를 암기하는 방법은 무엇입니까?
- 11. CF9에서 분리 된 객체로 작업하는 방법은 무엇입니까?
- 12. Cognos에서 일련의 쿼리를 백업하는 방법은 무엇입니까?
- 13. Clojure에서 일련의 불순한 함수를 평가하는 방법은 무엇입니까?
- 14. Perl에서 일련의 테스트를 자동화하는 방법은 무엇입니까?
- 15. 투명 컨트롤에서 클릭 연결을 해제하는 방법은 무엇입니까?
- 16. 문화 불변 자원을 사용한 성능 영향
- 17. ASP.NET MVC에서 인증 된 사용자의 출력 캐싱을 해제하는 방법은 무엇입니까?
- 18. 일련의 독립적 인 일련의 코드 병렬화
- 19. 은 어떻게 템플릿 클래스가 나는 등의 자원을 해제하는 다른 Windows 기능을 래핑하는 작은 도우미 템플릿을 사용하고
- 20. 어떻게 자원을 필터링 할 수 있으며 레일 3에 중첩 된 자원이 있습니까?
- 21. 차단 된 소켓의 차단을 해제하는 방법은 무엇입니까?
- 22. Javascript는 초를 날짜 객체로 변환합니다.
- 23. 확인 MOSS 자원이 생성 존재하는 경우 예상치 못한 (401)의
- 24. HttpPostedFileBase에서 사용하는 리소스를 해제하는 방법은 무엇입니까?
- 25. htmlunit에 의한 자세한보고 기능을 해제하는 방법은 무엇입니까?
- 26. 런타임에 양식 확장 탭을 해제하는 방법은 무엇입니까?
- 27. CFStringTokenizerCreate에서 생성 된 메모리를 해제하는 방법은 무엇입니까?
- 28. 다차원 배열에서 요소를 그룹 해제하는 방법은 무엇입니까?
- 29. forin 루프에서 객체를 해제하는 방법은 무엇입니까?
- 30. scedule selector가 차지하는 메모리를 해제하는 방법은 무엇입니까?
좋은 점. 그리고 감사합니다. 특정 노드가 비동기 적으로 처리되면 리소스의 복사본을 만들어야한다고 생각합니다. 내 시나리오에서는 더 복잡해지며 리소스는 다른 리소스로 래핑됩니다. – Benny