Azure Storage에 pooling하기

Hwan·2023년 2월 16일
0

voicekeeper

목록 보기
7/16

구현할 내용

  • Storage에 파일이 생길 때까지 요청 반복하기 (pooling)
  • 모델이 결과를 내놓을 때까지 기다리고, 받아오기 위함
  • Storage에 (json)파일이 있을 경우 정보를 얻어오기

pooling하는 이유 ::

  • 서버에서 클라이언트를 찾아 정보를 전달하려면 ip 정보를 받아야 함
  • 서버의 ip는 고정적이므로, 클라이언트가 반복적 요청을 하는 쪽을 채택
  • 실제로는 push를 사용한다고 한다.
    여유가 남으면 시도할 예정

5. 로컬 서버와 통신하기
6. Azure 서버와 통신하기
여기에서 덧붙임 + 수정한 코드


FileUploadUtils.java

1. send2Server 코드 수정

public static void send2Server(File file){
	// ...
    // 앞부분은 azure 서버 통신 코드와 동일
    
    client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }
            
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String test = response.body().string();
                Log.d("TEST : ", test);
                new CallFunctionTask().execute();
            }
        });
}

2. CallFunctionTask class 생성

  • FileUploadUtils.java 안에 생성하면 됨
  • storage에게 요청을 보내고, 확인해야 하는데 이때 중간다리로 azure funtion app을 사용하여 HTTP trigger를 잡아냄
private static class CallFunctionTask extends AsyncTask<Void, Void, String> {
        @Override
        protected String doInBackground(Void... voids) {
            try {
                URL url = new URL("통신할 azure funtion app의 URL 주소");
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                connection.setConnectTimeout(5000);
                connection.setReadTimeout(5000);
                connection.connect();

                int responseCode = connection.getResponseCode();
                if (responseCode == 200) {
                    InputStream inputStream = connection.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                    StringBuilder result = new StringBuilder();
                    String line;
                    while ((line = reader.readLine()) != null) {
                        result.append(line);
                    }
                    return result.toString();
                } else {
	                // funtion app에서 해당 파일이 없다는 결과를 내면 (200 응답을 못 받으면)
                    // 5초 뒤에 다시 통신 시도
                    Log.e("Response code", "Response code: " + responseCode);
                    Thread.sleep(5000);
                    return null;
                }
            } catch (Exception e) {
                Log.e("Error message", e.getMessage(), e);
                return null;
            }
        }

3. 받아온 json 파일 정보 저장

  • 2번에서 작성한 CallFunctionTask 내부에 작성
  • App 내부저장소에 "data.json"라는 파일을 만들어 기록(덮어쓰기)
private static class CallFunctionTask extends AsyncTask<Void, Void, String> {
		@Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            Log.d("TEST : ", result);

            if (result == null) {
                // retry
                new CallFunctionTask().execute();
            } else {
            	try {
                    JSONObject resultjson = new JSONObject(result);
                	File filesDir = MyApplication.getAppContext().getFilesDir();
        			File file = new File(filesDir, "data.json");
         			if (file.exists()) {
                      		// 파일이 존재하는 경우
                            FileInputStream inputStream = MyApplication.getAppContext().openFileInput("data.json");
                            byte[] bytes = new byte[inputStream.available()];
                            inputStream.read(bytes);
                            inputStream.close();
                            String jsonString = new String(bytes);
                            JSONArray myJsonArray = new JSONArray(jsonString);

                            myJsonArray.put(resultjson);
                            FileOutputStream outputStream = MyApplication.getAppContext().openFileOutput("data.json", Context.MODE_PRIVATE);
                            outputStream.write(myJsonArray.toString().getBytes());
                            outputStream.close();
                        } else {
                            // 파일이 존재하지 않는 경우
                            JSONArray myJsonArray = new JSONArray();
                            myJsonArray.put(resultjson);
                            FileOutputStream outputStream = MyApplication.getAppContext().openFileOutput("data.json", Context.MODE_PRIVATE);
                            outputStream.write(myJsonArray.toString().getBytes());
                            outputStream.close();
                        }
            	} catch (Exception e) {
                    Log.e("error json", e.getMessage(), e);
                }
            }
        }

0개의 댓글