user3458271
user3458271

Reputation: 660

In Hazelcast jet how can we store IList to normal list as I have to sent it in Response?

I am new to Hazelcast jet and in my application on data I am doing some aggregation and getting data but I want to send that in rest response so how can I change it to normal list?

public class ResponseMessage<T> {

private T responseClassType;

private ResponseMessage() {}
private ResponseMessage(T t) {
    this.responseClassType = t;
}

public static <T> ResponseMessage<T> withResponseData(T classType) {
    return new ResponseMessage<T>(classType);
}

   public static ResponseMessage<Void> empty() {
        return new ResponseMessage<>();
    }

public T getResponseClassType() {
    return responseClassType;
}

public void setResponseClassType(T responseClassType) {
    this.responseClassType = responseClassType;
}


}

This is my generic response class and as below I am sending response after all calculations:

public ResponseMessage<?> runProcess(Pipeline pl) {
    Map<String, BatchStage<Object>> allBatch = new HashMap<String,BatchStage<Object>>();
    allBatch.put(z.get("id").toString(), new SomeCalulation().readSource(pipeline));
    BatchStage<Object> h = allBatch.values().iterator().next();
    h.writeTo(Sinks.list("abc"));
                         
    IList<Object> abc = jetInstance.getList("abc");
    List<Object> result = new ArrayList(abc);
    abc.destroy();
                          
    return ResponseMessage.withResponseData(result);
  }

Now this is working but everytime I call rest request it is increasing the list and if I clear the list it is showing blank records, please help how can I convert it to normal list or best way to send response?

It was not working because I was joining it after method call:

runProcess(pl);
job.join(); // so because I am joining it after runProcess not working but if I directly return ResponseMessage.withResponseData(jetInstance.getList("abc")); and then join it will work.

Upvotes: 0

Views: 168

Answers (1)

František Hartman
František Hartman

Reputation: 15086

I don't see submitting the pipeline as a job and waiting for the result (job.join()). I suppose you have omitted this from your code sample.

To solve your issue with empty list simply copy the result before destroying the list:

job.join();

IList<Object> abc = jetInstance.getList("abc");
List<Object> result = new ArrayList(abc)
abc.destroy();
return ResponseMessage.withResponseData(result);

Also, the list should have a unique name for each request, otherwise, multiple requests will write to the same list, having unpredictable results.

Upvotes: 1

Related Questions