在一个项目的用例中我遇到了一个奇怪的情况:ESQL正在调用一个java方法,向它发送一个String输入参数,该方法将解组,应用一些逻辑,然后存储来自unmarshalled对象的有用信息.因此,该方法必须抛出JAXBException,或者使用try catch来处理可能的异常.
这个问题是,ESQL无法调用包含签名中的throws的java方法.但是,我们希望任何错误都可以回到之前调用的MBNode,因此可以在那里进行适当的处理,因此trycatch不在图片之内.
让我感到震惊的是,遇到问题时是不可能返回一种Exception,如果没有则返回null?所以我写了一个简单的方法,虽然我没有得到任何警告或错误,但从良好的编程意义上来说,这似乎是错误的.
例如:
public Exception doStuffAndCheckForErorrs(String inString)
{
if(inString.equals(null))
{
return new Exception("Your string is null");
}
else
return null;
}
Run Code Online (Sandbox Code Playgroud)
但是我对这样做有什么不好的感觉.
我愿意接受任何想法或不同的解决方案,特别是如果有解决ESQL签名问题的方法.
更新:
添加有关ESQL过程无法在签名中使用throws子句调用java方法的参考.
摘自CREATE PROCEDURE语句部分下的此链接:
"您要调用的任何Java方法都必须具有以下基本签名:public static(<0 - N parameters>)其中必须位于ESQL到Java数据类型映射表中的Java IN数据类型列表中(不包括REFERENCE类型,不允许作为返回值)或Java void数据类型.参数数据类型也必须在ESQL到Java数据类型映射表中.此外,Java方法不允许有异常在其签名中抛出条款."
java error-handling exception ibm-integration-bus extended-sql
我在esql(IBM Websphere Message Broker)中有一个子流,我需要在其中实现类似于select distinct
功能的功能。
一些背景:我在Oracle数据库中有一个表group_errcode_ref
。该表几乎是ERROR_CODE
and 的固定链接/映射ID
。ERROR_CODE
是唯一的,但ID
可以重复。例如,错误代码4000和4001都可以链接到ID 1。
在我的esql子流中,我有一系列错误代码,这些错误代码根据进入该流的当前数据而有所不同。
所以我需要做的是获取输入错误代码数组,并ID
从表中为数组中的所有错误代码选择group_errcode_ref
我现在所拥有的:
declare db rows;
set db.rows[] = (select d.ID from Database.group_errcode_ref as d where d.ERROR_CODE in (select D from errCodes.Code[] as D);
Run Code Online (Sandbox Code Playgroud)
errCodes
是来自输入的错误代码的数组。row
是与错误代码对应的所有ID的数组。
很好,但是我想从db.rows[]
数组中删除重复项。
我不确定在esql中执行此操作的最佳方法,但它不支持distinct
。group by
, 要么order by
我将一些信息存储MbGlobalMap
在IBM Integration Bus 的(嵌入式全局高速缓存)中。如果地图被调用,EXAMPLE.MAP
我可以按如下方式访问值:
MbGlobalMap map = MbGlobalMap.getGlobalMap("EXAMPLE.MAP");
Object value = map.get(key);
Run Code Online (Sandbox Code Playgroud)
但是EXAMPLE.MAP
,即使我不知道地图的所有键,我也想获取的所有值。我无法迭代MbGlobalMap
和强制转换java.util.Map
完全不起作用。
这是该类的文档:https : //www.ibm.com/support/knowledgecenter/SSMKHH_9.0.0/com.ibm.etools.mft.plugin.doc/com/ibm/broker/plugin/MbGlobalMap.html。没有提供方法来返回Map中的所有元素。
解决方法可能是其中包含所有当前键的列表,因此您可以获取此列表,并可以获取地图内的所有值。但是我认为这不是一个干净的解决方案。
如何在ESQL中将从外部系统检索到的JSON响应转换为有意义的数据(键/值对)?
检索的JSON:
{
"data": [
{
"name": "application.info.header",
"value": "headerValue"
},
{
"name": "entity.statistics.name.fullName",
"value": "fullNameValue"
},
{
"name": "application.info.matter",
"value": "matterValue"
},
{
"name": "entity.statistics.skill",
"value": "skillValue"
}
]
}
Run Code Online (Sandbox Code Playgroud)
哪里,
name
〜JSON的层次结构(最后一个属性是关键)
value
〜对关键的价值
预期的JSON:
{
"data": {
"application": {
"info": {
"header": "headerValue",
"matter": "matterValue"
}
},
"entity": {
"statistics": {
"name": {
"fullName": "fullNameValue"
},
"skill": "skillValue"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
不用说,这可以通过Java中的Split
方法轻松实现-我正在寻找ESQL中合适的方法。
当前的ESQL模块:
CREATE COMPUTE MODULE getDetails_prepareResponse
CREATE FUNCTION Main() RETURNS BOOLEAN …
Run Code Online (Sandbox Code Playgroud) esql中CURRENT_TIME函数的默认格式是什么?我们如何根据我们的要求更改它(24小时或12小时格式)
我正在尝试将WMB 7映射节点转换为IIB 9节点.自动转换过程将一些ESQL函数转换为XQuery函数.
具体来说,它改变了ESQL功能
COALESCE (var0, var1)
Run Code Online (Sandbox Code Playgroud)
(返回第一个非空值,如if var0 = null then var1 else var0
)
XQUERY (var0,var1)
Run Code Online (Sandbox Code Playgroud)
这是正确的转换吗?
如果是,有人可以提供API的链接吗?我在XQuery语法和操作员手册上找不到这个.
我正在使用Message Broker 8和MQ 7.当我尝试在消息流中使用Mapping Node时,我得到一个java.lang.RuntimeException.
以下是事件查看器显示的内容:
( BROKER8.default ) The map script generation for QName ''{practica}:CambioFecha'' has failed, with the following details: ''java.lang.RuntimeException: ''.
The generation of the map has failed.
Review and resolve the problems indicated in the message from the map generation.
Run Code Online (Sandbox Code Playgroud)
完整的异常堆栈是:
ExceptionList: ( ['MQROOT' : 0xe052600]
(0x01000000:Name):RecoverableException = (
(0x03000000:NameValue):File = 'F:\build\S000_P\src\DataFlowEngine\PluginInterface\ImbJniNode.cpp' (CHARACTER)
(0x03000000:NameValue):Line = 1170 (INTEGER)
(0x03000000:NameValue):Function = 'ImbJniNode::evaluate' (CHARACTER)
(0x03000000:NameValue):Type = 'ComIbmMSLMappingNode' (CHARACTER)
(0x03000000:NameValue):Name = 'practica/DATAGRAMA#FCMComposite_1_7' (CHARACTER)
(0x03000000:NameValue):Label = 'practica.DATAGRAMA.Cambio Formato Fecha' (CHARACTER)
(0x03000000:NameValue):Catalog …
Run Code Online (Sandbox Code Playgroud) Websphere Message Broker:文件输出示例中的文件.我有一个带有重复元素结构的XML文件.如何在ESQL中访问和修改特定元素的值.我按照以下代码行事
CREATE PROCEDURE CopyEntireMessage() BEGIN
--SET OutputRoot = InputRoot;
DECLARE I INTEGER 1;
DECLARE J INTEGER;
SET J = CARDINALITY(OutputRoot.*[]);
WHILE I < J DO
SET OutputRoot = InputRoot;
SET OutputRoot.XMLNS.person.student[I].name = 'XYZ';
SET I = I + 1;
END WHILE;
END;
Run Code Online (Sandbox Code Playgroud)
但它不起作用.从输入文件夹中提取文件但我在Output文件夹中看不到任何内容.但如果我评论
SET OutputRoot.XMLNS.student[I].name = 'XYZ';
Run Code Online (Sandbox Code Playgroud)
然后文件在输出文件夹中可用,因为它没有任何变化.
我的XML文件如下
<person>
<student>
<name>ABC</name>
<age>20</age>
<address>city1</address>
</student>
<student>
<name>PQR</name>
<age>20</age>
<address>city2</address>
</student>
</person>
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我吗?
我想知道在IBM Integration Bus中存储数据库参数的最佳位置在哪里.例如,如果我们有dev,test和prod环境,每个环境都有一个单独的数据库(当然),如何才能最好地组织更改数据库连接属性?用户变量?一些外部服务?Decision Manager存储库?缓存变量(共享或极限标度网格)?
以下输入xml字段需要包含6个字符,每6个字符应分割并保存在输出的选项字段中.
Input:
<feature>124414500045563879</feature>
output:
<option>124414</option>
<option>500045</option>
<option>563879</option>
Run Code Online (Sandbox Code Playgroud)
IIB ESQL中是否有任何tokenizer功能可用于实现上述结果.
有谁知道如何在 Java 计算节点中访问 MbMessage 的内容?我正在使用 IBM 集成工具包 10,到目前为止我只知道 Message 由一个根元素和各种子元素组成。
我正在从 MQ 接收 JSON 文本,我只需要在计算节点中访问它,修改它并将其发送到 Azure 服务总线,但我很难从消息中访问 JSON 文本。
我试图访问各种 MbMessage 元素,但没有从中获得任何合理的价值。我将输出作为异常抛出到错误日志中。我得到的唯一合理的数据来自 Chapter 元素,但我猜格式是十六进制的。看到这个:
"7b224865616422203a207b22536f7572636553797374656d223a224d565844445441505244222c2022546172676574223a2241677265656d656e74222c2022416374696f6e223a2264656c657465222c20224d6573736167654964223a22222c2022436f72656c6174696f6e4964223a22222c2254696d657374616d70223a223230313930333230313631383531333636373230303030303030222c20224368616e67654964223a22227d2c224974656d7322203a207b2241677265656d656e744964223a225357453134305f36303736343336222c224d616368696e654b6579223a2231313131303337313333222c2241677265656d656e74436c617373223a22353631222c2241677265656d656e744e756d626572223a2242303638323135222c224c696e654e756d626572223a22315f3330222c22436f6e74726163746564486f757273223a22313030222c2241677265656d656e7456616c696446726f6d223a223230313930333132222c2241677265656d656e7456616c6964546f223a223230323230333131222c224c6173744d6f646966696564223a223230313930333230313631383531333636373230303030303030222c22497349536974654f726967696e61746564223a2230222c22497344656c657"
// This is how i see in log what is in the element value of a chapter
if(true){
throw new Exception("Message Content: " + outMessage.getRootElement().getLastChild().getLastChild().getValueAsString());
}
Run Code Online (Sandbox Code Playgroud)
我希望得到我发送到消息队列的 JSON 文本。
我有一个看起来像这样的输入 xml
<log>
<line>
<id>1</id>
<line>
<id>2</id>
<otherLine>
<id>2</id>
<field>
12345-67
</field>
</otherLine>
</log>
Run Code Online (Sandbox Code Playgroud)
我在 esql 中所做的基本上是迭代每个<line>
元素,我想从值匹配的<otherLine>
地方检索<id>
值。
我有这样的代码:
declare inDoc reference to InputRoot.XMLNSC.log;
declare line reference to inDoc;
declare fieldValue character;
move line firstchild name 'line';
while lastmove(line) do
set fieldValue = select r.field from inDoc.otherLine[] as r where r.id = line.id;
-- I want this to be null when hitting the line with <id>1</id> and 12345-67 and hitting the line with <id>2</id>
move …
Run Code Online (Sandbox Code Playgroud) 能以某种方式向我解释一下这些产品的区别吗?