Полезная нагрузка сообщения после сериализации больше, чем должна быть - PullRequest
0 голосов
/ 06 февраля 2019

Сводка

Я пытаюсь прокси-поток трафика TCP через мое приложение Spring Integration.У меня есть тестовая полезная нагрузка, которая представляет собой массив байтов, и его общая длина составляет 291 байт.Первые два байта - это шестнадцатеричный заголовок длины, а остальные 289 байтов - это сами данные.

Первоначально я использовал ByteArrayLengthHeaderSerializer со значением заголовка 2 вместе с моим TcpNetServerConnectionFactory.

Сообщение получено TcpReceivingChannelAdapter, подключенным к моему TcpNetServerConnectionFactory.Он помещается на канал непосредственно в ServiceActivator, который получает объект Message в качестве параметра.

В этом методе я извлекаю полезную нагрузку, используя message.getPayload(), а затем передаю Object в SerializationUtils.serialize() чтобы вернуться к байтовому массиву.Когда я печатаю array.length, это 316, а не 289.

Почему полезная нагрузка больше?Я не понимаю, что это за дополнительные байты, и я не могу проксировать его в восходящем направлении, потому что он теперь неправильно отформатирован.

Фон

Моя первая идея состояла в том, что 2-байтовый заголовок не был 'отформатирован правильно для использования с ByteArrayLengthHeaderSerializer.Поэтому, чтобы быть уверенным, я расширил этот класс и сам внедрил readHeader().Как видите, я печатаю длину до System.err, и она работает как положено - я получаю 289.

Однако, когда я конвертирую / печатаю размер полезной нагрузки в моем Service Activator, размер полезной нагрузки все еще остаетсявыше 300. Между моим сериализатором и Service Activator нет других конечных точек обмена сообщениями, поэтому я опять не понимаю, откуда поступают эти дополнительные байты.

В таком случае, возможно, ByteArrayLengthHeaderSerializer былоработает нормально, так как у меня все еще есть эта проблема, хотя я подтвердил, что длина достигает 289, прежде чем он достигнет Service Activator.

Независимо от того, какой Serializer я использую, как увеличивается размер полезной нагрузки?

Код

Пользовательский ByteArrayLengthHeaderSerializer

@Override
protected int readHeader(InputStream inputStream) throws IOException {
    byte[] lengthPart = new byte[2];

    if (inputStream.read(lengthPart, 0, 2) != 2) {
        throw new IOException();
    }

    int length = ByteBuffer.wrap(lengthPart).getShort();

    System.err.println(length);

    return length;
}

Метод активации службы

public Message editRequest(Message message) {
    byte[] payload = SerializationUtils.serialize(message.getPayload());

    System.err.println("payload length: " + payload.length);

    return message;
}

Компоненты интеграции

<int:channel id="requestChannelPreEdit">
    <int:queue capacity="100"/>
</int:channel>

<int:poller id="defaultPoller"
    default="true"
    fixed-delay="50"
    receive-timeout="5000">
</int:poller>

<bean id="headerSerializer"
    class="CustomByteArrayLengthHeaderSerializer">
</bean>

<int-ip:tcp-connection-factory id="serverFactory"
    type="server"
    port="6060"
    serializer="headerSerializer"
    deserializer="headerSerializer"/>

 <int-ip:tcp-inbound-channel-adapter id="inboundRequestAdapter"
    channel="requestChannelPreEdit"
    connection-factory="serverFactory"/>

<bean id="requestEditor"
    class="RequestEditor"/>

<int:service-activator id="requestEditorSA"
    input-channel="requestChannelPreEdit"
    ref="requestEditor"
    method="editRequest"/>

1 Ответ

0 голосов
/ 06 февраля 2019

и последующей передачи этого объекта в SerializationUtils.serialize () для возврата в байтовый массив

.

byte[] payload = SerializationUtils.serialize(message.getPayload());

Нет необходимости делать это вообще;полезная нагрузка уже byte[] (созданная сериализатором заголовка длины).

Конечно, применение сериализации к существующему byte[] будет в итоге больше, потому что оно добавляет метаданные (магические числа, информация о типе и т. д.).

Просто измените услугу на

public Message editRequest(Message<byte[]> message) {
    byte[] payload = message.getPayload();
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...