Introduce a new abstract class called OneToOneStrictEncoder which helps to ensure strict ordering. This should be used if that is needed like in the case of ZIP. See ##546
This commit is contained in:
parent
8b4f593397
commit
e685e535f9
@ -29,7 +29,7 @@ import org.jboss.netty.channel.ChannelHandlerContext;
|
||||
import org.jboss.netty.channel.ChannelStateEvent;
|
||||
import org.jboss.netty.channel.Channels;
|
||||
import org.jboss.netty.channel.LifeCycleAwareChannelHandler;
|
||||
import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
|
||||
import org.jboss.netty.handler.codec.oneone.OneToOneStrictEncoder;
|
||||
|
||||
|
||||
/**
|
||||
@ -37,7 +37,7 @@ import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
|
||||
* @apiviz.landmark
|
||||
* @apiviz.has org.jboss.netty.handler.codec.compression.ZlibWrapper
|
||||
*/
|
||||
public class JdkZlibEncoder extends OneToOneEncoder implements LifeCycleAwareChannelHandler {
|
||||
public class JdkZlibEncoder extends OneToOneStrictEncoder implements LifeCycleAwareChannelHandler {
|
||||
|
||||
private final byte[] out = new byte[8192];
|
||||
private final Deflater deflater;
|
||||
|
@ -27,7 +27,7 @@ import org.jboss.netty.channel.ChannelHandlerContext;
|
||||
import org.jboss.netty.channel.ChannelStateEvent;
|
||||
import org.jboss.netty.channel.Channels;
|
||||
import org.jboss.netty.channel.LifeCycleAwareChannelHandler;
|
||||
import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
|
||||
import org.jboss.netty.handler.codec.oneone.OneToOneStrictEncoder;
|
||||
import org.jboss.netty.util.internal.jzlib.JZlib;
|
||||
import org.jboss.netty.util.internal.jzlib.ZStream;
|
||||
|
||||
@ -37,7 +37,7 @@ import org.jboss.netty.util.internal.jzlib.ZStream;
|
||||
* @apiviz.landmark
|
||||
* @apiviz.has org.jboss.netty.handler.codec.compression.ZlibWrapper
|
||||
*/
|
||||
public class ZlibEncoder extends OneToOneEncoder implements LifeCycleAwareChannelHandler {
|
||||
public class ZlibEncoder extends OneToOneStrictEncoder implements LifeCycleAwareChannelHandler {
|
||||
|
||||
private static final byte[] EMPTY_ARRAY = new byte[0];
|
||||
|
||||
|
@ -57,13 +57,20 @@ public abstract class OneToOneEncoder implements ChannelDownstreamHandler {
|
||||
}
|
||||
|
||||
MessageEvent e = (MessageEvent) evt;
|
||||
if (!doEncode(ctx, e)) {
|
||||
ctx.sendDownstream(e);
|
||||
}
|
||||
}
|
||||
|
||||
protected boolean doEncode(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
|
||||
Object originalMessage = e.getMessage();
|
||||
Object encodedMessage = encode(ctx, e.getChannel(), originalMessage);
|
||||
if (originalMessage == encodedMessage) {
|
||||
ctx.sendDownstream(evt);
|
||||
return false;
|
||||
} else if (encodedMessage != null) {
|
||||
write(ctx, e.getFuture(), encodedMessage, e.getRemoteAddress());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright 2012 The Netty Project
|
||||
*
|
||||
* The Netty Project licenses this file to you 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.jboss.netty.handler.codec.oneone;
|
||||
|
||||
import org.jboss.netty.channel.ChannelHandlerContext;
|
||||
import org.jboss.netty.channel.MessageEvent;
|
||||
|
||||
/**
|
||||
* Special {@link OneToOneEncoder} which enforce strict ordering of encoding and writing. This
|
||||
* class should get extend by implementations that needs this enforcement to guaranteer no corruption.
|
||||
* Basically all "message" based {@link OneToOneEncoder} mostly don't need this, where "stream" based
|
||||
* are often in need of it.
|
||||
*
|
||||
*/
|
||||
public abstract class OneToOneStrictEncoder extends OneToOneEncoder {
|
||||
|
||||
@Override
|
||||
protected boolean doEncode(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
|
||||
// Synchronize on the channel to guaranteer the strict ordering
|
||||
synchronized (ctx.getChannel()) {
|
||||
return super.doEncode(ctx, e);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user