2016-12-22 2 views
2

Я использую сторонний двоичный кодер, который принимает OutputStream. Я извлекать OutputStream из метода Marshallable в writeMarshallable подобного этот:.Повторное использование Хроники Bytes 'OutputStream

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

wire.bytes() OutputStream() «s реализация создает новую StreamingOutputStream при каждом вызове, что и я надеюсь (избыточное распределение объектов, когда базовые байты фактически не изменилось).

То есть, я имею в виду о сохранении WeakReference к данным wire.bytes() значению и проверкам, чтобы увидеть, если ссылка Указаного значения (то есть ==) идентична ранее переданное значение:

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. 
} 

Таким образом, мой вопрос заключается в том, является ли это разумным подходом, или если у вас есть хроники у людей более целесообразным способом?

спасибо !!

ответ

0

Предлагаю использовать ThreadLocal для сохранения StreamingOutputStream.

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

Если распределение в Marshallable является путем в ServiceWrapper (то есть, это распределение _single_ управляется ServiceWrapper), является ThreadLocal необходимым или я могу просто уйти с BytesOutputStream _class member_? Еще раз спасибо, Пит! –

+0

@ A.Oswald ThreadLocal нужен только в том случае, если вы не можете быть уверены, что только один поток будет использовать поток. –

+0

Если у меня нет ни управления версиями, ни зависимостей, я боюсь, что существует конфликт Bytes _type_, предоставляемый Chronicle-Queue (net.openhft.chronicle.bytes) против того, что требует api от BytesOutputStream (net.openhft.lang. -й). Я получал BytesOutputStream из OpenHFT/Java-Lang (v 6.8.2). –

Смежные вопросы