package org.cloudfoundry.samples.rabbitmq.chat;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
@Controller
public class ChatController {
@Autowired
private volatile AmqpTemplate amqpTemplate;
private final Queue<String> messages = new LinkedBlockingQueue<String>();
@RequestMapping(value = "/")
public String home() {
return "WEB-INF/views/chat.jsp";
}
@RequestMapping(value = "/publish", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void publish(@RequestParam String username, @RequestParam String text) {
this.amqpTemplate.convertAndSend(username + ": " + text);
}
@RequestMapping(value = "/chatlog")
@ResponseBody
public String chatlog() {
return StringUtils.arrayToDelimitedString(this.messages.toArray(), "<br/>");
}
/**
* This method is invoked when a RabbitMQ Message is received.
*/
public void handleMessage(String message) {
if (messages.size() > 100) {
messages.remove();
}
messages.add(message);
}
}