'자바(Spring)'에 해당되는 글 3건

출처 : http://wonwoo.ml/index.php/post/903

 

nodejs에서 비동기 개발 경험 있는데

webflux를 쓰지 않고 비동기를 사용해야 될일이 생겼다.

 

부하가 아주 많은 서비스중인 대상이 외부 API 인터페이스 통신하는데

10건중 2건 정도 간혈적으로 오류가 뜬다

그래서 response 가 없으면 한번 더 요청하는 로직을 추가 해도 이모양이다.

 

그래서 자바에 비동기를 부분적으로 사용할수 있다는걸 듣고

적용 하였다.

 

소스

 package com.mattjtodd.asyncresttemplateexample;

import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
import org.apache.http.impl.nio.client.HttpAsyncClients;
import org.apache.http.impl.nio.reactor.IOReactorConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.HttpComponentsAsyncClientHttpRequestFactory;
import org.springframework.util.concurrent.ListenableFuture;
import org.springframework.web.client.AsyncRestTemplate;

import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;

@SpringBootApplication
public class AsyncRestTemplateExampleApplication {
 static AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate();
  
 
    public static void main(String[] args) throws InterruptedException, ExecutionException {
     asyncRestTemplateTest();
    }
   
   
    public static void asyncRestTemplateTest() throws InterruptedException, ExecutionException {
        ListenableFuture<ResponseEntity<Map>> entity = asyncRestTemplate.getForEntity("https://api.exchangeratesapi.io/latest?base=USD", Map.class);
        entity.addCallback(result -> {
            System.out.println(result.getStatusCode());
            System.out.println("body:          "+ result.getBody().toString());
        }, ex -> System.out.println(ex.getStackTrace()));

        System.out.println("asyncRestTemplateTest:             "+ Map.class);
        TimeUnit.SECONDS.sleep(8);
    }  
}

 

 

결과

