从Siddhi连接MongoDB Atlas插入数据无报错但失败的问题
问题分析与解决步骤
核心问题定位
从你的代码和描述来看,有几个关键问题导致数据无法插入MongoDB:
- 表定义注解错误:你用
sink注解定义MongoDB表,但Siddhi中操作数据库表需要用@store注解——@sink仅用于输出流到外部系统,不支持持久化表的CRUD操作。 - 查询目标不匹配:你的查询是
insert into MongoCollection,但实际定义的表名是siddhiCollection,名称不一致导致数据无法写入正确表。 - 缺少数据触发逻辑:Siddhi不会自动生成数据流,必须手动注入测试事件或添加自动生成逻辑,否则InsertStream没有数据流入,自然不会执行插入操作。
- SSL配置需验证:虽然你导入了证书,但MongoDB Atlas默认支持SSL,不过仍需确认证书导入是否正确,同时要检查Atlas的IP白名单是否包含你的机器IP(静默拦截连接也会导致无报错但无数据)。
修正后的代码示例
@App:name("ConectionMongoDBAtlas") @App:description("Connection to MongoDB Atlas") @store(type='mongodb', uri='mongodb+srv://username:password@cluster0.cs3wyqb.mongodb.net/siddhi?retryWrites=true&w=majority', collection.name='siddhiCollection', database.name='siddhi' ) @primaryKey("name") @index('age') define table siddhiCollection(name string, age int); @sink(type='log') define stream BarStream(message string); @info(name='query1') define stream InsertStream(name string, age int); -- 修正插入目标为正确的表名 from InsertStream insert into siddhiCollection; -- 可选:添加自动测试数据生成触发器,每5秒插入一条测试数据 @info(name='test-data-generator') define trigger TestTrigger at every 5 seconds; from TestTrigger select "Alice" as name, 30 as age insert into InsertStream;
关键修正说明
- 替换@sink为@store:
@store注解专门用于绑定Siddhi表与外部数据库,支持数据持久化;@sink仅做流输出,不适合数据库表操作。 - 统一表名:确保查询中插入的目标表和定义的表名完全一致(
siddhiCollection)。 - 添加数据触发:示例中用触发器自动生成测试数据,也可以在Siddhi编辑器的「Event Simulator」中手动向InsertStream发送事件。
SSL与连接验证步骤(若问题仍存在)
- 检查MongoDB Atlas的IP白名单,确保当前机器的IP已被添加,否则连接会被静默拦截。
- 验证证书导入正确性,用keytool命令查看证书库:
keytool -list -keystore C:/Users/luis.ortega/Downloads/siddhi-tooling-5.1.0/resources/security/client-truststore.jks -storepass mongodb - 若需强制SSL,在
@store注解中添加以下参数:secure.connection='true', trust.store='C:/Users/luis.ortega/Downloads/siddhi-tooling-5.1.0/resources/security/client-truststore.jks', trust.store.password='mongodb'
验证流程
- 运行修正后的代码,查看控制台是否有测试数据生成的日志。
- 登录MongoDB Atlas控制台,检查
siddhi数据库下的siddhiCollection集合是否有数据插入。 - 若仍无数据,查看Siddhi Tooling的详细日志(logs目录下),排查是否有隐藏的连接或权限错误。
内容的提问来源于stack exchange,提问作者Ricardo Ortega
相关产品推荐
相关产品推荐

