Java 使用单例存储来自servlet的数据(使用jetty)

Java 使用单例存储来自servlet的数据(使用jetty),java,singleton,jetty,Java,Singleton,Jetty,我正在实现一个服务器客户端项目 我在服务器端使用Jetty 我想在客户机(通过http)连接到某种共享位置的服务器时存储每个客户机的连接时间 我选择了map,并使用一个Singleton来存储所有数据 不幸的是,这不起作用。。每次客户端发送http请求并触发jetty句柄时,都会新建singleton对象 为什么? 如何实现所有客户机信息的持久化 我附上代码(请忽略处理reuqest的逻辑..它不相关) 请求者山德勒 package com.server.httphandlers; impor

我正在实现一个服务器客户端项目

我在服务器端使用Jetty

我想在客户机(通过http)连接到某种共享位置的服务器时存储每个客户机的连接时间

我选择了
map
,并使用一个Singleton来存储所有数据

不幸的是,这不起作用。。每次客户端发送http请求并触发jetty句柄时,都会新建singleton对象

为什么?

如何实现所有客户机信息的持久化

我附上代码(请忽略处理reuqest的逻辑..它不相关)

请求者山德勒

package com.server.httphandlers;

import com.server.client.ClientUtils;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RequestsHandler extends AbstractHandler {

    public static final String CONTENT_TYPE = "text/html; charset=utf-8";


    @Override
    public void handle(String target,
                       Request baseRequest,
                       HttpServletRequest request,
                       HttpServletResponse response) throws IOException

    {


        if (ClientUtils.isClientRequest(request)) {
            ClientHandler clientHandler = new ClientHandler();
//here is where I used the singlton object to store the client access time.. which instantiate an new object instead using the singlton.
            clientHandler.handleClientAccess(request, response);
        }
        else{
            response.setContentType(CONTENT_TYPE);
            response.setStatus(HttpServletResponse.SC_OK);
        }
        baseRequest.setHandled(true);

    }


}
单态对象

package com.server.client;

import java.util.HashMap;
import java.util.Map;

public class ClientsVisitsSingleton {
    private static ClientsVisitsSingleton clientsVisitsSingleton;
    private Map<Long, ClientVisitsInfo> clientsVisits;

    private ClientsVisitsSingleton() {
        clientsVisits = new HashMap<Long, ClientVisitsInfo>();
    }

    public static synchronized ClientsVisitsSingleton getInstance() {
        if (clientsVisitsSingleton == null) {
            synchronized (ClientsVisitsSingleton.class) {
                if (clientsVisitsSingleton == null) {
                    clientsVisitsSingleton = new ClientsVisitsSingleton();
                }
            }
        }
        return clientsVisitsSingleton;
    }

    public Map<Long, ClientVisitsInfo> getClientsVisits() {
        return clientsVisits;
    }
}
package com.server.client;
导入java.util.HashMap;
导入java.util.Map;
公共类客户端VisitsSingleton{
私有静态客户端VisitsSingleton客户端VisitsSingleton;
私人地图客户端浏览;
私人客户端VisitsSingleton(){
clientsVisits=newhashmap();
}
公共静态同步客户端VisitsSingleton getInstance(){
if(clientsVisitsSingleton==null){
已同步(ClientsVisitsSingleton.class){
if(clientsVisitsSingleton==null){
clientsVisitsSingleton=新clientsVisitsSingleton();
}
}
}
returnclientsvisitssingleton;
}
公共地图getClientsVisits(){
返回客户访问;
}
}
为什么不

ClientsVisitsSingleton singleton=newclientvisitsssingleton();
setHandler(新的RequestsHandler(singleton));
然后在您的
RequestsHandler

公共类RequestsHandler扩展了AbstractHandler{
最终客户VisitsSingleton singleton;
public RequestsHandler(ClientsVisitsSingleton-singleton){
this.singleton=singleton;
}
公共静态最终字符串内容\u TYPE=“text/html;charset=utf-8”;
@凌驾
公共无效句柄(字符串目标,
请求baseRequest,
HttpServletRequest请求,
HttpServletResponse(响应)引发IOException
{
//…将singleton用作此处的任何其他对象

但最终,我不得不问,为什么不直接使用
ServletContextHandler(会话)
并使用Jetty中已有的内置
HttpSession
概念?

请发布例外更改我的描述。不例外,但正在创建一个新的Singleton实例。请发布
ClientHandler
。另外请注意,您在
ClientsVisitsSingleton.ge中同步了
两次tInstance()
once on the method once on the method once in the method。
package com.server.client;

import java.util.HashMap;
import java.util.Map;

public class ClientsVisitsSingleton {
    private static ClientsVisitsSingleton clientsVisitsSingleton;
    private Map<Long, ClientVisitsInfo> clientsVisits;

    private ClientsVisitsSingleton() {
        clientsVisits = new HashMap<Long, ClientVisitsInfo>();
    }

    public static synchronized ClientsVisitsSingleton getInstance() {
        if (clientsVisitsSingleton == null) {
            synchronized (ClientsVisitsSingleton.class) {
                if (clientsVisitsSingleton == null) {
                    clientsVisitsSingleton = new ClientsVisitsSingleton();
                }
            }
        }
        return clientsVisitsSingleton;
    }

    public Map<Long, ClientVisitsInfo> getClientsVisits() {
        return clientsVisits;
    }
}