Ajax 질문 있어요.


jquery-1.8.2.min.js:2 GET http://localhost:8080/api/trmnlInfoColctToFile.do?imei=A2&phoneSerial=testS…=lte&androidVersion=1.1&swVersion=aa_f10_1212&extra=extra1&_=1461227407494 net::ERR_CONNECTION_RESET

에러는 위랑 같습니다.

제가 브라우저 단에서 반복문 안에 ajax로 비동기 통신 1000번 수행합니다. 서버를 키고 처음 천번 돌리면 수행안된 5번의 request 상태는 pending 됩니다. 두번째 부터는 1000번 요청 수행 다 되고요.

현재 고객이 보내는 데이터를 파일로 저장 중이라 5개 요청까지도 다 받아야 하거든요.

이건 어디 문제인가요? 톰캣 문제인가요? 아니면 ajax 문제인가요.

브라우저단 코드 입니다

<script type="text/javascript">
var i=0;

function testfunction(){
    var testid = $("#Bid").val();
    if(testid==""){
        alert("아이디 입력 해주세요.");
        return;
    }
    //http://localhost:8080/api/trmnlInfoColctToFile.do?imei=testIMEI3&phoneSerial=testSerial1&phoneModel=testModel1&phoneUptime=1:1:1&lineNumber=01000010001&pttNumber=1|123*456&networkName=lg&networkType=lte&androidVersion=1.1&swVersion=aa_f10_1212&extra=extra1
    var i=0;

    while(i!=1000){
        var myurl = "http://localhost:8080/api/trmnlInfoColctToFile.do?imei="+testid+i+"&phoneSerial=testSerial1&phoneModel=testModel1&phoneUptime=1:1:1&lineNumber=01000010001&pttNumber=1|123*456&networkName=lg&networkType=lte&androidVersion=1.1&swVersion=aa_f10_1212&extra=extra1";

        $.ajax({
               type: 'GET',
               url: myurl,
               cache: false,
               success: function(data) {
                    console.log("성공"+data);
               },
               error: function(xhr) {
                   console.log("Error: " + xhr.statusText);
               }
        });
        i++;
    }
    console.log("종료");
}
</script>

비즈니스 단 코드 입니다.

public synchronized  void trmnlInfoColctToFile(){
    try{
        if(check==false){
            wait();
            check=true;
        }
        check = false;
        System.out.println("수행"+ exc++);
        String Time = new SimpleDateFormat("yyyyMMddHHmmss").format(Calendar.getInstance().getTime());
        StringBuffer sb = new StringBuffer();

        sb.append(((TrmnlinfoColctVo)vo).getImei() == null ? "" : ((TrmnlinfoColctVo)vo).getImei());
        sb.append(",").append(((TrmnlinfoColctVo)vo).getPhoneSerial() == null ? "" : ((TrmnlinfoColctVo)vo).getPhoneSerial());
        sb.append(",").append(((TrmnlinfoColctVo)vo).getPhoneModel() == null ? "" : ((TrmnlinfoColctVo)vo).getPhoneModel());
        sb.append(",").append(((TrmnlinfoColctVo)vo).getPhoneUptime() == null ? "" : ((TrmnlinfoColctVo)vo).getPhoneUptime());
        sb.append(",").append(((TrmnlinfoColctVo)vo).getLineNumber() == null ? "" : ((TrmnlinfoColctVo)vo).getLineNumber());
        sb.append(",").append(((TrmnlinfoColctVo)vo).getPttNumber() == null ? "" : ((TrmnlinfoColctVo)vo).getPttNumber());
        sb.append(",").append(((TrmnlinfoColctVo)vo).getNetworkName() == null ? "" : ((TrmnlinfoColctVo)vo).getNetworkName());
        sb.append(",").append(((TrmnlinfoColctVo)vo).getNetworkType() == null ? "" : ((TrmnlinfoColctVo)vo).getNetworkType());
        sb.append(",").append(((TrmnlinfoColctVo)vo).getAndroidVersion() == null ? "" : ((TrmnlinfoColctVo)vo).getAndroidVersion());
        sb.append(",").append(((TrmnlinfoColctVo)vo).getSwVersion() == null ? "" : ((TrmnlinfoColctVo)vo).getSwVersion());
        sb.append(",").append(((TrmnlinfoColctVo)vo).getExtra() == null ? "" : ((TrmnlinfoColctVo)vo).getExtra());

        String fileName = Time.substring(0, 10)+".req";
        File AbsolPath = new File(fileName);
        String Mypath = AbsolPath.getAbsolutePath();
        Mypath = Mypath.substring(0,Mypath.lastIndexOf("\\")); // 이클립스 폴더로
        Mypath = Mypath.substring(0,Mypath.lastIndexOf("\\")); // tools 폴더로
        Mypath = Mypath.substring(0,Mypath.lastIndexOf("\\")); // 프로젝트 폴더로
        Mypath = Mypath+"\\workspace\\KtpOta\\WebContent\\data\\ing";
        //통신 테스트
        File testPath = new File(Mypath+"\\"+((TrmnlinfoColctVo)vo).getImei());
        FileWriter tfw = null;
        tfw = new FileWriter(testPath, true);
        tfw.write(sb.toString()+"\n");
        tfw.close();

        File myPath = new File(Mypath);
        //디렉토리 없을 경우 생성
        if(!myPath.exists()){
            myPath.mkdirs(); 
        }
        File myFilePath = new File(Mypath+"\\"+fileName);

        FileWriter fw = null;
        if(myFilePath.isFile()){
            fw = new FileWriter(myFilePath, true);
            fw.write(sb.toString()+"\n");
            fw.flush();
            fw.close();
        }else{
            fw = new FileWriter(myFilePath, false);
            fw.write(sb.toString()+"\n");
            fw.flush();
            fw.close();
        }

        if(check==false){
            check = true;
            notify();
        }
    }catch(Exception e){
        System.out.println("처리실패"+e);
    }
}
  • 2016년 04월 21일에 작성됨

  • ajax가 반복문 안에 있는 데 3번 반복이상수터 pending 상태가 나타나네요.. 왜 이럴까요. 반복문이 끝나고 ajax마저 끝나버리나요?    김은찬   2016.4.21 17:45     
  • 서버에 반복적으로 요청하는 것보다 묶어서 한번에 요청하는게 좋을 텐데요?    허대영(Daeyoung Heo)   2016.4.21 20:41     
조회수 278


2 답변


AJAX에서 동기화 옵션을 사용해도 그런가요??

  • 2016년 04월 22일에 작성됨

  • 동기화 옵션을 달고하면 성능 테스트에 의미가 없어서 일부러 넣지 않았습니다.    김은찬   2016.4.22 11:51     

직관적으로 결론을 내렸습니다. OS의 IO가 파일을 열고 기록한 다음 저장하고 닫는 속도가 Java의 JVM 속도 보다 느려서 파일이 닫히지 않는 상태에서 또 열어서 재대로 처리 안 되었다고 추측했습니다. 대처방안으로 요청당 밀리세컨드+사용자고유ID로 파일을 만들어 백업하였습니다.


로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close