Монго реактивное сохранение: запись не сохраняется / обновляется при каждом repo.save (), появляется только после завершения процесса - PullRequest
0 голосов
/ 02 июня 2019

Я работаю над проблемой рюкзака и пытаюсь решить ее с помощью пружинного реактива с mongo db.Идея состоит в том, что когда я получил входные данные о проблеме ранца от пользователя, я установил статус задачи на «ОТПРАВЛЕНО», а затем вернул ответ пользователю и начал параллельно работать над решением, чтобы найти решение этой проблемы ранца.Во время этого процесса состояние задачи / задачи будет изменено с отправлено-> запущено-> завершено.На каждом этапе статус должен быть сохранен в базе данных.так что эту задачу можно отслеживать в любой момент времени.Проблема с приведенным ниже кодом заключается в том, что он просто вставляет запись в базу данных, когда решение проблемы готово, это означает, что статус задачи завершен.Я хочу, чтобы запись вставлялась с начальным статусом SUBMITTED и позже во время обработки обновлялась последовательно со статусами «STARTED» и «COMPLETED».К вашему сведению: я новичок в весенних реактивных вещах

, и я хотел бы знать, как я могу отправить немедленное подтверждение со статусом "ОТПРАВЛЕНО".Обновленный код до данных можно найти в моем репозитории github

https://github.com/Manishmbm2010/Knapsack-reactive

Сервисный код, где я сталкиваюсь с проблемой

public void simpleSave(Knapsack knapsack) {
    knapsackReactiveRepository
        .save(knapsack)
        .single()
        .subscribe(
            x -> System.out.println(x.getTaskId() + " task status is " + x.getStatus()),
            Throwable::printStackTrace,
            () -> calculateSolutionForKnapsack(knapsack));
  }

  private void calculateSolutionForKnapsack(Knapsack knapsack) {
    knapsack.getTimestamps().setStarted(Instant.now().getEpochSecond());
    knapsack.setStatus(Status.STARTED);
    knapsackReactiveRepository
        .save(knapsack)
        .delayElement(Duration.ofSeconds(10))
        .subscribeOn(Schedulers.fromExecutor(executor))
        .subscribe(
            x -> System.out.println(x.getTaskId() + " task status is " + x.getStatus()),
            Throwable::printStackTrace,
            () -> {
              Problem problem = knapsack.getProblem();
              List<Integer> itemsToPutInKnapsack =
                  knapsackAlgo(
                      problem.getCapacity(),
                      problem.getWeights(),
                      problem.getValues(),
                      problem.getValues().length);
              knapsack.getSolution().setItems(itemsToPutInKnapsack);
              knapsack.getTimestamps().setCompleted(Instant.now().getEpochSecond());
              knapsack.setStatus(Status.COMPLETED);
              knapsack
                  .getSolution()
                  .setTime(timeTakenToSolveTheKnapsackProblem(knapsack.getTimestamps()));
              knapsackReactiveRepository
                  .save(knapsack)
                  .delayElement(Duration.ofSeconds(10))
                  .subscribe(
                      x -> System.out.println(x.getTaskId() + " task status is " + x.getStatus()),
                      Throwable::printStackTrace,
                      () -> System.out.println("Processing completed"));
            });
  }

Рюкзак Модель

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;


@Document
@Data
// @JsonView("knapsack")
public class Knapsack {

  @Id private String taskId;;
  private Problem problem;
  private Solution solution;
  private TimeStamp timestamps;
  private Status status;

  public Knapsack() {
    this.timestamps = new TimeStamp();
    solution = new Solution();
    this.status = Status.SUBMITTED;
  }

  public enum Status {
    SUBMITTED,
    STARTED,
    COMPLETED
  }
}

Контроллер

@RequestMapping(path = "/knapsack", method = RequestMethod.POST)
  public Mono<Knapsack> submitKnapsackProblem(@RequestBody Knapsack knapsack) {
    return knapsackService.saveKnapsackProblem(knapsack);
  }

вход

{
  "problem":{
    "capacity":10,
  "weights":[5,4,3],
  "values":[100,50,200]
  }
}

Ожидаемый вывод в качестве подтверждения:


{
{
    "taskId": "5cf2f4ec05a36459cd6faab7",
    "problem": {
        "capacity": 10,
        "weights": [
            5,
            4,
            3
        ],
        "values": [
            100,
            50,
            200
        ]
    },
    "solution": {
        "items": null,
        "time": 0
    },
    "timestamps": {
        "submitted": 1559426284,
        "started": null,
        "completed": null
    },
    "status": "SUBMITTED"
}

FinalOutput, когда готовое решение для рюкзака готово для извлечениядругой конечной точкой:

{
    "taskId": "5cf2f4ec05a36459cd6faab7",
    "problem": {
        "capacity": 10,
        "weights": [
            5,
            4,
            3
        ],
        "values": [
            100,
            50,
            200
        ]
    },
    "solution": {
        "items": [
            0,
            2
        ],
        "time": 1
    },
    "timestamps": {
        "submitted": 1559426284,
        "started": 1559426285,
        "completed": 1559426285
    },
    "status": "COMPLETED"
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...