私はCometProcessorインターフェイスを使用する単純なサーブレットを持っています。CometProcessor Endイベントループ
package cc.co.sqeezer;
import java.io.IOException;
public class TestServlet extends HttpServlet implements CometProcessor {
private static final long serialVersionUID = 1L;
public TestServlet() {
super();
}
public void event(CometEvent event) {
if (event.getEventType() == CometEvent.EventType.BEGIN)
{
System.out.println("Begin");
event.getHttpServletRequest().setAttribute("org.apache.tomcat.comet.timeout", new Integer(0xFFFFFFFF));
send(event);
}
else if (event.getEventType() == CometEvent.EventType.READ)
{
System.out.println("Read");
send(event);
}
else if (event.getEventType() == CometEvent.EventType.END)
{
System.out.println("End: " + event.getEventSubType());
send(event);
}
else if (event.getEventType() == CometEvent.EventType.ERROR)
{
System.out.println("Error: " + event.getEventSubType());
send(event);
}
}
private void send(CometEvent event) {
HttpServletResponse response = event.getHttpServletResponse();
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "must-revalidate");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Cache-Control", "no-store");
response.setDateHeader("Expires", 0);
String eventType = event.getEventType().toString();
String receivedText = (String) event.getHttpServletRequest().getParameter("mytext");
try {
response.getWriter().write(eventType + " " + receivedText);
response.getWriter().flush();
} catch (IOException e) {
e.printStackTrace();
}
}
public void init(ServletConfig config) throws ServletException {
}
}
コネクタが
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
URIEncoding="UTF-8"
redirectPort="8443" />
JSPページでは、私は、サーブレットを起動するためにEclipseを使用してい
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test</title>
</head>
<body>
<script type="text/javascript"><!--
function createRequestObject() {
if (typeof XMLHttpRequest === 'undefined') {
XMLHttpRequest = function() {
try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); }
catch(e) {}
try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); }
catch(e) {}
try { return new ActiveXObject("Msxml2.XMLHTTP"); }
catch(e) {}
try { return new ActiveXObject("Microsoft.XMLHTTP"); }
catch(e) {}
throw new Error("This browser does not support XMLHttpRequest.");
};
}
return new XMLHttpRequest();
}
var req = createRequestObject();
function sendData()
{
if (req) {
req.open("POST", "TestServlet", true);
req.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
var params = "mytext=" + document.getElementById("mytext").value;
//req.setRequestHeader("Content-length", params.length);
req.onreadystatechange = processReqChange;
req.send(params);
}
}
function processReqChange()
{
try
{
if (req.readyState == 4) {
alert(req.status + " ReadyState=4 " + req.responseText);
}
if (req.readyState == 3) {
alert(req.status + " ReadyState=3 " + req.responseText);
}
if (req.readyState == 2) {
alert(req.status + " ReadyState=2 " + req.responseText);
}
if (req.readyState == 1) {
alert(req.status + " ReadyState=1 " + req.responseText);
}
}
catch(e) {
//alert("Error: " + e.description);
}
}
--></script>
<input id="mytext" type="text"></input>
<input type="button" value="send" onclick="sendData()"></input>
</body>
</html>
です。
私は、 "テキスト"をサーバーに送り、同じテキストとCometEvent名でエコーを返すことを期待しています。
データをサーバーに送信すると、最初に "200 ReadyState = 3 BEGIN text"が表示されます。これは予想されるシナリオです。約25秒待つと、コンソール出力に「エラー:タイムアウト」が表示されます。エラーイベントは25秒ごとに発生するため、ブラウザでは「200 ReadyState = 3 BEGIN textERROR textERROR textERROR textERROR textERROR text」のように表示されます。ここで、「text」は入力テキストです。 5 textERRORは、5つのエラーイベントが発生したことを意味します。私はなぜこれらのtextERRORが現れたのか分かりません。主な質問は、エラーイベント(タイムアウト)が25秒ごとに発生する理由です。
ブラウザでクライアントを閉じると、End Eventsの無限ループが発生します。なぜ私はどちらか分からないのですか?そのようなループを防ぐ方法は?
TomcatバージョンはApache Tomcat/6.0.28(Ubuntu 10.10)です。
ありがとうございます。スタートとして
エンドループがなぜ起こるのか誰も知りません。 GlassFishに移行しようとしています... – Sqeezer