Skip to content

erickmob/scheduling-job

Repository files navigation

Scheduling Job Application

Build Status codecov Maintainability

A simple spring project that shows the job's execution order.

Temporaly deployed on Heroku

Heroku's Application Page

*may take a little longer one first request because heroku put it to sleep sometimes.

The problem

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]
]

Build With

Prerequisites to run it

- OpenJDK 11
- Maven 3.6.1
- Docker (Optional)

Build and Run

Clone this repo

git clone https://github.com/erickmob/scheduling-job.git

Enter on the root folder

cd scheduling-job/

With Maven

To run the application with maven:

mvn spring-boot:run

Or With Docker

To run the application with docker:

docker-compose build
docker-compose up web

Swagger API UI

API documentation on:

Swagger on localhost Swagger on Heroku

Tests

JaCoCo Coverage

You can see the covegare test on:

target/site/jacoco/index.html

You can run basic test in three ways:

Maven

To run all tests:

mvn test

Swagger

{
  "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
  ]
]

Curl

Simply run on cli:

LocalHost:

curl -X POST "https://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
  ]
]

Author

Erick de Miranda Oliveira (@erickmob)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published