1

詳細を記録する垂直パネルがある GWT アプリを作成しました。

ロガーを使用して行っているクライアント側のロギング

サンプルコードは次のとおりです。

         public static VerticalPanel customLogArea = new VerticalPanel();
         public static Logger rootLogger = Logger.getLogger("");
                    logerPanel.setTitle("Log");
        scrollPanel.add(customLogArea);
        logerPanel.add(scrollPanel);
        if (LogConfiguration.loggingIsEnabled()) {
        rootLogger.addHandler(new HasWidgetsLogHandler(customLogArea));

        }

そして、このコードを使用して垂直ログパネルを更新しています

         rootLogger.log(Level.INFO,
                        "Already Present in Process Workspace\n");

しかし、私の質問は、サーバー側の詳細も垂直ログパネルに記録する必要があるということです。

私のサーバー側の GreetingServiceImpl コードは次のとおりです。

      public boolean createDirectory(String fileName)
             throws IllegalArgumentException {
    Boolean result = false;
    try {
        rootLogger.log(Level.INFO,
                 "I want to log this to my UI vertical log Panel");

        system.out.println("log this to UI");
        File dir = new File("D:/GenomeSamples/" + fileName);
        if (!dir.exists()) {
            result = dir.mkdir();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}

ここから sysoutprt ステートメントを UI に記録したいと思います。どうすればこれを達成できますか。rootLogger.log(Level.INFO, "これを UI の垂直ログ パネルに記録したい"); これをEclipseコンソールに記録しているコード。しかし、これをクライアント側の UI に記録する方法。

この質問に何か問題がある場合はお知らせください。

4

3 に答える 3

3

私の理解が正しければ、Web インターフェイスでサーバーのログ エントリを確認したいはずです。もちろん、Java ロガーと printStackTrace() は役に立ちません。gwt コードは JavaScript にコンパイルされ、コンソール ファイルやログ ファイルとは関係ありません。さらに、サーバーはログエントリをクライアントに「プッシュ」できません。リクエストを行うのはクライアント次第です。したがって、新しいログ エントリを追跡してクライアントに移動する場合は、サーバーにポーリングして新しいエントリを探す必要があります。さらに別の問題: 多くのクライアントがサーブレットをポーリングしている可能性があり、このマルチスレッドに注意する必要があります。

これは私が考えられる実装をどのように見ているかです(これは単なる概念であり、いくつかのエラーやスペルミスが含まれている可能性があります):

リモートインターフェース:

public interface GreetingService extends RemoteService {
    List<String> getLogEntries();
    boolean createDirectory(String fileName)throws IllegalArgumentException;

}

リモート サーブレット:

public class GreetingServiceImpl extends RemoteServiceServlet implements GreetingService {

public static final String LOG_ENTRIES = "LogEntries";

public List<String> getLogEntries() {

    List<String> entries = getEntriesFromSession();
    List<String>copy = new ArrayList<String>(entries.size());
    copy.addAll(entries);
    //prevent loading the same entries twice
    entries.clear();
    return copy;

}



public boolean createDirectory(String fileName)throws IllegalArgumentException {
    Boolean result = false;
    try {

        log("I want to log this to my UI vertical log Panel");

        log("log this to UI");
        File dir = new File("D:/GenomeSamples/" + fileName);
        if (!dir.exists()) {
            result = dir.mkdir();
        }
    } catch (Exception e) {
        log("Exception occurred: " + e.getMessage());
    }
    return result;
}

private List<String> getEntriesFromSession()    {
    HttpSession session= getThreadLocalRequest().getSession();
    List<String>entries = (List<String>)session.getAttribute(LOG_ENTRIES);
    if (entries == null)    {
        entries = new ArrayList<String>();
        session.setAttribute(LOG_ENTRIES,entries);
    }

    return entries;

}

private void log(String message)  {
    getEntriesFromSession().add(message);
}

ポーリングの簡単な実装 (gwt クライアント側):

Timer t = new Timer() {
  @Override
  public void run() {
    greetingAsyncService.getLogEntries(new AsyncCallBack<List<String>>() {
       void onSuccess(List<String>entries) {
         //put entries to your vertical panel
       }

       void onFailure(Throwable caught){
           //handle exceptions
       }
    });
  }
};

// Schedule the timer to run once in second.
t.scheduleRepeating(1000);

greetingAsyncService.createDirectory(fileName, new AsyncCallBack<Void>(){
    void onSuccess(List<String>entries) {
          //no need to poll anymore
          t.cancel();
       }

       void onFailure(Throwable caught){
           //handle exceptions
       }
});

}

ご覧のとおり、セッションはクライアント固有であり、異なるクライアントは異なるログを受け取るため、セッションを使用してログ エントリを保持しています。何を使用するかはあなた次第です。ユーザー自身を追跡し、適切なクライアントに適切なログを提供する独自の Logger クラスを作成できます。

また、メッセージのレベル (INFO、ERROR など) を保存してから、メッセージをさまざまな色 (たとえば、ERROR は赤) で表示することもできます。そのためには、リストではなくカスタム クラスを保存する必要があります。

于 2013-09-18T17:47:54.403 に答える
0

これらの実装は非常に優れていますが、タイマーや繰り返しのサーバー クエリについては忘れてください。私たちは今、より良いものを持っています。

WebSocketsをサポートするAtmosphereを使用して、サーバーからクライアントにデータをプッシュすることができます。

于 2013-09-18T21:54:30.063 に答える