最近、Tomcat 7.0.50 に websocket を実装しました。私のTomcatはApache 2.4の背後で動作します。Strtus 2 と Spring Security を使用しています。動作を停止しました。
問題 : Websocket 接続が正常に開かれます。Javascript イベント ハンドラーが正常に起動します。Apache ログは、リクエストが 101 コードのプロトコル アップグレード リクエストとして受け入れられたことを示しています。Tomcat アクセス ログも、プロトコル アップグレードに対して同じコード 101 を示しています。
ただし、サーバー側では onOpen メッセージは発生しません。javascript のイベント ハンドラで接続が開かれるとすぐにメッセージを送信しようとしました。javascript にはエラーはありませんが、onOpen が呼び出されないように、サーバー側の endPoint の onmessage は呼び出されません。
動作を停止した後に行った変更は次のとおりです。
Windows Host file : I use dummy host name through Windows host file:
127.0.0.1 phasingapp.com
127.0.0.1 pricer.com
wesocket の URL :
old : ws://localhost:86/websocket/filuploadtrackerendpoint
new : ws://phasingapp.com:86/websocket/filuploadtrackerendpoint
apache の仮想ホスト構成を追加:
<Location /jkweb/websocket/>
Require host phasingapp.com granted
</Location>
JkMount /jkweb/* localtomcat
JkUnMount /jkweb/project/content/* localtomcat
JkUnMount /jkweb/angle/content/* localtomcat
JkUnMount /jkweb/index.jsp localtomcat
JkUnMount /jkweb/ localtomcat
ProxyRequests Off
ProxyPreserveHost On
ProxyPass /jkweb !
ProxyPass /jkweb/ !
ProxyPass /jkweb/websocket/ ws://localhost:8080/jkweb/websocket/
ProxyPassReverse /jkweb/websocket/ ws://localhost:8080/jkweb/websocket/
ProxyPass / http://localhost:8080/jkweb/
ProxyPassReverse / http://localhost:8080/jkweb/
支柱 2 :
changed url pattern for Struts 2 filter from ".action to " /* ". Also added exclusion filters
to strtus2 for webscoket urls :
<constant name="struts.action.excludePattern" value=".*websocket/.*"/>
Apache、Tomcat、Spring Security、および Struts2 ログのどこにもエラーが発生していないため、すべてが正常に機能しているようです。
ただし、サーバー側ではハンドラーは呼び出されませんか?
以前に同様の問題に直面していましたが、websocket-api jar を WEB-INF/lib に配置していたため、websocket 接続が開かれませんでした。現在、接続は開かれていますが、その後ハンドラーは呼び出されず、しばらくするとタイムアウトのために明らかに接続が閉じられます。
ここに私の ServerEndPoint クラスがあります:
package com.jkweb.websocket;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.websocket.EndpointConfig;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ServerEndpoint(value="/websocket/fileuploadtracker")
public class FileUploadTrackerEndPoint{
private static final Logger logger = LoggerFactory
.getLogger(FileUploadTrackerEndPoint.class);
private static HashMap<String,Session> socketConnectionMap = new HashMap<String,Session>();
@OnOpen
public void open(Session session) {
Map<String,List<String>> paramMap = session.getRequestParameterMap();
List<String> uniqueTockenValues = paramMap.get("uniqueTocken");
if(uniqueTockenValues != null && uniqueTockenValues.size() > 0){
socketConnectionMap.put(uniqueTockenValues.get(0),session);
}
}
@OnMessage
public void onMessage(Session session, String msg) {
try {
session.getBasicRemote().sendText(msg);
} catch (IOException e) {
logger.error(e.getMessage());
}
}
public static void sendMessage(String uniqueTocken,String msg){
try {
Session wsSession = socketConnectionMap.get(uniqueTocken);
wsSession.getBasicRemote().sendText(msg);
} catch (IOException e) {
logger.error(e.getMessage());
}
}
}
そして私のJavaScriptコード:
createFileUploadWebSocket : function(){
var that = this;
var uniqueTocken = $("#uniqueTocken").val(),
wsurl = "ws://phasingapp.com:86/jkweb/websocket/fileuploadtracker?uniqueTocken="+uniqueTocken,
ws;
ws = new WebSocket(wsurl);
ws.onopen = function()
{
alert("opened..") //I get this aler sothis is called
ws.send("test");//however this has not effect ...no error but server end point is not called
};
ws.onmessage = function (evt)
{
message = evt.data;
if(message == "Done."){
alert("closing..");
ws.close();
$('#progressbar').progressbar('option','value',100);
}
var currentVal = $('#progressbar').progressbar('option','value');
$('#progressbar').progressbar('option','value',currentVal <= 80 ?currentVal+1 : currentVal);
};
ws.onclose = function(evt)
{
// websocket is closed.
alert("Connection is closed..."+evt.code + ":"+evt.reason );
};
ws.onerror = function(evt){
alert("Connection is closed..."+evt.code + ":"+evt.reason );
};
},