ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [에러] broken pipe 에러
    Health-Genie 2023. 12. 20. 09:53
    728x90

    [ 현재 상황 ]

    univcert api 적용중 broken pipe에러 발생에 의한 socket read timeout exception 발생

    broken pipe 에러

     

    [ 에러 이유 ]

    잦은 입출력 호출로 발생한다. 

    두 개의 소켓(sender, receiver )중에서 receiver가 송신 받은 데이터를 처리하지 못하여 sender가 계속 보내는 경우에 발생한다.

     

     

    [ 해결 방법 및 코드 변화 ]

    서버에서는 client 동작에서 발생하는 에러를 막을 수 없기에 exceptionhandler를 통한 해결이 대표적이다

     

    그 외의 방법으로는 중복 요청 막기 , client의 request 후에 server의 response이 올때까지 기다리게 하는 방법들이 있다.

     

     

     

    기존 코드

        @Transactional
        public Map<String, Object> certify(String key, String email, String universityName) throws IOException{
    
            String url = "http://localhost:1234/auth/mail/send";
    
            Request.Builder builder = new Request.Builder().url(url).get();
    
            JSONObject postObj = new JSONObject();
            postObj.put("key", key);
            postObj.put("email", email);
            postObj.put("universityName", universityName);
    
            RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), postObj.toJSONString());
            builder.post(requestBody);
            Request request = builder.build();
    
            Response responseHTML = client.newCall(request).execute();
            
            return parseHTMLToJSON(responseHTML);
        }

     

     

    1차 수정한 코드

     @Transactional
        public Map<String, Object> certify(String key, String email, String universityName) throws IOException{
        
            String url = baseURL + "/v1/certify";
    
            Request.Builder builder = new Request.Builder().url(url).get();
    
            JSONObject postObj = new JSONObject();
            postObj.put("key", key);
            postObj.put("email", email);
            postObj.put("universityName", universityName);
    
            RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), postObj.toJSONString());
            builder.post(requestBody);
            Request request = builder.build();
    
            Response responseHTML = client.newCall(request).execute();
    
            return parseHTMLToJSON(responseHTML);
        }

     

    처음에 문제가 url을 api제공측에서 지정한바를 따라야 하는데, local로 지정해서 생긴 문제였습니다.

    하지만, parsing된걸 보니까 Internal server error가 났습니다.

     

    2차 수정한 코드

    @PostMapping("/send") 
    public JSONObject sendUnivCertMail(@RequestBody MailRequestDto dto) throws IOException {
        boolean univ_check = false;
    	Map<String,Object> check = UnivCert.check(dto.getUnivName());
    
    	if((boolean) check.get("success")) univ_check = true;
    	Map<String, Object> response = UnivCert.certify(KEY, dto.getUniv_email(), dto.getUnivName(), univ_check);
    
    
    	return new JSONObject(response);
    }

     

    1차 수정 코드를 UnivCert인데, 해당 클래스를 import해와서 1차에서 발생했던 server 에러를 해결했다.

     

    [ 참조 ]

    https://superbono-2020.tistory.com/192

Designed by Tistory.