У меня странная ситуация, которую я не понимаю.
У меня есть приложение Spring Boot, использующее RabbitMQ. Он может отправлять и получать сообщения успешно, когда вызывается тестом JUnit. Однако, когда я пытаюсь обработать полученное сообщение (то есть запросить базу данных с полученным ключом), оно просто останавливается.
Вопрос
Как мне остановить процесс?
Когда я ставлю точку отладки, она останавливается, и я вижу, что photoEntity
заполняется из базы данных, но затем она завершается примерно через секунду. Я подозреваю, что процесс JUnit завершается до завершения службы.
Например, я получаю следующий вывод консоли:
Received RabbitMQ msg = 3ade07c3-5f45-4aac-8054-0132bc85880b
about to get: photos... 3ade07c3-5f45-4aac-8054-0132bc85880b
got...
Received RabbitMQ msg = 3ade07c3-5f45-4aac-8054-0132bc85880b
about to get: photos... 3ade07c3-5f45-4aac-8054-0132bc85880b
got...
код
Приемник
@Component
public class RabbitMQReceiver {
@Autowired
private PhotoStatusProcessorService photoStatusProcessorService;
@RabbitListener(queues = "${rabbitmq.queuename}")
public void receive(UUID in) {
System.out.println("Received RabbitMQ msg = " + in);
photoStatusProcessorService.processPhotoForId(in);
}
}
Service
@Component
public class PhotoStatusProcessorService {
@Autowired
private PhotoRepository photoRepository;
public void processPhotoForId(UUID uuid) {
System.out.println("about to get: photos... "+uuid);
PhotoEntity photoEntity = photoRepository.getOne(uuid);
System.out.println("got...");
System.out.println("got: "+photoEntity);
try {
System.out.println("got: "+photoEntity);
photoEntity.setStatus(PhotoStatus.processing);
photoRepository.save(photoEntity);
System.out.println("saved: "+photoEntity);
} catch (Exception e) {
photoEntity.setStatus(PhotoStatus.failed);
photoRepository.save(photoEntity);
}
}
}
Репозиторий
//@Repository
public interface PhotoRepository extends JpaRepository<PhotoEntity, UUID> {
}
Конфигурация RabbitMQ
@Configuration
public class RabbitMQConfig {
...
@Profile("receiver")
@Bean
public RabbitMQReceiver receiver() {
return new RabbitMQReceiver();
}
@Profile("sender")
@Bean
public RabbitMQSender sender() {
return new RabbitMQSender();
}
}
JUnit - тест отправляет сообщения в очередь, затем получатель получает их и пытается обработать каждое сообщение, но на этом он останавливается. Обработка пытается обновить репозиторий, но кажется, что это не завершается. Это похоже на завершение теста до завершения обработки полученных сообщений.
@RunWith(SpringRunner.class)
@SpringBootTest(classes = PhotoProcessorJavaApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles({"sender", "receiver"})
public class PhotoProcessorJavaApplicationTests {
@Test
public void testProcessPhotos() throws Exception {
List<UUID> uuids = getAllUuids();
HttpEntity<List<UUID>> entity = new HttpEntity<List<UUID>>(uuids, headers);
ResponseEntity<String> response = restTemplate.exchange(
createURLWithPort("/photos/process"),
HttpMethod.POST, entity, String.class);
System.out.println(response);
assertEquals(200, response.getStatusCodeValue());
}
Нужно ли что-то добавить в JUnit, например, еще один ActiveProfile
для Сервиса?