SpringBoot 는 다 중 스 레 드 를 사용 하여 RESTful 서비스의 성능 을 향상 시킨다.
                                            
 5193 단어  SpringBoot공부 하 다.
                    
@RunWith(SpringRunner.class)
@SpringBootTest
public class AsyncControllerTest {
    @Autowired
    private WebApplicationContext wac;
    private MockMvc mockMvc;
    @Before
    public void setUp() throws Exception {
        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
    }
    @Test
    public void order() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/order").contentType(MediaType.APPLICATION_JSON_UTF8))
                .andExpect(MockMvcResultMatchers.status().isOk());
    }
}
@RestController
@RequestMapping("/order")
@Slf4j
public class AsyncController {
    @GetMapping
    public String order() throws InterruptedException {
        log.info("     ");
        Thread.sleep(1000);
        log.info("     ");
        return "success";
    }
}
@GetMapping
public Callable order() throws InterruptedException {
    log.info("     ");
    Callable result = new Callable() {
        @Override
        public String call() throws Exception {
            log.info("     ");
            Thread.sleep(1000);
            log.info("     ");
            return  "success";
        }
    };
    log.info("     ");
    return result;
}
   3.Deferred Result 로 비동기 요청 처리
Deferred Result 를 사용 하여 비동기 요청 을 처리 하려 는 이 유 는 Runnable 방식 으로 모든 요 구 를 완전히 처리 할 수 없 기 때 문 입 니 다.
Runnable 방식 으로 비동기 처 리 를 할 때 부 스 레 드 는 주 스 레 드 에서 조정 되 어야 합 니 다.
실제 업무 장면 에서 수 요 를 만족 시 킬 수 없다.
@Component
public class MockQueue {
    /**
     *     
     */
    private String placeOrder;
    /**
     *        
     */
    private String completeOrder;
    public String getPlaceOrder() {
        return placeOrder;
    }
    public void setPlaceOrder(String placeOrder)  {
		
        new Thread(() -> {
            log.info("      , " + placeOrder);
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }
            this.completeOrder = placeOrder;
            log.info("        ," + placeOrder);
        }).start();
    }
    public String getCompleteOrder() {
        return completeOrder;
    }
    public void setCompleteOrder(String completeOrder) {
        this.completeOrder = completeOrder;
    }
}
@Component
@Getter
@Setter
public class DeferredResultHolder {
    private Map> map = new HashMap>();
}
  @Slf4j
@Component
public class QueueListener implements ApplicationListener {
    @Autowired
    private MockQueue mockQueue;
    @Autowired
    private DeferredResultHolder deferredResultHolder;
    /**
     *   Spring  
     * @param contextRefreshedEvent
     */
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        new Thread(()->{
            while (true) {
                if (StringUtils.isNotBlank(mockQueue.getCompleteOrder())) {
                    String orderNumber = mockQueue.getCompleteOrder();
                    log.info("        :"+orderNumber);
                    deferredResultHolder.getMap().get(orderNumber).setResult("place order success");
                    mockQueue.setCompleteOrder(null);
                }else{
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}
 보충 하 다
WebMvcConfigurerAdapter 클래스 를 계승 한 설정 클래스 에 비동기 차단 기 를 등록 할 수 있 습 니 다.다음 과 같 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Java・SpringBoot・Thymeleaf】 에러 메세지를 구현(SpringBoot 어플리케이션 실천편 3)로그인하여 사용자 목록을 표시하는 응용 프로그램을 만들고, Spring에서의 개발에 대해 공부하겠습니다 🌟 마지막 데이터 바인딩에 계속 바인딩 실패 시 오류 메시지를 구현합니다. 마지막 기사🌟 src/main/res...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.