0

私のアプリケーションでは、状態の変化を示すためにいくつかの特別な行をログに記録します。

logger.info("Read file abc.txt completed from upstream system");
logger.info("The content of file abc.txt is valid");
logger.info("The content of abc.txt has been saved to db");

次に、ログ ファイルを監視し、上記の行が見つかったら、それらの「イベント」のインスタンスを作成します。

class NewFileEvent() {}
class ValidationEvent() {}
class PersistEvent() {}

while(true) {
    String nextLine = readNextLineFromLog();
    if("Read file abc.txt completed from upstream system".equals(nextLine)) {
        return new NewFileEvent();
    } else if("The content of file abc.txt is valid".equals(nextLine)) {
        return new ValidationEvent();
    } else if("The content of abc.txt has been saved to db".equals(nextLine)) {
        return new PersistEvent();
    }
}

しかし、私の友人が私のコードをレビューしたとき、「非同期」ではないので「イベント」と呼ぶべきではないと言われました。name を見たときevent、彼はそれが別のスレッドから来ていることを期待していますが、私のコードでは、ループで 1 つずつ解析するだけです。

私は今困惑しています。何かがeventプログラミングにあると言うとき、それは「非同期」であると思いますか? 「同期」イベントはありませんか?

4

3 に答える 3

1

名前はOKだと思います。たとえば、Log4j には LoggingEvent クラスがあります。代わりに列挙型を検討することも理にかなっています

enum LoggingEvent {
  NewFile,
  ...
}
于 2013-11-11T09:35:05.117 に答える
1

イベントは単なるオブジェクトです。問題は、イベントの送信/受信/処理が同期か非同期かです。言い換えると、イベントの送信に使用されるメソッドは、イベントが処理されるまでブロックしますか、それともすぐに戻りますか? また、2 つのイベントが「送信」された場合、それらは並行して処理されますか、それとも順番に処理されますか?

Java では、イベントは通常、イベント リスナーによって処理されるため、イベントが発生するとすぐに通知されるコールバックとして機能するイベント リスナーをどこかに登録します。これは通常、非同期ではないため、イベントは同じスレッド内で順番にすべてのリスナーに配信されます。その場合、マルチスレッドは推奨されません。通常は利点がなく、すべてがより複雑になり、エラーが発生しやすくなります。

http://docs.oracle.com/javase/tutorial/uiswing/events/index.htmlも参照してください。

したがって、「イベント」という名前自体が自動的に「非同期」を意味するわけではありません。

于 2013-11-11T09:41:47.740 に答える
1

Hibernate は同じアプローチを使用します。イベント オブジェクトは、ユーザーが何らかのアクションを実行したいときに作成され、すぐにイベント リスナーに渡されます。同期的に動作するため、イベント オブジェクトは一部のデータの転送にのみ使用されます。

于 2013-11-11T09:44:30.047 に答える