Browse Source
When decoding STOMP messages unread portions of a given input ByteBuf must be kept until more input is received and the next complete STOMP frame can be parsed. In Reactor Net 2.x this was handled for us through the "remainder" field in NettyChannelHandlerBridge. The Reactor Netty 0.6 upgrade however applied only a simple map operator on the input ByteBuf after which the buffer is relased. This commit replaces the use of a simple map operator for decoding and installs a ByteToMessageDecoder in the Netty channel pipeline which has a built-in ability to preserve and merge unread input into subsequent input buffers.pull/1277/head
5 changed files with 120 additions and 35 deletions
@ -0,0 +1,53 @@
@@ -0,0 +1,53 @@
|
||||
/* |
||||
* Copyright 2002-2016 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package org.springframework.messaging.tcp.reactor; |
||||
|
||||
import java.nio.ByteBuffer; |
||||
import java.util.Collection; |
||||
import java.util.List; |
||||
|
||||
import io.netty.buffer.ByteBuf; |
||||
|
||||
import org.springframework.messaging.Message; |
||||
|
||||
/** |
||||
* Convenient base class for {@link ReactorNettyCodec} implementations that need |
||||
* to work with NIO {@link ByteBuffer}s. |
||||
* |
||||
* @author Rossen Stoyanchev |
||||
* @since 5.0 |
||||
*/ |
||||
public abstract class AbstractNioBufferReactorNettyCodec<P> implements ReactorNettyCodec<P> { |
||||
|
||||
@Override |
||||
public Collection<Message<P>> decode(ByteBuf inputBuffer) { |
||||
ByteBuffer nioBuffer = inputBuffer.nioBuffer(); |
||||
int start = nioBuffer.position(); |
||||
List<Message<P>> messages = decodeInternal(nioBuffer); |
||||
inputBuffer.skipBytes(nioBuffer.position() - start); |
||||
return messages; |
||||
} |
||||
|
||||
protected abstract List<Message<P>> decodeInternal(ByteBuffer nioBuffer); |
||||
|
||||
@Override |
||||
public void encode(Message<P> message, ByteBuf outputBuffer) { |
||||
outputBuffer.writeBytes(encodeInternal(message)); |
||||
} |
||||
|
||||
protected abstract ByteBuffer encodeInternal(Message<P> message); |
||||
|
||||
} |
||||
Loading…
Reference in new issue