Buggy code:
class ChannelAssociation { private static final Logger logger = Logger . getLogger ( ChannelAssociation . class ) ; private final RemotingConnectionEJBReceiver ejbReceiver ; private final EJBReceiverContext ejbReceiverContext ; private final Channel channel ; private final byte protocolVersion ; private final MarshallerFactory marshallerFactory ; private final AtomicInteger nextInvocationId = new AtomicInteger ( 0 ) ; private Map < Short , EJBReceiverInvocationContext > waitingMethodInvocations = Collections . synchronizedMap ( new HashMap < Short , EJBReceiverInvocationContext > ( ) ) ; private Map < Short , FutureResult < EJBReceiverInvocationContext . ResultProducer > > waitingFutureResults = Collections . synchronizedMap ( new HashMap < Short , FutureResult < EJBReceiverInvocationContext . ResultProducer > > ( ) ) ; ChannelAssociation ( final RemotingConnectionEJBReceiver ejbReceiver , final EJBReceiverContext ejbReceiverContext , final Channel channel , final byte protocolVersion , final MarshallerFactory marshallerFactory ) { } Channel getChannel ( ) { } EJBReceiverContext getEjbReceiverContext ( ) { } short getNextInvocationId ( ) { } void receiveResponse ( final short invocationId , final EJBReceiverInvocationContext ejbReceiverInvocationContext ) { } Future < EJBReceiverInvocationContext . ResultProducer > enrollForResult ( final short invocationId ) { } void resultReady ( final short invocationId , final EJBReceiverInvocationContext . ResultProducer resultProducer ) { } void handleAsyncMethodNotification ( final short invocationId ) { } EJBReceiverInvocationContext getEJBReceiverInvocationContext ( short invocationId ) { } private ProtocolMessageHandler getProtocolMessageHandler ( final byte header ) { } private void notifyBrokenChannel ( final IOException ioException ) { } private class ResponseReceiver implements Channel . Receiver { @ Override public void handleError ( Channel channel , IOException error ) { } @ Override public void handleEnd ( Channel channel ) { } @ Override public void handleMessage ( Channel channel , MessageInputStream messageInputStream ) { try { final int header = messageInputStream . read ( ) ; if ( ChannelAssociation . logger . isTraceEnabled ( ) ) { ChannelAssociation . logger . trace ( ( "Received<seq2seq4repair_space>message<seq2seq4repair_space>with<seq2seq4repair_space>header<seq2seq4repair_space>0x" + ( Integer . toHexString ( header ) ) ) ) ; } final ProtocolMessageHandler messageHandler = ChannelAssociation . this . getProtocolMessageHandler ( ( ( byte ) ( header ) ) ) ; if ( messageHandler == null ) { ChannelAssociation . logger . warn ( ( "Unsupported<seq2seq4repair_space>message<seq2seq4repair_space>received<seq2seq4repair_space>with<seq2seq4repair_space>header<seq2seq4repair_space>0x" + ( Integer . toHexString ( header ) ) ) ) ; return ; } messageHandler . processMessage ( messageInputStream ) ; } catch ( IOException e ) { <START_BUG> throw new RuntimeException ( e ) ; <END_BUG> } finally { channel . receiveMessage ( this ) ; } } } private class UnusableChannelResultProducer implements EJBReceiverInvocationContext . ResultProducer { private final IOException ioException ; UnusableChannelResultProducer ( final IOException ioexception ) { } @ Override public Object getResult ( ) throws Exception { } @ Override public void discardResult ( ) { } } }

Fix:
this . handleError ( channel , e ) ;