Mongodb Java驱动程序:停止运行aggegation

Mongodb Java驱动程序:停止运行aggegation,java,mongodb,Java,Mongodb,我想通过编程的方式杀死一个分片集群上的聚合操作。该操作是从Java mongo驱动程序启动的 我发现杀死它的方法是抛出一个带有会话标识符的killSessions命令 要正确获取会话标识符,我要做的是: MongoClient mongoClient = .... mongoClient.startSession() //call the aggregation stuff.. 此线程保持运行,我使用mongoClient对象从另一个线程获取并终止服务器会话: BsonDocument se

我想通过编程的方式杀死一个分片集群上的聚合操作。该操作是从Java mongo驱动程序启动的

我发现杀死它的方法是抛出一个带有会话标识符的killSessions命令

要正确获取会话标识符,我要做的是:

MongoClient mongoClient = ....
mongoClient.startSession()

//call the aggregation stuff..
此线程保持运行,我使用mongoClient对象从另一个线程获取并终止服务器会话:

BsonDocument serverSession = clientSession.getServerSession().getIdentifier();
BsonBinary value = serverSession.get("id").asBinary();
然后我将
value
包装在文档
[{id:value}]
的单个集合中,并使用此参数调用
$killsessions
。我在mongo管理数据库上运行它

结果返回给我
{ok:1.0}
,但执行该操作的线程仍在运行,并在服务器上正确结束。聚合结果将写入stage
$out
上的新集合,因此它似乎对服务器会话没有影响


如何以编程方式终止聚合上运行的所有操作?(客户端和服务器端)。

一旦启动管道,它将在您的Mongo进程上运行<代码>会话是保证读/写操作一致性的一种方法。这不是杀死正在运行的查询的方法


如果要使用,请使用获取操作id。

因为我需要它来终止长时间运行的进程,所以我的解决方案是使用以下命令以单音识别要终止的会话

db.adminCommand({"currentOp": true, "secs_running": {$gte: 100}})
从结果中获取id(asumming
inprog
只包含一个正在进行的操作,因为没有更多操作运行超过100秒

{“inprog”:[{“lsid”:{这里是会话id},其他字段…},其他inprogops…],其他字段…}

然后将
lsid
字段(其中包含
id
uid
)传递给
killSessions

b.adminCommand( { killSessions: [ {here_goes_lsid} ] } )

为了更可靠地获取sessionId,可以检查
inprog
数组的其他字段

killSessions在我的测试中起作用:

确保您正在终止操作中使用的会话,确保终止会话时操作正在运行(您可以在操作开始之前终止会话,这将是一个不操作),确保您正确地传递了会话

如果您仍然无法提供可复制的代码示例

killSessions不会返回任何内容,因此据我所知,无法判断它是否确实执行了任何操作。但服务器在终止操作时会记录日志。4.4日志:

{"t":{"$date":"2020-06-16T15:55:06.872-04:00"},"s":"I",  "c":"QUERY",    "id":20528,   "ctx":"threa
d60247","msg":"Killing cursor as part of killing session(s)","attr":{"cursorId":7290821057815339751
}}
{"t":{"$date":"2020-06-16T16:01:29.350-04:00"},"s":"I",  "c":"COMMAND",  "id":20706,   "ctx":"thread60247","msg":"Killing op as part of killing session","attr":{"opId":18212677,"lsid":{"id":{"$uuid":"8f5474a5-8001-469b-87d4-692563f2dc0e"},"uid":{"$binary":{"base64":"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=","subType":"0"}}}}}

在这种情况下,我无法从所有当前操作中筛选currentOp ID,因此我不能这样做。特别提到使用会话在分片集群中终止操作。它仅指写入操作,而不是查询操作。在我的情况下,聚合以写入$merge stepKill sessions结束,返回一个带有“ok”的对象属性设置为1.0或0.0,以了解运行是否正常。但我最初遇到的问题是获取要终止的会话的id。这在运行聚合时是无法获取的,至少我发现了这一点。我使用运行了这么长时间的runningOps来获取它,这解决了我的问题,但这段代码是在Ruby上生成的,对吗?我正在查看g对于Java API,从客户端和服务器会话(clientSession.getServerSession().getIdentifier())终止会话对我来说不适用于Java。所有官方支持的MongoDB驱动程序在概念上都有相同的API,因为API是标准化的。Ruby代码显示了所有需要的操作(会话创建、操作发布、终止)我建议您将其转换为Java。