A simple spring project that shows the job's execution order.
Scheduling Job
Dado um array de "jobs" para execução, no qual cada posição possui um objeto com os
seguintes atributos:
1) ID: Identificação do Job;
2) Descrição: Descrição do Job;
3) Data Máxima de conclusão do Job: Data máxima em que o Job deve ser concluído;
4) Tempo estimado: Tempo estimado de execução do Job.
Criar algoritmo que retorne um conjunto de arrays com as seguintes características:
1) Cada array do conjunto representa uma lista de Jobs a serem executados em sequência;
2) Cada array deve conter jobs que sejam executados em, no máximo, 8h;
3) Deve ser respeitada a data máxima de conclusão do Job;
4) Todos os Jobs devem ser executados dentro da janela de execução (data início e fim).
Exemplo de Massa de dados:
Janela de execução: 2019-11-10 09:00:00 até 2019-11-11 12:00:00
[
{
"ID": 1,
"Descrição": "Importação de arquivos de fundos",
"Data Máxima de conclusão": 2019-11-10 12:00:00,
"Tempo estimado": 2 horas,
},
{
"ID": 2,
"Descrição": "Importação de dados da Base Legada",
"Data Máxima de conclusão": 2019-11-11 12:00:00,
"Tempo estimado": 4 horas,
},
{
"ID": 3,
"Descrição": "Importação de dados de integração",
"Data Máxima de conclusão": 2019-11-11 08:00:00,
"Tempo estimado": 6 horas,
},
]
Output esperado
[
[1, 3],
[2]
]
- OpenJDK 11
- Spring 2.3.1.RELEASE
- Spring boot
- Docker
- Lombok
- Swagger 2 for API documentation
- jUnit 5 for unit tests
- JaCoCo for tests reports
- Travis for CI and build status
- codecov.io for Code coverage
- codeclimatefor code maintainability
- OpenJDK 11
- Maven 3.6.1
- Docker (Optional)
git clone https://github.com/erickmob/scheduling-job.git
Enter on the root folder
cd scheduling-job/
To run the application with maven:
mvn spring-boot:run
To run the application with docker:
docker-compose build
docker-compose up web
API documentation on:
Swagger on localhost Swagger on Heroku
You can see the covegare test on:
target/site/jacoco/index.html
You can run basic test in three ways:
To run all tests:
mvn test
- Go to Swagger on localhost or Swagger on Heroku
- Click on "SequenceJob", "/sequenceJobs" and then 'Try it out' button.
- Replace the body with the following:
{
"fimJanelaDeExecucao": "2019-11-11T12:00:00.483Z",
"inicioJanelaDeExecucao": "2019-11-10T09:00:00.483Z",
"jobList": [
{
"dataMaximaDeConclusao": "2019-11-10T12:00:00.483Z",
"descricao": "Importação de arquivos de fundos",
"id": 1,
"tempoEstimado": 2
},
{
"dataMaximaDeConclusao": "2019-11-11T12:00:00.483Z",
"descricao": "Importação de dados da Base Legada",
"id": 2,
"tempoEstimado": 4
},
{
"dataMaximaDeConclusao": "2019-11-11T08:00:00.483Z",
"descricao": "Importação de dados de integração",
"id": 3,
"tempoEstimado": 6
}
]
}
- Click on "Execute" button
You should see bellow on "Responses" section, the response body like this:
[
[
1,
3
],
[
2
]
]
Simply run on cli:
LocalHost:
curl -X POST "http://localhost:8080/sequenceJobs" -H "accept: */*" -H "Content-Type: application/json" -d "{ \"fimJanelaDeExecucao\": \"2019-11-11T12:00:00.483Z\", \"inicioJanelaDeExecucao\": \"2019-11-10T09:00:00.483Z\", \"jobList\": [ { \"dataMaximaDeConclusao\": \"2019-11-10T12:00:00.483Z\", \"descricao\": \"Importação de arquivos de fundos\", \"id\": 1, \"tempoEstimado\": 2 }, { \"dataMaximaDeConclusao\": \"2019-11-11T12:00:00.483Z\", \"descricao\": \"Importação de dados da Base Legada\", \"id\": 2, \"tempoEstimado\": 4 }, { \"dataMaximaDeConclusao\": \"2019-11-11T08:00:00.483Z\", \"descricao\": \"Importação de dados de integração\", \"id\": 3, \"tempoEstimado\": 6 } ]}"
Or Heroku:
curl -X POST "https://scheduling-job-777.herokuapp.com/sequenceJobs" -H "accept: */*" -H "Content-Type: application/json" -d "{ \"fimJanelaDeExecucao\": \"2019-11-11T12:00:00.483Z\", \"inicioJanelaDeExecucao\": \"2019-11-10T09:00:00.483Z\", \"jobList\": [ { \"dataMaximaDeConclusao\": \"2019-11-10T12:00:00.483Z\", \"descricao\": \"Importação de arquivos de fundos\", \"id\": 1, \"tempoEstimado\": 2 }, { \"dataMaximaDeConclusao\": \"2019-11-11T12:00:00.483Z\", \"descricao\": \"Importação de dados da Base Legada\", \"id\": 2, \"tempoEstimado\": 4 }, { \"dataMaximaDeConclusao\": \"2019-11-11T08:00:00.483Z\", \"descricao\": \"Importação de dados de integração\", \"id\": 3, \"tempoEstimado\": 6 } ]}"
And see the output response:
[
[
1,
3
],
[
2
]
]
Erick de Miranda Oliveira (@erickmob)