백엔드로 웹 서비스 호출을 비동기 적으로 만들고 호출자에게 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() 논리가 맞지 않아 생각합니다.
누구든지이 버그를 지적 할 수 있습니까?
if (tfnList.size()> = index) {= 0;} 절에서 문제가 있다고 생각합니다. 매시간 인덱스가리스트 크기보다 크다고 가정하면 0을 반환합니다. 그래서 cusomters가 no이면 list size는 0입니다. tfnList에 대해 더 설명해 줄 수 있습니다 –
예 고객의 수가 우리가 원하는 목록 크기와 같으면 목록 크기 다음에 오는 고객에게 첫 번째 tfn. 그래서 라운드 로빈에 대해 언급했습니다. –
예. 목록 크기보다 큰 고객이 없을 때 논리가되어야합니다. 시스템은 처음으로 로그 된 사용자를 시간 초과한다고 가정합니다. 고객 11과 TFN 3 만 사용할 수 있다고 가정 할 수도 있습니다. TFN1에 가지 않고 TFN3을 사용할 수 있습니까? 동적 성장 목록을 사용할 수 없습니다. –