У меня две службы http. Первый находится в сети и может получить запрос SEND_DATA, а затем отправляет данные второму, используя почтовый запрос SAVE_DATA. Я хочу сделать вторую службу, когда она начнет иметь возможность делать запрос SEND_DATA к первому, а затем получать его по запросу SAVE_DATA. Проблема в том, что если я отправляю запрос от второго в autowired, первый получает этот запрос и отправляет его второму, но второй к тому времени не полностью инициализирован и не может получить этот запрос. Какое лучшее решение для этого?

Первый

@GetMapping(value = SEND_DATA)
public ResponseEntity<String> sendData() {
    ...
    postRequest(SAVE_DATA)
    ...
}

Второй

@Autowired
public Second() {
    ...
    getRequest(SEND_DATA)
    ...
}

@PostMapping(value = SAVE_DATA, consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<String> saveData(@RequestBody String value) {
     save(value)
}
0
Anton 14 Сен 2020 в 20:00

2 ответа

Лучший ответ

Если у вас распределенная система, вы не можете полагаться на внутреннюю связь между двумя компонентами (службами). Я предлагаю вам иметь код для проверки доступности перед звонком.

@Service
public class FirstService {

   private AtomicBoolean isSecondServiceOk;

   @Scheduled(fixedDelay = 1_000L)
   void checkingSecondServiceAvailability(){
       ... check response from SecondService if it respond, 
                           isSecondServiceOk.set(true)
   }

   ... check isSecondServiceOk available before calling SecondService

}
1
Chayne P. S. 14 Сен 2020 в 17:34

Используйте @PostConstruct:

@Service
public class MyService {

    @Autowired
    private OtherService otherService;

    @PostConstruct
    private void postConstruct() {
        otherService.doSomething();
    }

Метод, который должен быть недействительным, но может иметь любую видимость, вызывается после инициализации этого bean-компонента, и это, конечно, означает, что введенный bean-компонент также инициализируется.

0
Bohemian 14 Сен 2020 в 17:06