Java 此带有comet处理器的URL不支持HTTP方法GET
这可能是重复的,但没有一个答案是有用的 我有一个实现CometProcessor的HTTPServlet,我已经参考了这个示例,并将tomcat连接器协议切换到非阻塞io。但每次我试着运行这个项目,它都会给我 错误,请帮忙 下面是我的Servlet(加上助手类)和web.xmlJava 此带有comet处理器的URL不支持HTTP方法GET,java,tomcat,comet,Java,Tomcat,Comet,这可能是重复的,但没有一个答案是有用的 我有一个实现CometProcessor的HTTPServlet,我已经参考了这个示例,并将tomcat连接器协议切换到非阻塞io。但每次我试着运行这个项目,它都会给我 错误,请帮忙 下面是我的Servlet(加上助手类)和web.xml import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL;
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>
import java.io.IOException;
导入java.io.InputStreamReader;
导入java.io.PrintWriter;
导入java.net.URL;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.servlet.ServletException;
导入javax.servlet.ServletResponse;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入org.apache.catalina.CometEvent;
导入org.apache.catalina.com处理器;
导入com.sun.syndication.feed.synd.SyndEntry;
导入com.sun.syndication.feed.syndd.SyndFeed;
导入com.sun.syndication.io.SyndFeedInput;
公共类TomcatWeatherServlet扩展了HttpServlet处理器{
私有静态最终长serialVersionUID=1L;
私有记录器Logger=Logger.getLogger(TomcatWeatherServlet.class.getName());
private MessageSender=null;
私有静态最终整数超时=60*1000;
@凌驾
公共空间销毁(){
messageSender.stop();
messageSender=null;
}
@凌驾
public void init()引发ServletException{
messageSender=新建messageSender();
Thread messageSenderThread=新线程(messageSender,
“MessageSender[“+getServletContext().getContextPath()+”]”;
messageSenderThread.setDaemon(true);
messageSenderThread.start();
}
公共void事件(最终CometEvent事件)引发IOException、ServletException{
HttpServletRequest=event.getHttpServletRequest();
HttpServletResponse=event.getHttpServletResponse();
if(event.getEventType()==CometEvent.EventType.BEGIN){
setAttribute(“org.apache.tomcat.comet.timeout”,timeout);
logger.log(Level.INFO,“开始会话:”+request.getSession(true.getId());
messageSender.setConnection(响应);
气象员气象员=新气象员(9511832408);
天气预报员,开始;
}else if(event.getEventType()==CometEvent.EventType.ERROR){
logger.log(Level.INFO,“会话错误:”+request.getSession(true.getId());
event.close();
}else if(event.getEventType()==CometEvent.EventType.END){
logger.log(Level.INFO,“会话结束:”+request.getSession(true.getId());
event.close();
}else if(event.getEventType()==CometEvent.EventType.READ){
抛出新的UnsupportedOperationException(“此servlet不接受数据”);
}
}
二等气象员{
私有最终列表zipCodes;
私有最终字符串YAHOO_WEATHER=”http://weather.yahooapis.com/forecastrss?p=";
公共气象员(整数…拉链){
zipCodes=新阵列列表(zips.length);
适用于(整数拉链:拉链){
试一试{
添加(新的URL(YAHOO_WEATHER+zip));
}捕获(例外e){
logger.log(Level.INFO,“气象员失败”);
}
}
}
公开作废开始(){
Runnable r=新的Runnable(){
公开募捐{
int i=0;
而(i>=0){
int j=i%zipCodes.size();
SyndFeedInput=新的SyndFeedInput();
试一试{
InputStreamReader isr=新的InputStreamReader(zipCodes.get(i).openStream());
SyndFeed feed=input.build(isr);
SyndEntry条目=(SyndEntry)feed.getEntries().get(0);
send(entryToHtml(entry));
线程。睡眠(3000L);
}捕获(例外e){
logger.log(Level.INFO,“启动失败”);
}
i++;
}
}
};
螺纹t=新螺纹(r);
t、 start();
}
私有字符串entryToHtml(SyndEntry条目){
StringBuilder html=新的StringBuilder(“”);
append(entry.getTitle());
html.append(“”);
append(entry.getDescription().getValue());
返回html.toString();
}
}
私有类MessageSender实现可运行{
受保护的布尔运行=真;
受保护的最终ArrayList消息=新建ArrayList();
专用ServletResponse连接;
专用同步void setConnection(ServletResponse连接){
这个连接=连接;
通知();
}
公共停车场(){
运行=错误;
}
/**
*添加用于发送的消息。
*/
公共无效发送(字符串消息){
已同步(消息){
消息。添加(消息);
logger.log(Level.INFO,“Message added#messages=“+messages.size());
messages.notify();
}
}
公开募捐{
(跑步时){
if(messages.size()==0){
试一试{
已同步(消息){
messages.wait();
}