I am trying to drop any large messages by setting maxFrameSize=262144 and it
seems that it negotiated the setting.

2016-07-25T12:52:10.040-0700  CEF:1 | good |
wrap_mvn_com.good.activemq_osgi.activemq-gems_5.11.1 | 0.0.0 | DEBUG |
unknown | 3 | ID=147 THR=.137:61616@39196 CAT=WireFormatNegotiator            
MSG=tcp://JSUEN-W520.rim.net/10.100.153.137:61616@39196 after negotiation:
OpenWireFormat{version=10, cacheEnabled=true, stackTraceEnabled=true,
tightEncodingEnabled=true, sizePrefixDisabled=false, maxFrameSize=262144}

However, I am still seeing 64MB messages go through...

at
org.apache.activemq.openwire.v10.BaseDataStreamMarshaller.tightUnmarshalByteSequence
at org.apache.activemq.openwire.v10.WireFormatInfoMarshaller.tightUnmarshal 
at org.apache.activemq.openwire.OpenWireFormat.doUnmarshal
at org.apache.activemq.openwire.OpenWireFormat.unmarshal

The activemq code that does decide the size of the byte[] does use the
readInt() call to simply do this:
386 public final int readInt() throws IOException {
387 int ch1 = in.read();
388 int ch2 = in.read();
389 int ch3 = in.read();
390 int ch4 = in.read();
391 if ((ch1 | ch2 | ch3 | ch4) < 0)
392 throw new EOFException();
393 return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
Each instance in every dump the data in positions 104 to 107 end up giving
us the invalid byte[] size in tightUnmarshalByteSequence.
So going back to that internalBuffer byte array, if we grab the values from
POS 104 to 107:
Type|Name |Value
----------------
byte|[104]|4
byte|[105]|0
byte|[106]|0
byte|[107]|17
byte|[108]|83
byte|[109]|116
byte|[110]|97
byte|[111]|99
byte|[112]|107
byte|[113]|84
byte|[114]|114
----------------
And do the left bit shift operations we get:
4 << 24 = 67108864
0 << 16 = 0
0 << 16 = 0
17 << 0 = 17
Gives us a sum of 67,108,881 that match’s the array size: byte[67108881].

Debugger is showing the maxFrameSize on OpenWireFormat set to 262144, and
this is one of the threads using 64mb mem. But if we dive down into its
command.WireFormatInfo propreties hash, we see the max frame size is wrong.   

If we dump out all the properties of the OpenWireFormat for this one thread
they read as:

KEY                             |Value
----------------------------------------------------
CacheSize                       |1024
SizePrefixDisabled              |false
TcpNoDelayEnabled               |true
StackTraceEnabled               |true
CacheEnabled                    |true
MaxFrameSize                    |9223372036854775807
TightEncodingEnabled            |true
MaxInactivityDuration           |30000
MaxInactivityDurationInitalDelay|10000
----------------------------------------------------


Note, this occurs only when one of the node become the new broker.
How can we make sure all the openwire settings are correctly negotiated
between client and broker?







--
View this message in context: 
http://activemq.2283324.n4.nabble.com/MaxFrameSize-not-honored-and-allowing-64MB-messages-to-go-through-tp4715094.html
Sent from the ActiveMQ - Dev mailing list archive at Nabble.com.

Reply via email to