Сводка
Я пытаюсь прокси-поток трафика 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"/>