Тестовое задание на позицию Разработчик Java в компанию Netris.
- build
./gradlew build- run
./gradlew bootRun- tests
./gradlew testОригинал задания в формате .pdf (task.pdf)
Необходимо написать код для получения и агрегации данных из нескольких сервисов.
Получение списка доступных видеокамер: https://run.mocky.io/v3/bc34ce01-90c6-4266-93f1-07591afad12e
Ответ состоит из массива объектов, содержащих поля:
id- число, идентификатор камерыsourceDataUrl- строка, ссылка для получения данных источника.tokenDataUrl- строка, ссылка для получения токенов безопасности по камере.
Формат данных в ответе на запрос на URL из поля sourceDataUrl:
urlType- строка, тип ссылки на видеопоток. Возможные значения:"LIVE","ARCHIVE"videoUrl- строка, ссылка на видеопоток
Формат данных в ответе на запрос на URL из поля tokenDataUrl:
value- строка, токен безопасностиttl- число, время жизни токена
Необходимо сагрегировать данные по каждой камере. Ожидаемый результат:
[
{
"id": 1,
"urlType": "LIVE",
"videoUrl": "rtsp://127.0.0.1/1",
"value": "fa4b588e-249b-11e9-ab14-d663bd873d93",
"ttl": 120
},
{
"id": 3,
"urlType": "ARCHIVE",
"videoUrl": "rtsp://127.0.0.1/3",
"value": "fa4b5d52-249b-11e9-ab14-d663bd873d93",
"ttl": 120
},
{
"id": 20,
"urlType": "LIVE",
"videoUrl": "rtsp://127.0.0.1/20",
"value": "fa4b5f64-249b-11e9-ab14-d663bd873d93",
"ttl": 180
},
{
"id": 2,
"urlType": "ARCHIVE",
"videoUrl": "rtsp://127.0.0.1/2",
"value": "fa4b5b22-249b-11e9-ab14-d663bd873d93",
"ttl": 60
}
]Решение должно быть представлено в виде веб-сервиса. Результат нужно вернуть в ответе на HTTP-запрос к этому сервису.
При написании кода надо учитывать потенциально большие объемы данных, то есть сбор и агрегация должны выполняться в несколько потоков и как можно меньше блокироваться (на операциях I/O или ожидании данных другого запроса)
Решение должно быть опубликовано на гитхабе и подкреплено юнит-тестами.
[
{
"id": 1,
"sourceDataUrl": "https://run.mocky.io/v3/e417b132-12ff-434d-a2c2-f81e6ddc1c6c",
"tokenDataUrl": "https://run.mocky.io/v3/fc0b6f75-b911-4b0a-9a1d-dc2379a6ef1c"
},
{
"id": 3,
"sourceDataUrl": "https://run.mocky.io/v3/64ab5cc8-1f47-4ac5-a621-90d4410f7db7",
"tokenDataUrl": "https://run.mocky.io/v3/1ea436bd-1d3f-423c-9373-19e7d825dcd7"
},
{
"id": 20,
"sourceDataUrl": "https://run.mocky.io/v3/e8eee697-3018-4b2b-8b05-d00ab6b545c2",
"tokenDataUrl": "https://run.mocky.io/v3/e2d29bba-4315-453b-b270-e668b2a67af1"
},
{
"id": 2,
"sourceDataUrl": "https://run.mocky.io/v3/86da6879-1444-4c92-818c-77b55d9c7864",
"tokenDataUrl": "https://run.mocky.io/v3/8b3babb6-c354-4874-a878-68d883c8425d"
}
]{
"urlType": "LIVE",
"videoUrl": "rtsp://127.0.0.1/1"
}{
"value": "fa4b588e-249b-11e9-ab14-d663bd873d93",
"ttl": 120
}Для наглядной демонстрации порядка выполнения исходящих запросов раскомментируйте соответствующую строку в application.properties.