문제

당신이 비즈니스 방법을 논리를 수행할 수 있는 몇 가지 작업자들의 개체입니다.어쩌면 전화를 걸려는 복권 번호를 따 웹 서비스,면 각 사람에 대한 목록에서 선택.자바 코드 같은 것을 볼 수 있습니다 this:

Set<Person> selectedPeople = ... // fetch list of people
for ( Person person : selectedPeople ) {
    String lotteryNumber = callLotteryNumberWebService( person );
    // ...
}

참고 복권 번호를 웹 서비스 할 수 있습 side-effects,같은 기록하는 사람이 요청한 추첨번호(아마도 충전이 자신의 계정),그래서는 웹 서비스 호출에 실패한 한 사람을 위해,그것이 성공할 수 있습니다.이 정보는(복권 번호)를 수준을 더 높은 수준(보기).

이 경우 하나의 작업은 장소,사업 논리 방법을 반환할 수 있는 단일 값(말 추첨번호)또는 예외를 어떤 세부 정보의 오류입니다.하지만 대량 작업이 가능할 것에 대한 몇 가지 작업의 성공과 몇 가지 실패합니다.

이처럼 보이는 유형의 문제에서 발생하는 많은 응용 프로그램이 청결한 방법으로 이를 처리하도록 합니다.그래서 가장 좋은 방법은 무엇을 먹여 이 유형의 정보를 돌아에서 비즈니스 로직 레이어를 다른 층에 있는 응용 프로그램(처럼 보다),가급적이면 일반적인 방법으로 다시 사용할 수 있는 다른 유형의 데이터 및 operations?

도움이 되었습니까?

해결책

내가 이해하는 경우,당신은 상황은 어떤 요청을 전달할 수 있고 일부는 실패 할 수 있습니다.나는 확실하지 않다 당신이 원하는 곳에 오류가 다시 와서 하지만 당신은 수도 중 하나의(또는 변형 또는 조합):

  • 오류 목록과 도메인 개체를 영향을 받습니다.기본 도메인체 또는 뭔가로 persistable ID 이 유용할 수 있습니다 다시 사용할 수 없습니다.E.g.의 컬렉션 오류를 참조하면 도메인의 개체입니다.
  • 당신이를 주입할 수 있(AOP,DI)사람으로 개체의 몇 가지 종류의 오류 개체/메시지입니다.E.g.는 경우(사람입니다.류){...}
  • 당신을 감싸는 사람 컬렉션으로 메시지와 헤더,신체,오류 정보
  • 모든 도메인의 개체를 포함할 수 있었는 오류 컬렉션을 통해 액세스할 수 있도록 인터페이스;또는 사람을 지원합 IHasErrors 인터페이스입니다.당신이 일반적이고 사용하는 기본 오류 개체 지원하는 경고와 유효성 및 모든 방식의 것들입니다.

에 있다면 당신은 진짜 다중 계층(보다는 계층화된)시스템을 할 수 있습니다 다음은 메시지를 기반으로 하는 건물 수있는 쉽게 수용하는 몇 가지 종류의 일반적인 오류가/warning/유효성 검사 메커니즘이 있습니다.SOA/Ajax 시스템에 자신을 빌려하다.

행복을 탐구하는 좀 더 깊이 있는 경우 몇 가지 특정 질문이 있습니다.

다른 팁

이 질문에 중요한 차이점 사이에 적절한 사용은 예외 처리,트랜잭션,그리고 아이디어 워크플로우"대상" 는 아스카고에서 얻을 때,올바르게 알리는:

이처럼 보이는 유형의 문제에서 발생하는 많은 응용 프로그램이 청결한 방법으로 이를 처리하도록 합니다.

그것은 일반적인 문제는 먼저 약간의 배경에 트랜잭션에 접근은 현재 시:

데이터 트랜잭션이 원래 모델을 두 번 항목 회계--단일 신용카 및 대응 직불 해야 했 함께 기록하지 않거나 작동하지 않습니다.트랜잭션으로 얻을 보다 더 큰 이들은 점점 더 문제가 있을 구현하는 올바르게 처리하기가 더 어렵다.을 시작으로 수행하는 아이디어 하나의 트랜잭션의 시스템에서 경계,당신은 가능성이 가장 높은 접근 그것은 잘못입니다.그것을 할 수 있습니다,그러나 필요한 복잡하고 반드시 높은 대기 시간을 트랜잭션 코디네이터입니다.일정 규모의 거래는 잘못된 사고방식과 보상을 만들기 위해 시작을 많이 더 의미가 있습니다.

이것은 당신이 돌아가 무엇인지 살펴보고 사업이 실제로는 않습니다.단일 큰 거래가 가능성이 높지 않는 방식 비즈니스 사람들이 그것을 참조하십시오.일반적으로 그들은 단계를 완료하고,에 따라 이후의 결과,서로 다른 행동을 보상이 필요할 수 있습니다.이것은 아이디어의 워크플로 에서 온다. 여기에 하나를 소개하는 이들 개념

예를 들어 주문하신 경우는 책 아마존에서는,그들은 아마 없"lock"기록하는 동안 그것은 당신의 쇼핑 바구니,또한 사용은 엄격한 거래를 결정하는 경우 이 책은 여전히 에서 주식 때문은 확인됩니다.그들은 당신에게 그것을 판매하 어쨌든,그리고 그것을 발송할 때 할 수 있습니다.지 않는 경우리에서-재고 몇 주 내에 그들은 아마 이메일을 보내는 말씀을 그들이 하려는 당신의 요구를 충족시키기 위해,그리고 당신은 유지할 수 있습니다 그들을 기다리고 그것을 얻을에서 주식,또는 당신이 당신의 주문을 취소 할 수 있습니다.이것은이라고 보상하고,필요한 많은 실제 비즈니스 프로세스입니다.

