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에 따라 라이센스가 부여됩니다.