MQ ESQL ComputeNode 的 InputRoot 和 InputBody 为 NULL
InputRoot and InputBody are NULL for MQ ESQL ComputeNode
我的任务是创建一个新流程,但出于某种原因我无法访问来自 'IN' 队列的数据。我在 windows 中使用 MessageBrokerToolkit 7.0.0.1。测试消息与生产中使用的消息相同。
CREATE COMPUTE MODULE FLOW_Compute
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
DECLARE TMP ROW PASSTHRU('SELECT RAWTOHEX(UTL_RAW.CAST_TO_RAW(DBMS_OBFUSCATION_TOOLKIT.md5(INPUT_STRING => CURRENT_TIMESTAMP)))UNIQUE_ID FROM DUAL');
DECLARE blobMSG BLOB InputRoot.BLOB.BLOB;
DECLARE MSG CHARACTER CAST(blobMSG AS CHARACTER CCSID InputRoot.MQMD.CodedCharSetId ENCODING InputRoot.MQMD.Encoding);
DECLARE TITLE CHAR InputRoot.XML.Request."MessageID";
PASSTHRU(
'INSERT INTO PA0101.DEBUG_TABLE VALUES(?,?,?)',
TMP.UNIQUE_ID,
TITLE,
MSG,
);
RETURN TRUE;
END;
DEBUG_TABLE 行结果如下:
(竖线分隔)
F69A159|||
11C7EBF|||
1077ADD|||
这是一个示例消息:
<Request>
<MessageID>a1f5298a-e339-423b-ac9a-4654cb46e965</MessageID>
<SendResponse>false</SendResponse>
<BasicElements>
<FeedType>Realtime</FeedType>
<MsgDT>08/09/2015</MsgDt>
<Category>Action</Category>
<PriorityCd>1</PriorityCd>
<SubjectTx>This is important</SubjectTx>
<DetailTx>[lots of html]</DetailTx>
</BasicElements>
</Request>
当我尝试 运行 服务器上的命令行实用程序时,我通常得到:
<command>
ld.so.1: <command>: fatal: libjvm.so: open failed: No such file or directory
Killed
该代码不会产生任何警告,并且 .bar 文件会构建 + 部署,所以我对可能出现的问题一头雾水。
很可能您没有使用 ESQL 中输入节点上设置的消息域。
您不能同时使用 XML 和 BLOB 域,输入消息将在一个或另一个域中解析,如在输入节点(或流中的 ResetContentDescriptor 节点)上配置的那样).
因此 InputRoot.BLOB 或 InputRoot.XML 将为 NULL。我认为您实际上在输入节点中使用 XMLNSC 域,并且可以在 InputRoot.XMLNSC.
下访问在该域中解析的消息正文
如果您需要在同一流程中将消息体作为 BLOB 并解析为 XML,则应在输入节点中将消息域设置为 BLOB,并在流程后面使用ResetContentDescriptor 节点,或使用 ESQL 中 CREATE 的 PARSE 选项:
我的任务是创建一个新流程,但出于某种原因我无法访问来自 'IN' 队列的数据。我在 windows 中使用 MessageBrokerToolkit 7.0.0.1。测试消息与生产中使用的消息相同。
CREATE COMPUTE MODULE FLOW_Compute
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
DECLARE TMP ROW PASSTHRU('SELECT RAWTOHEX(UTL_RAW.CAST_TO_RAW(DBMS_OBFUSCATION_TOOLKIT.md5(INPUT_STRING => CURRENT_TIMESTAMP)))UNIQUE_ID FROM DUAL');
DECLARE blobMSG BLOB InputRoot.BLOB.BLOB;
DECLARE MSG CHARACTER CAST(blobMSG AS CHARACTER CCSID InputRoot.MQMD.CodedCharSetId ENCODING InputRoot.MQMD.Encoding);
DECLARE TITLE CHAR InputRoot.XML.Request."MessageID";
PASSTHRU(
'INSERT INTO PA0101.DEBUG_TABLE VALUES(?,?,?)',
TMP.UNIQUE_ID,
TITLE,
MSG,
);
RETURN TRUE;
END;
DEBUG_TABLE 行结果如下: (竖线分隔)
F69A159|||
11C7EBF|||
1077ADD|||
这是一个示例消息:
<Request>
<MessageID>a1f5298a-e339-423b-ac9a-4654cb46e965</MessageID>
<SendResponse>false</SendResponse>
<BasicElements>
<FeedType>Realtime</FeedType>
<MsgDT>08/09/2015</MsgDt>
<Category>Action</Category>
<PriorityCd>1</PriorityCd>
<SubjectTx>This is important</SubjectTx>
<DetailTx>[lots of html]</DetailTx>
</BasicElements>
</Request>
当我尝试 运行 服务器上的命令行实用程序时,我通常得到:
<command>
ld.so.1: <command>: fatal: libjvm.so: open failed: No such file or directory
Killed
该代码不会产生任何警告,并且 .bar 文件会构建 + 部署,所以我对可能出现的问题一头雾水。
很可能您没有使用 ESQL 中输入节点上设置的消息域。
您不能同时使用 XML 和 BLOB 域,输入消息将在一个或另一个域中解析,如在输入节点(或流中的 ResetContentDescriptor 节点)上配置的那样). 因此 InputRoot.BLOB 或 InputRoot.XML 将为 NULL。我认为您实际上在输入节点中使用 XMLNSC 域,并且可以在 InputRoot.XMLNSC.
下访问在该域中解析的消息正文如果您需要在同一流程中将消息体作为 BLOB 并解析为 XML,则应在输入节点中将消息域设置为 BLOB,并在流程后面使用ResetContentDescriptor 节点,或使用 ESQL 中 CREATE 的 PARSE 选项: