2016-11-09 3 views
2

백엔드로 웹 서비스 호출을 비동기 적으로 만들고 호출자에게 TFN 목록에서 라운드 로빈으로 수신자 부담 번호를 반환하는 코드를 작성해야합니다. 아래 아이디어는 고객이 캐시에 TFNs 때까지 각이 완료 다른 TFN을 얻을 것입니다 내 코드다중 스레드 환경에서 라운드 로빈 목록에서 값을 반환하는 방법은 무엇입니까?

@Stateless 
public class TollFreeServiceBean { 
    @EJB 
    private AsyncBackendService asyncBean; 
    public long getTollFreeNumber(Request request) { 
     //Validate request 
     asyncBean.callBackend(request); 
     return TFNUtil.getNext(); 
    } 
} 

@Stateless 
public class AsyncBackendService { 
    @Asynchronous 
    public void callBackend(Request request) { 
     // Call web service and inform a caller with `Request` is going to call 
    } 
} 

public class TFNUtil { 
    private static int index = 0; 
    private TFNUtil(){} 
    public static synchronized long getNext() { 
     // Get TFN list from cache 
     if(tfnList.size() >= index) { 
      index = 0; 
     } 
     long tfn = tfnList.get(index); 
     index++; 
     return tfn; 
    } 
} 

입니다. 완료되면 다음 고객이 첫 번째 TFN을 다시 받아야합니다. 예를 들어, 10 명의 TFN과 11 명의 고객이있는 경우 11 번째 고객은 1 차 TFN을 받아야합니다. 12 번째 고객은 2 번째 TFN을 받아야합니다.

백엔드 시스템은 두 명의 서로 다른 고객이 동일한 TFN에 착륙하고 있다고 불평하고 있습니다. 그래서 내 TFNUtil.getNext() 논리가 맞지 않아 생각합니다.

누구든지이 버그를 지적 할 수 있습니까?

+0

if (tfnList.size()> = index) {= 0;} 절에서 문제가 있다고 생각합니다. 매시간 인덱스가리스트 크기보다 크다고 가정하면 0을 반환합니다. 그래서 cusomters가 no이면 list size는 0입니다. tfnList에 대해 더 설명해 줄 수 있습니다 –

+0

예 고객의 수가 우리가 원하는 목록 크기와 같으면 목록 크기 다음에 오는 고객에게 첫 번째 tfn. 그래서 라운드 로빈에 대해 언급했습니다. –

+0

예. 목록 크기보다 큰 고객이 없을 때 논리가되어야합니다. 시스템은 처음으로 로그 된 사용자를 시간 초과한다고 가정합니다. 고객 11과 TFN 3 만 사용할 수 있다고 가정 할 수도 있습니다. TFN1에 가지 않고 TFN3을 사용할 수 있습니까? 동적 성장 목록을 사용할 수 없습니다. –

답변

1

진술 자체가 모순적입니다.

한편으로는 과 동일한 번호를 두 고객이 받아들이지 않을까 걱정됩니다.

한편, 의도적으로 정확히 수행 할 시스템을 제 위치에 두었습니다.

얼마나 많은 요소가 목록에 있는지에 따라 tfnList ... getNext()이 매우 빨리 넘칠 수 있습니다. 그리고 나서 어떻게 될지 생각합니까?

나에게는 실제 솔루션이 더 복잡한 것처럼 들리지만 시스템을 다시 설계해야 할 수도 있습니다. 그 숫자 목록을 회전하는 대신, 얼마 동안 번호를 차단/예약 할 수있는 시스템이 필요할 수도 있습니다. 번호가 예약되어있는 동안에는 다시 전달되지 않습니다.

단순한 버전은 "시간"만을 기반으로합니다. 일부 X 분/시간 후에 예약이 자동으로 "사라집니다"라는 의미입니다. 작동하지 않는 경우; 한 단계 더 나아가 야합니다. 워크 플로에서 무언가/누군가를 찾아서 un 예약 번호로 다시 "사용 가능"하게 만듭니다.

그 이상으로, N 번호를 사용할 수있을 때 어떤 일이 발생해야하는지 완전히 고려하지 않은 것 같지만 N + x 고객이 동시에 들어오는 경우를 고려해야합니다. Round-robin'ing/rotating ... 당신을 도울 수있는 곳은 없습니다! 그 상황이 가능하다면, 당신은 그것을 처리하고 그 다음에 일어날 일을 정의해야합니다!

+0

업데이트가 도움이되지 않습니다. 두 사람에게 똑같은 ** 숫자를 돌려 줄 수있는 방법이 ... 정확히 그 일을한다는 것에 놀란 이유는 분명하지 않습니다. 10 개의 번호가 사용되고 있고 11 번째 고객에게 1을 내면 어떻게 될 것으로 예상합니까?! 또한 최신 업데이트를 확인하십시오! – GhostCat

+0

나는 두 명의 동시 고객이 동일한 TFN을 얻고 있음을 의미했습니다. 이것은 백엔드 시스템이 불평하는 것입니다. 코드를 확인/검토하고 코드가 예상대로 작동하는지 확인하기 만하면됩니다. –

+0

스레드 풀 실행 프로그램을 사용하여 테스트 케이스를 작성하고 TFNutils 클래스를 한 번 테스트하십시오. – Shashank

관련 문제