2

VanillaChronicle を使用して、いくつかのメッセージをディスクに書き込みます。

public final class ConcurrentPersister{

    private final String location;
    private final Chronicle chronicle;
    private final ExcerptAppender writer;

    private final static int STRING_SIZE_OVERHEAD   = 1000;
    private final static String FILE_DATE_FORMAT    = "MM-dd-yyyy";
    private final static String NAME                = "ConcurrentPersister";
    private final static Logger LOGGER              = LoggerFactory.getLogger( NAME );



    public ConcurrentPersister( String location, VanillaChronicleConfig config ){
        this.chronicle      = new VanillaChronicle( location );
        this.writer         = chronicle.createAppender();
    }


   public final void appendMessage( final String message ){

        try{

            long length  =  STRING_SIZE_OVERHEAD + message.length();

            writer.startExcerpt( length );
            writer.append( message );
            writer.finish();

        }catch( Exception e ){
            LOGGER.warn("Failed to persist Message [{}]", message );
            LOGGER.warn("Exception: ", e );
        }

    }

}

上記の appendMessage(String message) メソッドは、複数のスレッドから呼び出された場合、スレッドセーフですか?

VanillaChronicle の append(String message) がスレッドセーフであることをどこかで読みました。しかし、startExcerpt() + append() + finish() の複合アクションはスレッドセーフではないという考えは正しいでしょうか?

ありがとう。

4

2 に答える 2

3

VanillaChronicle には、アペンダー/テイラーの ThreadLocal キャッシュがあります。

public VanillaAppender createAppender() throws IOException {
    WeakReference<VanillaAppender> ref = appenderCache.get();
    VanillaAppender appender = null;
    if (ref != null)
        appender = ref.get();
    if (appender == null) {
        appender = createAppender0();
        appenderCache.set(new WeakReference<VanillaAppender>(appender));
    }
    return appender;
}

数千の短い生きているスレッドがない場合は、appendMessage メソッドで createAppender を使用できます

public final void appendMessage( final String message ) {
    try {
        ExcerptAppender writer = chronicle.createAppender();
        writer.startExcerpt( STRING_SIZE_OVERHEAD + message.length() );
        writer.append( message );
        writer.finish();
    } catch( Exception e ) {
        LOGGER.warn("Failed to persist Message [{}]", message );
        LOGGER.warn("Exception: ", e );
    }
}

VanillaChronicleappend(String message)はスレッドセーフであるとどこかで読みました。startExcerpt()しかし、 + append()+の複合アクションはfinish()スレッドセーフではないという考えは正しいでしょうか?

VanillaChronicle は、各スレッドが独自のアペンダーを使用する場合、並行プロセスでも並行スレッドで使用できます。

于 2014-05-13T15:39:19.020 に答える