2017-12-28 14 views
-1

I은 ​​문제가 있다면, 서버와 동기화 클라이언트는

나는 인 Netty 여러 클라이언트와 백 엔드 서버가 백 엔드에서 백엔드 거래 데이터 은행 및 제어 시스템 등 모든 데이터와 행위, BSON 문서로 구성된 플레이어가 있습니다. 이제 클라이언트 중 하나에서이 작업을 수행하고 백엔드에 다시로드하고 싶습니다. 어떻게 백엔드가 데이터에 쓰는 동안 클라이언트가 데이터를 편집하고 저장하지 못하게 할 수 있습니까?

임 atempting이처럼해야 할 일 :

데이터 클래스 :

package testing; 

public abstract class EditRequest<T> { 

public int editid; 

public abstract void onEdit(T t); 

public int getEditid() { 
    return editid; 
} 

public void setEditid(int editid) { 
    this.editid = editid; 
} 




} 
: 내가 클래스를 편집하려면

는 편집 요청을 처리 거기에
package testing; 

import java.util.ArrayList; 

public class data { 
String data; 

private ArrayList<EditRequest<data>> requests; 

private int nexteditid = 0; 

private int currenteditid = -2; 
public data() { 
    requests = new ArrayList<>(); 
} 


public void addRequest(EditRequest<data> request) { 
    request.setEditid(nexteditid); 
    nexteditid++; 
    requests.add(request); 
    trynextedit(); 
} 


private void trynextedit() { 
    System.out.println("trynextedit!"); 
    if(currenteditid == -2 && requests.size() > 0) { 
     System.out.println("editing"); 
     EditRequest<data> request = requests.remove(0); 
     currenteditid = request.getEditid(); 
     request.onEdit(data.this); 


    } 
} 



public void finischedit(EditRequest<data> request) { 
    if(currenteditid != -2) { 
     if(currenteditid == request.getEditid()) { 
      System.out.println("Edit request finisched! id: " + request.getEditid()); 
      currenteditid = -2; 
      trynextedit(); 
     }else { 
      throw new IllegalArgumentException("not the right id!"); 
     } 
    }else { 
     throw new NullPointerException("no current edit!"); 
    } 
} 

public String getData() { 
    return data; 
} 

public void setData(String data) { 
    this.data = data; 
} 



} 

내가 전자 EditRequest 등록

그래서 편집 한 내용을 서로 뒤따를 수 있습니다.

package testing; 

public class main { 



public static void main(String[] args) { 
    data data = new data(); 
      data.addRequest(new EditRequest<data>() { 

       @Override 
       public void onEdit(data t) { 
        System.out.println("runing edit 1!"); 
        t.setData(t.getData() + "edit 1!"); 

        t.finischedit(this);   
       } 
      }); 
      data.addRequest(new EditRequest<data>() { 

       @Override 
       public void onEdit(data t) { 
        System.out.println("runing edit 2!"); 
        t.setData(t.getData() + "edit 2!"); 

        t.finischedit(this);   
       } 
      }); 
    System.out.println(data.getData()); 

} 

} 

지금 내 질문은 더 나은 방법인가요?

+0

동기화 된, 뮤텍스, 세마포어 등에 대해 읽으십시오. –

답변

0

귀하의 코드는 읽고 이해하기 쉽지 않습니다. 그러나 여러 클라이언트간에 편집 동기화가 필요한 경우 두 클라이언트에서 동일한 작업을 편집하지 않아야합니다.

데이터베이스에 동시에 쓰는 것과 같은 문제입니다. 일부 잠금 메커니즘을 구현하거나 (클라이언트는 편집을 시도하기 전에 서버에 요청해야하며 서버는 다른 클라이언트가 편집 할 수 없도록 해당 리소스를 잠궈 야 함) 일반적으로 느리고 문제가 발생하기 쉽습니다 (클라이언트가 편집을 끝내지 않으면 어떻게됩니까?). .

또 다른 방법은 낙관적 잠금을 구현하는 것입니다. 각 엔티티에 버전 카운터를 추가하고 모든 수정시 버전 카운터를 증가시킵니다. counter가 정확히 마지막으로 저장된 엔티티의 1보다 위에있는 경우에만 편집 된 엔티티를 저장하십시오 (설명이 명확하지 않으면 google에 문의하십시오).