I'm not sure where to ask this question.. here or at fusesource, or at
xstream.  Quite a few libraries are responsible for marshalling the data and
I think it's xstream that actually needs the data format I'm talking about.

I've succeeded in sending a MapMessage from PHP to ActiveMQ via the stomp
protocol, as long as it only contains string datatypes.  e.g.:

$body = array('map' => array('entry' => array(
        array('string' => array('orders_id', '1234')),
        array('string' => array('status', '4'))
)));

I do not know where the "map: { entry : [ ... etc" protocol is defined.  I
believe it's expected in xstream.  They don't appear on the receiving end in
the resulting MapMessage.

That map is received as a JMS MapMessage with orders_id => "1234" and status
=> "4".  Great.

My problem is that as soon as I try to send a non-string value, the message
parsing fails.  For example the most obvious change to make orders_id a long
instead of a string:

$body = array('map' => array('entry' => array(
        array('long' => array('orders_id', 1234)),
        array('string' => array('status', '4'))
)));

This sends ok from PHP, but barfs in the Java server:

"""""
Aug 7, 2011 10:18:55 PM
org.apache.activemq.transport.stomp.ProtocolConverter handleException
WARNING: Exception occurred processing: 
SEND
amq-msg-type:MapMessage
transformation:jms-map-json
destination:/queue/integration/order_update
transformation-error:For input string: "orders_id" : For input string:
"orders_id"
---- Debugging information ----
message             : For input string: "orders_id"
cause-exception     : java.lang.NumberFormatException
cause-message       : For input string: "orders_id"
class               : java.util.HashMap
required-type       : java.lang.Long
path                : /map/entry/long
line number         : -1
-------------------------------

{"map":{"entry":[{"long":["orders_id",1234],"...s","4"]}}]}}:
org.apache.activemq.transport.stomp.ProtocolException: Unsupported message
type 'MapMessage'
"""""

It is taking the string "orders_id" (NOT the value "1234") and trying to
call Long.parseLong("orders_id") which of course throws
NumberFormatException.

It seems that the processing of non-string fields no longer uses the "type:
{ key, value }" syntax.

Can anyone advise how to send non-string fields?

Just to mention,  I believe I can take the data type identifiers seen in
com/thoughtworks/xstream/XStream.java .. and the
http://xstream.codehaus.org/converters.html reference shows a MapMessage
that looks like this:

<map>
  <entry>
    <string>apple</string>
    <float>123.553</float>
  </entry>
  <entry>
    <string>orange</string>
    <float>55.4</float>
  </entry>
</map> 

Yet, simply changing 'string' to 'long' in my example seems to completely
change the expected format.

For now I can pass strings and convert them myself in the consumer but this
is clearly not the right solution in the long term.

Nick

--
View this message in context: 
http://activemq.2283324.n4.nabble.com/Format-of-stomp-MapMessages-from-PHP-string-works-long-fails-tp3725070p3725070.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.

Reply via email to