마지막으로,거기에 뛰어난 아무것도 에 대해 어떤 이니다.기대하는 이 일어날 수 있고 사용을 정상적인 제어 흐름입니다.사용하지 않아야 합 언어의 예외 처리 기능 여기서(좋은 규칙을 위한 경우 예외를 발생시).당장이라도에 의존하는 도구는 특정 WCF(?) 메커니즘에 대한 보고 또는 예외 처리 내에서 일어나는 서비스의 구현입니다.통신 결함해야 정상적인 부분의 데이터를 계약(잘못 계약).

불행하게도,으로"깨끗하게 처리하는 방법에는 그것이 없다"깃발을 설정하는 마술로 그것,당신은 계속해야를 분해 문제를 다루는 모든 결과 조각이다.희망이 이러한 개념과 연결됩니다 다른 사람들이 무엇을 했을 처리할 때 이 문제를 해결합니다.

요약:

  • 귀하의 문제가 능가의 개념을 트랜잭션-->으로 보는 워크플로 보상입니다.

행운을 빕니다-

오류, 오류 코드 및 설명에 의해 영향을받는 객체를 식별하는 맞춤형 오류 객체 모음을 반환하는 것이 좋습니다. 이렇게하면 오류를 사용자에게 더 잘 해결하거나 더 표시 할 수 있습니다.

나는 당신 이이 용어로 생각하고 있다면 당신이 정말로 예외를 제외하고 있다고 생각합니다!

예외를 던지지 않고 실패를 의미하는 값을 반환하는 것은 완벽하게 괜찮습니다. 종종 더 좋습니다. 예외는 추상화 수준에서 복구 할 수없는 경우에 가장 잘 사용되지만, 주요 제어 흐름의 주요 수단으로 사용하지 않으면 프로그램이 읽기가 매우 어려워집니다.

웹 서비스는 예외를 반환하지 않으며 반환 코드 및 메시지를 반환합니다. 나는 반환 된 정보를 제시하는 유용한 표현을 저장하고,보기에 대한 목록이나 그것을보고자하는 모든 것을 반환 할 것입니다.

이상적으로는 웹 서비스에 대한 호출은 다음과 같아야합니다.

List<Person> selectedPeople = ... //fetch list of people
callLotteryNumberWebService(selectedPeople.ToArray );

각 사람에 대한 웹 서비스 호출을하는 것은 비용이 많이 듭니다. 서버 끝에서는 목록을 반복하고 작업을 수행해야합니다. 서버 측 코드는 두 가지 예외를 던질 수 있습니다. BulkOperationFailedException- DB 다운 또는 구성 파일이 누락되어 치명적인 오류가있는 경우. 추가 처리가 불가능합니다. BulkOperationException- 여기에는 사람과 관련된 예외 배열이 포함되어 있습니다. 각 객체를 고유하게 참조하기 위해 일부 ID를 지속 할 수 있습니다. 코드는 다음과 같습니다.

List<Person> selectedPeople = ... // fetch list of people 

try{
    callLotteryNumberWebService(selectedPeople.ToArray);
}catch  (BulkOperationFailedException e) {
    SOP("Some config file missing/db down.No person records processed")
}catch(BulkOperationException e)  {
    UserDefinedExceptions us =  e.getExceptions()
    foreach(exception ein us)   {
        // read unique id to find which person object failed
    }
}

construct msg based on which personobject succeeded and which failed

예외가 발생하지 않을 때는 작동이 성공한 것으로 간주됩니다. 사용자 정의 예외를 사용하는 대신 실패에 대한 사용자 정의 오류 코드를 가질 수 있습니다. 서버 측에서 BulkOperationException을 구성하는 것은 까다 롭습니다. 둘째, 서버 측에서 BulkOperationFailedException 및 BulkOperationException으로 오류를 분류해야합니다. 이것이 제가 내 프로젝트 중 하나에서 처리 한 방식이었습니다.

나는 조사 할 것이다 DTOS 이런 종류의 작업을 위해. DTO는 또한 지속이 성공했는지 여부와 다른 종류의 "메타 데이터"에 대한 정보를 포함 할 수 있습니다.

아마도 유형의 결과 맵을 반환 할 것입니다 Map<Person,Future<String>>getLotteryNumbers<Collection<Person>> 서비스.

그런 다음지도를 반복하고 사용합니다 Future.get() 복권 번호 또는 예외를 얻기 위해.

내 서비스 중 일부에서는 모든 통화를 단일 항목 호출로 구현 한 다음 서비스에 논리를 배치하여 그룹으로 처리하는 것을 좋아합니다. 배치는 a를 사용하여 구현됩니다 LinkedBlockingQueue 그리고 폴링 스레드.

이 시나리오에서 나는 a를 반환한다 Future<Thing> 배치 결과가 CountdownLatch.

실제로 Java 동시성을 살펴보면 이러한 구성 요소가 모두 함께 작동 할 수있는 방법을 확인하십시오. http://jcip.net/

특히 높은 처리량 시스템의 경우 또 다른 방법은 처리 엔티티가 객체에서 작업을 수행하는 큐를 기반으로 한 다음 결과를 기반으로 다른 엔티티의 추가 처리를 위해 객체를 다른 큐에 넣은 다음 큐를 사용하는 것입니다. . 이렇게하면 추가 처리가 필요한 추가 처리로 인해 발생하는 병목 현상이 줄어 듭니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top