[ https://issues.jboss.org/browse/JBMESSAGING-1958?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13142481#comment-13142481 ]
Yong Hao Gao commented on JBMESSAGING-1958:
-------------------------------------------
JBMESSAGING-1851 was fixed in releases 1.4.0.sp3_cp12 (incremental version 43) and 1.4.8.GA (incremental version 44)
JBMESSAGING-1876 was fixed in releases 1.4.0.sp3_cp13 (incremental version 46) and 1.4.8.GA.SP1 (incremental version 45)
so the fix would be to write the new fields into the wire when the client version matches the above corresponding versions.
i.e.
if (clientVersion > 42)
{
out.writeLong(this.maxRetryChangeRate);
out.writeLong(this.retryChangeRateInterval);
}
if (clientVersion > 44)
{
out.writeLong(this.minTimeoutProcessTime);
}
> Backward compatibility issue caused by recent fixes
> ---------------------------------------------------
>
> Key: JBMESSAGING-1958
> URL: https://issues.jboss.org/browse/JBMESSAGING-1958
> Project: JBoss Messaging
> Issue Type: Bug
> Components: JMS Remoting
> Affects Versions: 1.4.0.SP3.CP14, 1.4.8.SP11
> Reporter: Yong Hao Gao
> Assignee: Yong Hao Gao
> Fix For: 1.4.0.SP3.CP15, 1.4.8.SP12
>
>
> In the following Jiras:
> https://issues.jboss.org/browse/JBMESSAGING-1851
> https://issues.jboss.org/browse/JBMESSAGING-1876
> We've added three more fields in ClientConnectionFactoryDelegate
> private long maxRetryChangeRate;
> private long retryChangeRateInterval;
> private long minTimeoutProcessTime;
> This will cause backward compatibility issues when JBM server talks to old clients that are not aware of those changes. To those old clients the three fields are marshalled but never read by client. This will cause marshal problems as shown in the following example stack trace:
> 20:08:46,052 INFO [MicroSocketClientInvoker] SocketClientInvoker[47f6473, bisocket://127.0.0.2:4457] got exception java.io.IOException
> 20:08:46,054 ERROR [SocketClientInvoker] Got marshalling exception, exiting
> java.io.IOException
> at java.io.DataInputStream.readFully(DataInputStream.java:197)
> at java.io.DataInputStream.readUTF(DataInputStream.java:609)
> at java.io.DataInputStream.readUTF(DataInputStream.java:564)
> at org.jboss.messaging.util.Version.read(Version.java:251)
> at org.jboss.jms.client.delegate.ClientConnectionFactoryDelegate.read(ClientConnectionFactoryDelegate.java:348)
> at org.jboss.jms.delegate.TopologyResult.read(TopologyResult.java:123)
> at org.jboss.jms.wireformat.ConnectionFactoryGetTopologyResponse.read(ConnectionFactoryGetTopologyResponse.java:70)
> at org.jboss.jms.wireformat.JMSWireFormat.read(JMSWireFormat.java:303)
> at org.jboss.remoting.transport.socket.MicroSocketClientInvoker.versionedRead(MicroSocketClientInvoker.java:917)
> at org.jboss.remoting.transport.socket.MicroSocketClientInvoker.transport(MicroSocketClientInvoker.java:603)
> at org.jboss.remoting.transport.bisocket.BisocketClientInvoker.transport(BisocketClientInvoker.java:422)
> at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:141)
> at org.jboss.remoting.Client.invoke(Client.java:1858)
> at org.jboss.remoting.Client.invoke(Client.java:718)
> at org.jboss.jms.client.delegate.ClientClusteredConnectionFactoryDelegate.org$jboss$jms$client$delegate$ClientClusteredConnectionFactoryDelegate$getTopology$aop(ClientClusteredConnectionFactoryDelegate.java:326)
> at org.jboss.jms.client.delegate.ClientClusteredConnectionFactoryDelegate.getTopology(ClientClusteredConnectionFactoryDelegate.java)
> at org.jboss.jms.client.delegate.ClientClusteredConnectionFactoryDelegate.establishCallback(ClientClusteredConnectionFactoryDelegate.java:105)
> at org.jboss.jms.client.delegate.ClientClusteredConnectionFactoryDelegate.readObject(ClientClusteredConnectionFactoryDelegate.java:84)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:483)
> at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)
> at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1896)
> at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
> at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
> at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
> at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
> at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
> at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
> at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
> at java.rmi.MarshalledObject.get(MarshalledObject.java:160)
> at org.jnp.interfaces.MarshalledValuePair.get(MarshalledValuePair.java:72)
> at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:737)
> at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:654)
> at javax.naming.InitialContext.lookup(InitialContext.java:417)
> at org.jms.client.JMSClient.getFactory(JMSClient.java:147)
--
This message was sent by Atlassian JIRA
(v6.4.11#64026)