activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jim Gomes (JIRA)" <j...@apache.org>
Subject [jira] Commented: (AMQNET-53) Marshaling NULL BytesMessage in StompWireFormat throws exception
Date Thu, 06 Sep 2007 00:21:23 GMT

    [ https://issues.apache.org/activemq/browse/AMQNET-53?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_40080
] 

Jim Gomes commented on AMQNET-53:
---------------------------------

A correlating change must be made in order to get empty BytesMessages to work correctly in
the STOMP protocol implementation.  The StompFrameStream.Flush() method in StompFrameStream.cs
file should be changed to the following.  The check for zero content length should be a less-than
or equal comparison, not just a less-than comparison.

{code:java|title=StompFrameStream.cs|borderStyle=solid}
public void Flush()
{
	builder.Append(NEWLINE);
	ds.Write(encoding.GetBytes(builder.ToString()));

	if (content != null)
	{
		ds.Write(content);
	}

	// if no content length then lets write a null
	if (contentLength <= 0)
	{
		ds.Write(NULL);
	}
}
{code}


> Marshaling NULL BytesMessage in StompWireFormat throws exception
> ----------------------------------------------------------------
>
>                 Key: AMQNET-53
>                 URL: https://issues.apache.org/activemq/browse/AMQNET-53
>             Project: ActiveMQ .Net
>          Issue Type: Bug
>          Components: Stomp
>         Environment: Windows XP SP2, .NET 2.0
>            Reporter: Jim Gomes
>            Assignee: James Strachan
>   Original Estimate: 15 minutes
>  Remaining Estimate: 15 minutes
>
> When marshalling a BytesMessage that has a NULL message body (only properties are set
on the message) an exception is thrown within the WriteMessage() function.  Following is a
replacement version that will work correctly.  A NULL pointer check is added to the content
of the message.  This only occurs with the STOMP protocol.  The OpenWire implementation correctly
handles the NULL message body in a BytesMessage.
> {code:java|title=StompWireFormat.cs Replacement for WriteMessage()|borderStyle=solid}
> protected virtual void WriteMessage(ActiveMQMessage command, StompFrameStream ss)
> {
> 	ss.WriteCommand(command, "SEND");
> 	ss.WriteHeader("destination", StompHelper.ToStomp(command.Destination));
> 	if (command.ReplyTo != null)
> 		ss.WriteHeader("reply-to", StompHelper.ToStomp(command.ReplyTo));
> 	if (command.CorrelationId != null )
> 		ss.WriteHeader("correlation-id", command.CorrelationId);
> 	if (command.Expiration != 0)
> 		ss.WriteHeader("expires", command.Expiration);
> 	if (command.Priority != 4)
> 		ss.WriteHeader("priority", command.Priority);
> 	if (command.Type != null)
> 		ss.WriteHeader("type", command.Type);            
> 	if (command.TransactionId!=null)
> 		ss.WriteHeader("transaction", StompHelper.ToStomp(command.TransactionId));
> 		    
> 	ss.WriteHeader("persistent", command.Persistent);
> 			
> 	// lets force the content to be marshalled
> 			
> 	command.BeforeMarshall(null);
> 	if (command is ActiveMQTextMessage)
> 	{
> 		ActiveMQTextMessage textMessage = command as ActiveMQTextMessage;
> 		ss.Content = encoding.GetBytes(textMessage.Text);
> 	}
> 	else
> 	{
> 		ss.Content = command.Content;
> 		if (null != command.Content)
> 		{
> 			ss.ContentLength = command.Content.Length;
> 		}
> 		else
> 		{
> 			ss.ContentLength = 0;
> 		}
> 	}
> 	
> 	IPrimitiveMap map = command.Properties;
> 	foreach (string key in map.Keys)
> 	{
> 		ss.WriteHeader(key, map[key]);
> 	}
> 	ss.Flush();
> }
> {code}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message