Издатель / подписчик в JAX-RS - список не обновляется - PullRequest
0 голосов
/ 05 сентября 2018

Таким образом, я пытаюсь реализовать шаблон издателя / подписчика в JAX-RS, однако кажется, что после подписки подписчика издатель не может найти подписку.

Код сервера:

@GET
@Path("{id}/subscribe")
public void subscribe(@Suspended AsyncResponse asyncResponse, @PathParam("id") Long id) {
    if (responses.containsKey(id)) {
        responses.get(id).add(asyncResponse);
    } else {
        List<AsyncResponse> newList = new ArrayList<>();
        newList.add(asyncResponse);
        responses.put(id, newList);
    }
    System.out.println(responses.size());
}

@POST
@Path("{id}/publish")
@Consumes(MediaType.TEXT_PLAIN)
public void publish(String message, @PathParam("id") Long id) {
    System.out.println(responses.size());
    List<AsyncResponse> responseList = responses.get(id);
    if (responseList == null) {
        return;
    }
    for (AsyncResponse response : responseList) {
        response.resume(message);
    }
    responseList.clear();
}

Код клиента:

public void subscribeToConcertNews(ConcertDTO concertDTO) {
    Response response = null;
    String url = CONCERT_URL + "/" + concertDTO.getId() + "/subscribe";

    ClientBuilder.newClient().target(url)
            .request()
            .async()
            .get(new InvocationCallback<String>() {
                @Override
                public void completed(String s) {
                    System.out.println(s);
                    _client.target(CONCERT_URL + "/" + concertDTO.getId() + "/subscribe")
                            .request()
                            .async()
                            .get(this);
                }

                @Override
                public void failed(Throwable throwable) {
                    throw new ServiceException("");
                }
            });


}

public void publishToConcertNews(ConcertDTO concertDTO, String message) {
    Response response = _client.target(CONCERT_URL + "/" + concertDTO.getId() + "/publish")
            .request()
            .post(Entity.entity("News!", MediaType.TEXT_PLAIN));

}

Код тестирования:

ConcertDTO concertDTO = new ConcertDTO(1L, "123", new HashSet<>(), new HashMap<>(), new HashSet<>());
    _service.subscribeToConcertNews(concertDTO);
    _service.publishToConcertNews(concertDTO, "213123");

После подписки размер карты равен 1, однако при попытке опубликовать новость говорится, что размер карты для хранения ответов равен 0. Таким образом, сохраненный в карте AsyncResponse исчезает. Любая помощь будет оценена!

...