This might be a possible duplicate but none of the answers were helpful ..
I have a http servlet implementing CometProcessor , i have referred this example and also switched tomcat connector protocol to non-blocking io . But every time i try to run the project it is giving me 
error please help
Below is my Servlet(plus helper classes) and web.xml
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.CometEvent;
import org.apache.catalina.CometProcessor;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.SyndFeedInput;
public class TomcatWeatherServlet extends HttpServlet implements CometProcessor {
private static final long serialVersionUID = 1L;
private Logger logger = Logger.getLogger(TomcatWeatherServlet.class.getName());
private MessageSender messageSender = null;
private static final Integer TIMEOUT = 60 * 1000;
@Override
public void destroy() {
messageSender.stop();
messageSender = null;
}
@Override
public void init() throws ServletException {
messageSender = new MessageSender();
Thread messageSenderThread = new Thread(messageSender,
"MessageSender[" + getServletContext().getContextPath() + "]");
messageSenderThread.setDaemon(true);
messageSenderThread.start();
}
public void event(final CometEvent event) throws IOException, ServletException {
HttpServletRequest request = event.getHttpServletRequest();
HttpServletResponse response = event.getHttpServletResponse();
if (event.getEventType() == CometEvent.EventType.BEGIN) {
request.setAttribute("org.apache.tomcat.comet.timeout", TIMEOUT);
logger.log(Level.INFO, "Begin for session: " + request.getSession(true).getId());
messageSender.setConnection(response);
Weatherman weatherman = new Weatherman(95118, 32408);
weatherman.start();
} else if (event.getEventType() == CometEvent.EventType.ERROR) {
logger.log(Level.INFO, "Error for session: " + request.getSession(true).getId());
event.close();
} else if (event.getEventType() == CometEvent.EventType.END) {
logger.log(Level.INFO, "End for session: " + request.getSession(true).getId());
event.close();
} else if (event.getEventType() == CometEvent.EventType.READ) {
throw new UnsupportedOperationException("This servlet does not accept data");
}
}
private class Weatherman {
private final List<URL> zipCodes;
private final String YAHOO_WEATHER = "http://weather.yahooapis.com/forecastrss?p=";
public Weatherman(Integer... zips) {
zipCodes = new ArrayList<URL>(zips.length);
for (Integer zip : zips) {
try {
zipCodes.add(new URL(YAHOO_WEATHER + zip));
} catch (Exception e) {
logger.log(Level.INFO, "weather man failed");
}
}
}
public void start() {
Runnable r = new Runnable() {
public void run() {
int i = 0;
while (i >= 0) {
int j = i % zipCodes.size();
SyndFeedInput input = new SyndFeedInput();
try {
InputStreamReader isr = new InputStreamReader(zipCodes.get(i).openStream());
SyndFeed feed = input.build(isr);
SyndEntry entry = (SyndEntry) feed.getEntries().get(0);
messageSender.send(entryToHtml(entry));
Thread.sleep(3000L);
} catch (Exception e) {
logger.log(Level.INFO, "start failed");
}
i++;
}
}
};
Thread t = new Thread(r);
t.start();
}
private String entryToHtml(SyndEntry entry) {
StringBuilder html = new StringBuilder("<h2>");
html.append(entry.getTitle());
html.append("</h2>");
html.append(entry.getDescription().getValue());
return html.toString();
}
}
private class MessageSender implements Runnable {
protected boolean running = true;
protected final ArrayList<String> messages = new ArrayList<String>();
private ServletResponse connection;
private synchronized void setConnection(ServletResponse connection) {
this.connection = connection;
notify();
}
public void stop() {
running = false;
}
/**
* Add message for sending.
*/
public void send(String message) {
synchronized (messages) {
messages.add(message);
logger.log(Level.INFO, "Message added #messages=" + messages.size());
messages.notify();
}
}
public void run() {
while (running) {
if (messages.size() == 0) {
try {
synchronized (messages) {
messages.wait();
}
} catch (InterruptedException e) {
logger.log(Level.INFO, e.getMessage());
}
}
String[] pendingMessages = null;
synchronized (messages) {
pendingMessages = messages.toArray(new String[0]);
messages.clear();
}
try {
if (connection == null) {
try {
synchronized (this) {
wait();
}
} catch (InterruptedException e) {
logger.log(Level.INFO, e.getMessage());
}
}
PrintWriter writer = connection.getWriter();
for (int j = 0; j < pendingMessages.length; j++) {
final String forecast = pendingMessages[j] + "<br>";
writer.println(forecast);
logger.log(Level.INFO, "Writing:" + forecast);
}
writer.flush();
writer.close();
connection = null;
logger.log(Level.INFO, "Closing connection");
} catch (IOException e) {
logger.log(Level.INFO, "IOExeption sending message", e);
}
}
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>WeatherServlet</servlet-name>
<servlet-class>servlet.TomcatWeatherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>WeatherServlet</servlet-name>
<url-pattern>/Weather</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
You have several problems, here.
First, you haven't implemented the
doGetmethod in your servlet, which is why calling GET on that resource returns a 405 response. What did you expect to get when you calledGET /Weatherusing regular HTTP?Second, Tomcat dropped support for Comet in 8.5 in favor of the more standard WebSocket API.
So, you cannot use Comet at all with Tomcat 9. I'm surprised that you were able to even initialize that servlet in Tomcat 9. You must have had to grab a bunch of JAR files from an old Tomcat installation in order to get it to even load. But it's never going to actually work unless you downgrade to Tomcat 8.0.
You are better off switching to WebSocket.