HTTP method GET is not supported by this URL with comet processor

274 Views Asked by At

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 img

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>
1

There are 1 best solutions below

2
Christopher Schultz On

You have several problems, here.

First, you haven't implemented the doGet method in your servlet, which is why calling GET on that resource returns a 405 response. What did you expect to get when you called GET /Weather using 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.