2017-12-28 34 views
-1

私は問題を抱えている、 サーバーとの同期クライアントが

は私がネッティーといくつかのクライアントとバックエンドサーバーを持っているバックエンドのバックエンドの取引データバンクや制御システムなど、すべてのデータおよび行為、 (BSON文書で構成された)プレーヤーがあります。クライアントの1つでこれを処理してからバックエンドに再度ロードしたいのですが、クライアントがデータを編集してバックエンドがデータに書き込んでいる間にデータを保存しないようにするにはどうすればいいですか?

このようにそれを行うにはイムatempting:

データクラス:

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 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; 

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

あなたのコードは読みやすく理解しにくいと言わなければなりません。しかし、いくつかのクライアント間で何らかの編集同期が必要な場合は、2人のクライアントで同じことを編集していないことをどうしても保証する必要があります。

データベースへの同時書き込みと同じ問題です。いくつかのロック機構を実装するか(クライアントは編集を試みる前にサーバに尋ねなければならず、サーバは他のクライアントが編集できないようにそのリソースをロックする必要があります)、それは通常遅く、問題を起こしやすくなります。 。

もう1つの方法は、楽観的なロックを実装することです。各エンティティにバージョンカウンタを追加し、すべての編集でそれをインクリメントします。カウンタが正確に最後に保存されたエンティティの1より上にある場合は、編集したエンティティのみを保存します(説明が十分明確でない場合は、Googleにお問い合わせください)。

関連する問題