2016-12-22 1 views
2

Ich benutze einen Binär-Encoder von Drittanbietern, der einen OutputStream verwendet. Ich Abrufen der Output von einem writeMarshallable Methode des Rangierbare diesem ähnlich ist.Chronicle Bytes 'OutputStream wiederverwenden

public void writeMarshallable(WireOut wire) { 
    OutputStream outputStream = wire.bytes().outputStream(); 
    // third party code gets the outputStream, etc. 
} 

wire.bytes() output() ‚s Implementierung erstellt eine neue StreamingOutputStream bei jedem Aufruf, das ist, was ich hoffe, zu vermeiden (überflüssige Objektzuordnung, wenn die zugrundeliegenden Bytes sich nicht tatsächlich geändert haben).

Das heißt, ich denke an einen WeakReference den gegebenen wire.bytes() Wert speichert und wenn die vorgesehenen Referenzwert (dh ==) ist identisch mit dem zuvor bereitgestellten Wert zu sehen Kontrolle:

private WeakReference<Bytes<?>> priorBytesRef = new WeakReference<>(null); 

public void writeMarshallable(WireOut wire) { 
    Bytes<?> bytes = wire.bytes(); 
    if (bytes != priorBytesRef.get()) { 
     priorBytesRef = new WeakReference<>(bytes); 
     thirdPartyEncoder = EncoderFactoryExample.from(bytes.outputStream()); 
    } 
    // utilize thirdPartyEncoder, etc. 
} 

Also meine Frage ist, ob dies ein vernünftiger Ansatz ist oder wenn Sie Chronicle Leute haben eine ratsamere Art und Weise?

danke !!

Antwort

0

Ich empfehle einen ThreadLocal zu verwenden, um eine StreamingOutputStream zu speichern.

static final ThreadLocal<StreamingOutputStream> bosTL = ThreadLocal.withInitial(StreamingOutputStream::new); 

public void writeMarshallable(WireOut wire) { 
    OutputStream out = bosTL.get().init(wire.bytes()); 
    // utilize thirdPartyEncoder, etc. 
} 
+0

Wenn die Zuweisung der Rangierbare durch eine ServiceWrapper (dh es ist eine _single_ Zuteilung durch die ServiceWrapper verwaltet wird), ist der Thread notwendig oder kann ich mit einem BytesOutputStream _class member_ bekomme einfach weg? Danke nochmal, Pete! –

+0

@ A.Oswald Das ThreadLocal wird nur benötigt, wenn Sie nicht sicher sein können, dass nur ein Thread den Stream verwendet. –

+0

Es sei denn, ich habe Versionierung oder Abhängigkeit vermasselt, ich fürchte, es gibt einen Konflikt von Bytes _type_, der von Chronicle-Queue (net.openhft.chronicle.bytes) zur Verfügung gestellt wird, was die API von BytesOutputStream erfordert (net.openhft.lang. io). Ich habe BytesOutputStream von OpenHFT/Java-Lang (v 6.8.2) bekommen. –

Verwandte Themen