将Siddhi作为库使用时,如何向InputHandler传入非硬编码及JSON数据?
向Siddhi InputHandler传入JSON数据的实用方法
嘿,我刚好折腾过Siddhi作为库使用时传入JSON数据的场景,给你分享几个实用的方法,不用再写硬编码的Object数组:
方法1:在Java代码中解析JSON,组装成匹配流结构的Object数组
这是最直接的方式,先把JSON字符串解析成对应的数据类型,再传给InputHandler.send()。需要用到JSON解析库(比如Jackson),步骤如下:
// 假设你的Siddhi流定义是: // define stream StockStream (symbol string, price float, volume long); // 1. 待传入的JSON数据 String jsonData = "{\"symbol\":\"WSO2\",\"price\":50.5,\"volume\":300}"; // 2. 用Jackson解析JSON ObjectMapper objectMapper = new ObjectMapper(); JsonNode jsonNode = objectMapper.readTree(jsonData); // 3. 提取字段并组装成和流结构匹配的Object数组 String symbol = jsonNode.get("symbol").asText(); float price = jsonNode.get("price").floatValue(); long volume = jsonNode.get("volume").longValue(); // 4. 发送到InputHandler inputHandler.send(new Object[]{symbol, price, volume});
注意:一定要保证解析后的字段类型和Siddhi流定义的类型完全一致,比如流里定义的是float,就不能传double,否则会触发类型不匹配的错误。
方法2:利用Siddhi内置JSON函数,直接传入JSON字符串
如果不想在Java代码里处理JSON解析,可以把JSON字符串作为单个字段传入流,然后在Siddhi查询里用内置的JSON函数解析。这种方式更灵活,适合JSON结构可能变动的场景:
// 定义带JSON载荷的输入流,以及解析查询 String siddhiApp = "" + "@app:name('StockJsonApp')\n" + "define stream StockJsonStream (jsonPayload string);\n" + "@info(name='ParseJsonQuery')\n" + "from StockJsonStream\n" + "select json:getString(jsonPayload, '$.symbol') as symbol,\n" + " json:getFloat(jsonPayload, '$.price') as price,\n" + " json:getLong(jsonPayload, '$.volume') as volume\n" + "insert into StockStream;\n"; // 初始化Siddhi运行时和InputHandler SiddhiManager siddhiManager = new SiddhiManager(); SiddhiAppRuntime siddhiAppRuntime = siddhiManager.createSiddhiAppRuntime(siddhiApp); InputHandler inputHandler = siddhiAppRuntime.getInputHandler("StockJsonStream"); // 直接传入JSON字符串 String jsonData = "{\"symbol\":\"WSO2\",\"price\":50.5,\"volume\":300}"; inputHandler.send(new Object[]{jsonData});
注意:要确保你的项目依赖里包含了Siddhi的JSON扩展包(比如siddhi-extension-json),否则json:*函数会无法使用。
方法3:批量传入JSON数组数据
如果需要一次性传入多条JSON数据,可以先解析JSON数组,批量组装成Object数组后,用InputHandler.send(Object[][] events)方法批量发送:
// 待传入的JSON数组 String jsonArray = "[{\"symbol\":\"WSO2\",\"price\":50.5,\"volume\":300},{\"symbol\":\"IBM\",\"price\":120.0,\"volume\":500}]"; // 解析JSON数组 ObjectMapper objectMapper = new ObjectMapper(); JsonNode jsonNode = objectMapper.readTree(jsonArray); List<Object[]> eventList = new ArrayList<>(); // 遍历数组,组装每个事件的Object数组 for (JsonNode node : jsonNode) { String symbol = node.get("symbol").asText(); float price = node.get("price").floatValue(); long volume = node.get("volume").longValue(); eventList.add(new Object[]{symbol, price, volume}); } // 批量发送事件 inputHandler.send(eventList.toArray(new Object[0][]));
这些方法都能帮你摆脱硬编码的Object数组,灵活传入JSON数据到Siddhi的InputHandler里。
内容的提问来源于stack exchange,提问作者duke390
相关产品推荐
相关产品推荐

