package io.kafka101.clickstream.rest.proxy.service;
import com.fasterxml.jackson.core.JsonProcessingException;
import io.kafka101.clickstream.rest.proxy.client.Producer;
import io.kafka101.clickstream.rest.proxy.client.dto.PublishingResponse;
import io.kafka101.clickstream.rest.proxy.client.util.AsyncClientWrapper;
import io.kafka101.clickstream.rest.proxy.domain.Click;
import org.glassfish.jersey.server.ManagedAsync;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.ws.rs.Consumes;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.container.AsyncResponse;
import javax.ws.rs.container.Suspended;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
import static javax.ws.rs.core.Response.Status.NO_CONTENT;
@Path("/actions")
public class KafkaRestService {
private static final Logger logger = LoggerFactory.getLogger(KafkaRestService.class);
private final Producer producer;
public KafkaRestService() throws URISyntaxException {
producer = new Producer("http://127.0.0.1:8082/topics/", AsyncClientWrapper.getInstance().getWrappedClient());
}
@Path("click")
@POST
@ManagedAsync
@Consumes(APPLICATION_JSON)
public void click(Click click, @Context UriInfo uriInfo, @HeaderParam("user-agent") String userAgent,
@Suspended final AsyncResponse response)
throws MalformedURLException, UnsupportedEncodingException, JsonProcessingException {
click.setUserAgent(userAgent);
click.setIp(uriInfo.getRequestUri().toURL());
producer.publish(click, "click")
.whenComplete((publishingResponse, throwable) -> accept(publishingResponse, throwable));
response.resume(Response.status(NO_CONTENT).build());
}
private void accept(PublishingResponse response, Throwable throwable) {
if (response != null) {
logger.debug("{} message(s) published.", response.offsets.size());
} else {
logger.error("Could not publish message!", throwable);
}
}
}