16:58:20.514 [main] DEBUG org.springframework.web.client.AsyncRestTemplate - Created asynchronous GET request for "https://api.exchangeratesapi.io/latest?base=USD"
16:58:20.527 [main] DEBUG org.springframework.web.client.RestTemplate - Setting request Accept header to [application/json, application/*+json]
asyncRestTemplateTest:             interface java.util.Map
16:58:21.123 [SimpleAsyncTaskExecutor-1] DEBUG org.springframework.web.client.AsyncRestTemplate - Async GET request for "https://api.exchangeratesapi.io/latest?base=USD" resulted in 200 (OK)
16:58:21.124 [SimpleAsyncTaskExecutor-1] DEBUG org.springframework.web.client.RestTemplate - Reading [interface java.util.Map] as "application/json" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@732136b8]
200
body:          {rates={CAD=1.2775883576, HKD=7.7520997921, ISK=128.6486486486, PHP=48.1022869023, DKK=6.1841995842, HUF=297.9875259875, CZK=21.4045738046, GBP=0.7304199584, RON=4.0538877339, SEK=8.4114760915, IDR=14034.3534303534, INR=72.9513513514, BRL=5.4016632017, RUB=74.3491891892, HRK=6.2854885655, JPY=105.5883575884, THB=30.0191268191, CHF=0.9016216216, EUR=0.8316008316, MYR=4.0655301455, BGN=1.6264449064, TRY=7.0942203742, CNY=6.4547193347, NOK=8.5426195426, NZD=1.3920997921, ZAR=14.943950104, USD=1.0, MXN=20.2120582121, SGD=1.3361330561, AUD=1.305031185, ILS=3.2837422037, KRW=1120.8066528067, PLN=3.7275675676}, base=USD, date=2021-02-08}
 

 

'자바(Spring)' 카테고리의 다른 글

ajax 통신  (0) 2020.09.06
JSON 파일 파싱 스프링 java VO저장  (0) 2020.08.29
블로그 이미지

iesay

,

ajax 통신

자바(Spring) 2020. 9. 6. 16:58
A라는 서비스에서 스크래핑해서

JSON 파일 저장후 

C라는 레포팅 서비스로 JSON파일 경로를 던저주는걸 개발중이다.

nodejs면 비동기로 때리면 끝나는데
스프링이니  ajax에 대한 결과를 alert이나 console.log밖에 안들어 온다

파일다 저장한 뒤에 페이지를 호출 해야된다.
 



JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

newFile zzzzzzzzzzz




<form id="add-form" action="" method="post">

<input id="input-submit" type="submit" value="보내기" />


 </form>


<script>

$("#add-form").submit( function(event){

   

         $.ajax({

        type: "GET", 

        url:"/insert.do",

        dataType:"text", 

        success : function(result){

        alert(result);

        location.href = "http://localhost?result=" +result;   

        },

        error : function(a, b, c){

        alert(a + b + c);

        }

})

});

</script>



</body>

</html>



컨트롤러 


/*

 * Copyright 2008-2009 the original author or authors.

 *

 * Licensed under the Apache License, Version 2.0 (the "License");

 * you may not use this file except in compliance with the License.

 * You may obtain a copy of the License at

 *

 *      http://www.apache.org/licenses/LICENSE-2.0

 *

 * Unless required by applicable law or agreed to in writing, software

 * distributed under the License is distributed on an "AS IS" BASIS,

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

 * See the License for the specific language governing permissions and

 * limitations under the License.

 */

package egovframework.example.sample.web;


import java.io.FileReader;

import java.util.HashMap;

import java.util.List;

import java.util.Map;


import egovframework.example.sample.service.EgovSampleService;

import egovframework.example.sample.service.LombokVO;

import egovframework.example.sample.service.SampleDefaultVO;

import egovframework.example.sample.service.SampleVO;


import egovframework.rte.fdl.property.EgovPropertyService;

import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;


import javax.annotation.Resource;


import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.ui.ModelMap;

import org.springframework.validation.BindingResult;

import org.springframework.web.bind.annotation.ModelAttribute;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.bind.support.SessionStatus;

import org.springmodules.validation.commons.DefaultBeanValidator;

import org.json.simple.JSONArray;

import org.json.simple.JSONObject;

import org.json.simple.parser.JSONParser;

import org.json.simple.parser.ParseException;



@Controller

public class EgovSampleController {

@RequestMapping(value = "/jsonList.do")

public String jsonList(SampleVO sampleVO) throws Exception {


System.out.println("jsonList : " );

return "sample/NewFile";

}


@ResponseBody

@RequestMapping("/insert.do")

public String insert() {

System.out.println("insert");

return "aaaaaaaaaaaaaaaaaaaa";

}

}



바쁘니간 우선 돌아가게 만들어 놓고

나중에 코드 보수 좀 해야곘다.



'자바(Spring)' 카테고리의 다른 글

AsyncRestTemplate Spring boot 비동기  (0) 2021.02.09
JSON 파일 파싱 스프링 java VO저장  (0) 2020.08.29
블로그 이미지

iesay

,

 

개발환경 : egov3.9

 이디러리움 샘플을 가지고 왔다.

nodejs는 자바스크립트 기반이니   json파싱은 일도 아닌데 ㅎㅎㅎ

스프링에서는 경험이 적다보니 시간이 좀 걸렸다

 

공유겸 정리해 놓을려구 한다.

 

해당 트렌젝션의 result값을 VO에 집어 넣고

출력하는 부분을 만들 예정이다.

 

 

ethscan.json 이더리움 송금 트랜젝션

 {
 "status":"1",
 "message":"OK",
 "result":[
  {
   "blockNumber":"4473164",
   "timeStamp":"1542787987",
   "hash":"0xac86d44f53a22e4b12853f5f8234f95b831e1521694c4072fd6a97b219ec3cb7",
   "nonce":"17012682",
   "data": {
    "blockHash":"0x4ee9b9d29f78f7aab230613f8827e9e070d5b60b2cd06d61e83b17aaaa5b1e67",
    "transactionIndex":"54",
    "from":"0x81b7e08f65bdf5648606c89998a9cc8164397647",
    "to":"0xff0797d06e8f9897b1d5066c10d9497ed7054a47"
   },
   "Price": [
    {
     "value":"1000000000000000000",
     "gas":"21000",
     "gasPrice":"1000000000"
    },
    {
     "value":"1000000000000000000",
     "gas":"21000",
     "gasPrice":"1000000000"
    },
    {
     "value":"1000000000000000000",
     "gas":"21000",
     "gasPrice":"1000000000"
    }
   ]
  }
 ]
}

 

 

Json 파싱은 이상한거 쓰지말고 org.json.simple 쓰는게 가장 좋다

pom.xml에 추가 하고

<dependency>
            <groupId>com.googlecode.json-simple</groupId>
            <artifactId>json-simple</artifactId>
            <version>1.1.1</version>
 </dependency>

 

 

 

VO

package egovframework.example.sample.service;

import java.util.List;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;


@Getter
@Setter
@ToString
public class LombokVO {
 


    private String blockNumber;
    private String timeStamp;
    private String hash;
    private String nonce;
    private String blockHash;
    private String transactionIndex;
    private String from;
    private String to;

   
    public Data data;
    class Data{
     private String blockHash;
     private String transactionIndex;
     private String from;
     private String to;
    }
    
    
    public List<Price> Price;
    
    class Price{
     private String value;
     private String gas;
     private String gasPrice;
    }  
}


 

 

 

컨트롤러

package egovframework.example.sample.web;

import java.io.FileReader;
import java.util.List;

import egovframework.example.sample.service.EgovSampleService;
import egovframework.example.sample.service.LombokVO;
import egovframework.example.sample.service.SampleDefaultVO;
import egovframework.example.sample.service.SampleVO;

import egovframework.rte.fdl.property.EgovPropertyService;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;
import org.springmodules.validation.commons.DefaultBeanValidator;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;


@Controller
public class EgovSampleController {
 
 
 @RequestMapping(value = "/jsonList.do")
 public String jsonList(SampleVO sampleVO) throws Exception { 
 Object jsonVO = new LombokVO();
 
   
    JSONParser jsonParser = new JSONParser();
    JSONObject jsonObject = (JSONObject) jsonParser.parse(new FileReader("C:\\work-space\\json-test\\jsonsample\\ethscan.json"));

 
    jsonVO =jsonObject.get("result");
   
   
   
 //System.out.println("");
 System.out.println("jsonList : " + jsonVO);
 
 return null;  
 } 

}

 

배열 형식일때는 Array로 VO클래스를 만들고

Object 형식일때는 List로 VO로 만들면 된다.

 

그 뒤로는 알아서 잘 밖힌다.

접근 할때는 일반 클래스 처럼 . 사용하여 접근하면 된다. 

 

 

'자바(Spring)' 카테고리의 다른 글

AsyncRestTemplate Spring boot 비동기  (0) 2021.02.09
ajax 통신  (0) 2020.09.06
블로그 이미지

iesay

,