add Completable future

parent ecce843f
......@@ -5,25 +5,8 @@
</component>
<component name="ChangeListManager">
<list default="true" id="bd185af2-024c-4245-af2c-5893b8b011d9" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/src/main/java/com/example/student/mapper/StudentMapper.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../teacher-service/teacher-service/src/main/java/com/example/teacher/dto/ErrorDto.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../teacher-service/teacher-service/src/main/java/com/example/teacher/dto/TeacherDto.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../teacher-service/teacher-service/src/main/java/com/example/teacher/mapper/TeacherMapper.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/example/student/controller/StudentController.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/example/student/controller/StudentController.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/example/student/dto/StudentDto.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/example/student/dto/StudentDto.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/example/student/dto/TeacherDto.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/example/student/dto/TeacherDto.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/example/student/feign/FeignFallBack.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/example/student/feign/FeignFallBack.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/example/student/responseobject/StudentTeacherResponseVO.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/example/student/responseobject/StudentTeacherResponseVO.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/example/student/service/StudentService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/example/student/service/StudentService.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/example/student/controller/StudentController.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/example/student/controller/StudentController.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/example/student/dto/StudentDto.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/example/student/dto/StudentDto.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/example/student/dto/TeacherDto.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/example/student/dto/TeacherDto.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/example/student/feign/FeignFallBack.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/example/student/feign/FeignFallBack.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/example/student/responseobject/StudentTeacherResponseVO.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/example/student/responseobject/StudentTeacherResponseVO.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/example/student/service/StudentService.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/example/student/service/StudentService.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../../teacher-service/teacher-service/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/../../teacher-service/teacher-service/pom.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../../teacher-service/teacher-service/src/main/java/com/example/teacher/TeacherServiceApplication.java" beforeDir="false" afterPath="$PROJECT_DIR$/../../teacher-service/teacher-service/src/main/java/com/example/teacher/TeacherServiceApplication.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../../teacher-service/teacher-service/src/main/java/com/example/teacher/controller/TeacherController.java" beforeDir="false" afterPath="$PROJECT_DIR$/../../teacher-service/teacher-service/src/main/java/com/example/teacher/controller/TeacherController.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../../teacher-service/teacher-service/src/main/java/com/example/teacher/service/TeacherService.java" beforeDir="false" afterPath="$PROJECT_DIR$/../../teacher-service/teacher-service/src/main/java/com/example/teacher/service/TeacherService.java" afterDir="false" />
</list>
......
......@@ -2,8 +2,10 @@ package com.example.teacher;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication
@EnableAsync
public class TeacherServiceApplication {
public static void main(String[] args) {
......
......@@ -9,8 +9,12 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors;
@RestController
@RequestMapping("/teachers")
......@@ -27,11 +31,57 @@ public class TeacherController {
}
// GET methods
@GetMapping("/{id}")
public ResponseEntity<Optional<Teacher>> findStudentById(@PathVariable int id) {
Optional<Teacher> myStudent = teacherService.findTeacherById(id);
if (myStudent.isPresent()) {
return new ResponseEntity<Optional<Teacher>>(myStudent, HttpStatus.FOUND);
@GetMapping("/id-array")
public ResponseEntity<List<Teacher>> findTeacherById(@RequestParam int[] id) throws InterruptedException {
List<Teacher> teacherList = new ArrayList<>();
for (int x: id) {
Optional<Teacher> myTeacher = teacherService.findTeacherById(x);
myTeacher.ifPresent(teacherList::add);
}
if (teacherList.size() > 0) {
return new ResponseEntity<List<Teacher>>(teacherList, HttpStatus.FOUND);
}
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
// // Test 1
// @GetMapping("/id-array-async")
// public ResponseEntity<List<Teacher>> findTeacherByIdAsync(@RequestParam int[] id) throws ExecutionException, InterruptedException {
// List<Teacher> teacherList = new ArrayList<>();
// List<CompletableFuture<Optional<Teacher>>> completableFutureList = new ArrayList<>();
// for (int x: id) {
// CompletableFuture<Optional<Teacher>> myCompletableTeacher = teacherService.findTeacherByIdAsync(x);
// completableFutureList.add(myCompletableTeacher);
// }
//// completableFutureList.forEach(CompletableFuture::join);
// for (CompletableFuture<Optional<Teacher>> x: completableFutureList
// ) {
// Optional<Teacher> myOptionalTeacher = x.get();
// myOptionalTeacher.ifPresent(teacherList::add);
// }
// if (teacherList.size() > 0) {
// return new ResponseEntity<List<Teacher>>(teacherList, HttpStatus.FOUND);
// }
// return new ResponseEntity<>(HttpStatus.NOT_FOUND);
// }
// Test 2
@GetMapping("/id-array-async")
public ResponseEntity<List<Teacher>> findTeacherByIdAsync(@RequestParam int[] id) throws ExecutionException, InterruptedException {
List<Teacher> teacherList = new ArrayList<>();
List<CompletableFuture<Optional<Teacher>>> completableFutureList = new ArrayList<>();
for (int x: id) {
CompletableFuture<Optional<Teacher>> myCompletableTeacher = teacherService.findTeacherByIdAsync(x);
completableFutureList.add(myCompletableTeacher);
}
for (CompletableFuture<Optional<Teacher>> x: completableFutureList
) {
Optional<Teacher> teacherOptional = x.join();
teacherOptional.ifPresent(teacherList::add);
}
if (teacherList.size() > 0) {
return new ResponseEntity<List<Teacher>>(teacherList, HttpStatus.FOUND);
}
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
......
......@@ -5,14 +5,18 @@ import com.example.teacher.dto.TeacherDto;
import com.example.teacher.mapper.TeacherMapper;
import com.example.teacher.model.Teacher;
import com.example.teacher.repository.TeacherRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.*;
import java.util.stream.Collectors;
@Slf4j
@Service
public class TeacherService {
......@@ -22,6 +26,8 @@ public class TeacherService {
@Autowired
private TeacherMapper mapper;
// Create A ThreadPool
ExecutorService service = Executors.newFixedThreadPool(10);
public Teacher createAndUpdateTeacher(Teacher teacher) {
teacher.setActive(true);
return teacherRepository.save(teacher);
......@@ -35,13 +41,29 @@ public class TeacherService {
.collect(Collectors.toList());
}
public Optional<Teacher> findTeacherById(int id) {
if (teacherRepository.findTeacherById(id).isActive()){
return teacherRepository.findById(id);
// GET Teacher By ID Synchronously
public Optional<Teacher> findTeacherById(int id) throws InterruptedException {
Thread.sleep(500);
log.info("GET Teacher of id " + id + " by Thread " + Thread.currentThread().getName());
Optional<Teacher> myTeacher = teacherRepository.findById(id);
if (myTeacher.isPresent() && myTeacher.get().isActive()){
return myTeacher;
}
return Optional.empty();
}
// GET Teacher By ID Asynchronously
@Async
public CompletableFuture<Optional<Teacher>> findTeacherByIdAsync(int id) throws InterruptedException {
Thread.sleep(500);
log.info("GET Teacher of id " + id + " by Thread " + Thread.currentThread().getName());
Optional<Teacher> myTeacher = teacherRepository.findById(id);
if (myTeacher.isPresent() && myTeacher.get().isActive()){
return CompletableFuture.completedFuture(myTeacher);
}
return CompletableFuture.completedFuture(Optional.empty());
}
public TeacherDto findTeacherByName(String name) {
Teacher teacher = teacherRepository.findTeacherByName(name);
if (teacher == null) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment