|
RSS Feed - WebSphere MQ Support
|
RSS Feed - Message Broker Support
|
 |
|
MQI 2.1 - issues with MRM XML layer |
« View previous topic :: View next topic » |
Author |
Message
|
olivier |
Posted: Sat Jan 12, 2002 3:51 am Post subject: |
|
|
Newbie
Joined: 11 Jan 2002 Posts: 1
|
I've been testing the new MQI 2.1 release (with CSD #00). The new features (over previous 2.02 release) seem really interesting.
But might also be some issues.
I've been playing with XML messages, comparing the 'XML domain parser' and the 'MRM domain parser with XML layer'.
I built 2 basic flows, converting an XML message from one parser to the other one:
flow 1 : XML -> MRM-XML
flow 2 : MRM-XML -> XML
I expected to get the same XML message on each side, as I populated my MRM message set by importing my DTD.
My XML message:
tralala
My DTD:
The XML domain corresponding tree:
(
(0x1000000)Properties = (
(0x3000000)MessageSet = ''
(0x3000000)MessageType = ''
(0x3000000)MessageFormat = ''
.......
)
(0x1000000)MQMD = (
(0x3000000)SourceQueue = 'testOP_IN_XMLMRM'
.......
)
(0x1000010)XML = (
(0x1000000)mess = (
(0x1000000)texte = (
(0x2000000) = 'tralala'
)
)
)
)
The MRM-XML domain corresponding tree :
(
(0x1000000)Properties = (
(0x3000000)MessageSet = 'DOEOU2C076001'
(0x3000000)MessageType = 'm_mess'
(0x3000000)MessageFormat = 'XML'
.......
)
(0x1000000)MQMD = (
(0x3000000)SourceQueue = 'testOP_IN_MRMXML'
.......
)
(0x1000008)MRM = (
(0x1000001)mess = (
(0x3000012)texte = 'tralala'
)
)
)
First issue:
----------------
The MRM-XML side message has an additional and non expected tag:
tralala
I can't get rid of this tag, and I get a parse exception if the input message doesn't have this tag.
Why ???
Second issue:
---------------------
The XML -> MRM-XML flow is very unstable. Without modifying it, it works, then fails, then works again ...
I get unexpected exceptions on the MQOutput node:
(
(0x1000000)RecoverableException = (
(0x3000000)File = 'F:buildS210_PsrcDataFlowEngineImbDataFlowNode.cpp'
(0x3000000)Line = 536
(0x3000000)Function = 'ImbDataFlowNode::createExceptionList'
(0x3000000)Type = 'ComIbmMQInputNode'
(0x3000000)Name = 'c8d60347-eb00-0000-0080-aa810504c0a0'
(0x3000000)Label = 'testOP_XMLMRM.MQInput testOP_IN_XMLMRM'
(0x3000000)Text = 'Node throwing exception'
(0x3000000)Catalog = 'WMQIv210'
(0x3000000)Severity = 3
(0x3000000)Number = 2230
(0x1000000)RecoverableException = (
(0x3000000)File = 'F:buildS210_PsrcDataFlowEngineImbMqOutputNode.cpp'
(0x3000000)Line = 708
(0x3000000)Function = 'ImbMqOutputNode::evaluate'
(0x3000000)Type = 'ComIbmMQOutputNode'
(0x3000000)Name = 'cef30347-eb00-0000-0080-aa810504c0a0'
(0x3000000)Label = 'testOP_XMLMRM.MQOutput testOP_OUT'
(0x3000000)Text = 'Caught exception and rethrowing'
(0x3000000)Catalog = 'WMQIv210'
(0x3000000)Severity = 3
(0x3000000)Number = 2230
(0x1000000)ParserException = (
(0x3000000)File = 'F:buildS210_Psrccpipwfxmlxmldictionaryinfo.cpp'
(0x3000000)Line = 248
(0x3000000)Function = 'XMLDictionaryInfo::XMLStructDefs::getIndex'
(0x3000000)Type = ''
(0x3000000)Name = ''
(0x3000000)Label = ''
(0x3000000)Text = 'XML Worker Internal Error'
(0x3000000)Catalog = 'WMQIv210'
(0x3000000)Severity = 3
(0x3000000)Number = 5401
(0x1000000)Insert = (
(0x3000000)Type = 5
(0x3000000)Text = 'Counldn't find the tag id (&1) in the dictionary'
)
(0x1000000)Insert = (
(0x3000000)Type = 2
(0x3000000)Text = '7209065'
)
)
)
)
)
This is quite disturbing.
Have anyone experienced such instabilities ?
PS: I have only 256M ram one my laptop. Could this be related ?
|
|
Back to top |
|
 |
zpat |
Posted: Mon Jan 14, 2002 4:42 am Post subject: |
|
|
 Jedi Council
Joined: 19 May 2001 Posts: 5866 Location: UK
|
Try changing the XML tag name "m_mess" to "mess" in the MRM message set.
You will find after importing a DTD - that is necessary to edit the XML tag names that are generated by the importer. I expect this to be corrected in CSD 1. To do this select the XML format tab in the message set.
NOTE: Always add an XML physical format to the message set before importing a DTD.
I'm sure that it's not caused by your RAM size, but if you can increase it then things will run faster.
[ This Message was edited by: zpat on 2002-01-14 04:52 ] |
|
Back to top |
|
 |
mpuetz |
Posted: Tue Jan 15, 2002 4:50 pm Post subject: |
|
|
Centurion
Joined: 05 Jul 2001 Posts: 149 Location: IBM/Central WebSphere Services
|
Hi,
MRM and standard XML parser are different in the way they represent tags with values.
The XML parser represents
<texte>tralala</texte>
with two elements
1. a pure name element with name "texte"
2. a pure value element with value "tralala" which is the first child of the name element "texte"
The MRM parser does it in simpler fashion with
just a single name-value element with property name being "texte" and the value being "tralala".
By the way the numbers you see in the trace node have the following meaning:
a leading 1 means : name element
a 2 means : value element
a 3 means : name-value element
These digits are parser *independent*, hence
they will keep their meaning when you copy from parser domain into the other. The problem is not all parsers support pure value elements (actually I am only aware of the standard XML
parser supporting these, all others use only name and name-value elements). Hence you will into trouble if you are copying message trees from one parsers domain into another, e.g.
SET OutputRoot.MRM.abc = InputRoot.XML.abc;
if the the representation of the right hand tree cannot be uniquely represented in the tree structure supported by the left parser.
The tree copy routine would convert your
name
value
structure in the XML tree into a
name-value
structure in the MRM tree and vice versa.
You may think that MRM's way of doing it seems more natural at first, but it is less flexible .
It won't allow you to represent a (valid) XML message like
<texte>tralala<subtext>blabla</subtext>yahoo</texte>
but the XML parser can:
name (texte)
- value (tralala)
- name (subtext)
- value (blabla)
- value (yahoo)
this means texte has two values, "tralala" and "yahoo".
If you access the value of texte in ESQL
SET text = InputRoot.XML.texte;
you will always get the first value. To access the second you would have to do something like
SET text = InputRoot.XML.texte.(XML.value)[2];
using a qualifying wildcard (XML.value).
The MRM parser cannot represent a structure like this with its pure name and name-value
elements.
Lesson learned: different parsers do different things and copying between them will typically be lossy. The MRM XML layer doesn't allow all XML structures to be represented, hence if you need full XML support use the standard XML parser. Read the MQSI Programming Guide to deepen your understanding of how parsers work.
PS: If you wonder what the rightmost digits in the numbers in front of elements in trace files are, they represent the parser specific subtypes (e.g. that's how the XML parser disinguishes between whitespace and regular values elements ans such).
_________________ Mathias Puetz
IBM/Central WebSphere Services
WebSphere Business Integration Specialist |
|
Back to top |
|
 |
|
|
 |
|
Page 1 of 1 |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|
|
|