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