Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试使用MongoDB BulkWriteOperation时发生java.lang.IllegalStateException_Java_Mongodb_Exception_Queue - Fatal编程技术网

尝试使用MongoDB BulkWriteOperation时发生java.lang.IllegalStateException

尝试使用MongoDB BulkWriteOperation时发生java.lang.IllegalStateException,java,mongodb,exception,queue,Java,Mongodb,Exception,Queue,我有一段代码,一旦ArrayBlockingQueue完成了它的配额,它就会将文档转储到MongoDB中。当我运行代码时,它似乎只运行一次,然后给我一个堆栈跟踪。我的猜测是,大容量写入操作必须有人“重置”或重新开始 另外,我在构造函数中创建BulkWriteOperations bulkEvent = eventsCollection.initializeOrderedBulkOperation(); bulkSession = sessionsCollection.initializeOrde

我有一段代码,一旦ArrayBlockingQueue完成了它的配额,它就会将文档转储到MongoDB中。当我运行代码时,它似乎只运行一次,然后给我一个堆栈跟踪。我的猜测是,大容量写入操作必须有人“重置”或重新开始

另外,我在构造函数中创建BulkWriteOperations

bulkEvent = eventsCollection.initializeOrderedBulkOperation();
bulkSession = sessionsCollection.initializeOrderedBulkOperation();
这是stacktrace

10 records inserted
java.lang.IllegalStateException: already executed
    at org.bson.util.Assertions.isTrue(Assertions.java:36)
    at com.mongodb.BulkWriteOperation.insert(BulkWriteOperation.java:62)
    at willkara.monkai.impl.managers.DataManagers.MongoDBManager.dumpQueue(MongoDBManager.java:104)
    at willkara.monkai.impl.managers.DataManagers.MongoDBManager.addToQueue(MongoDBManager.java:85)
以下是队列的代码:

public void addToQueue(Object item) {
        if (item instanceof SakaiEvent) {
            if (eventQueue.offer((SakaiEvent) item)) {
            } else {
                dumpQueue(eventQueue);
            }

        }
        if (item instanceof SakaiSession) {
            if (sessionQueue.offer((SakaiSession) item)) {
            } else {
                dumpQueue(sessionQueue);
            }
        }

    }
下面是从队列读取并将它们添加到BulkWriteOperation initializeOrderedBulkOperation的代码,以执行它,然后将其转储到数据库。只编写了10个文档,然后就失败了

private void dumpQueue(BlockingQueue q) {
        Object item = q.peek();
        Iterator itty = q.iterator();
        BulkWriteResult result = null;

        if (item instanceof SakaiEvent) {
            while (itty.hasNext()) {
                bulkEvent.insert(((SakaiEvent) itty.next()).convertToDBObject());
                //It's failing at that line^^
            }
            result = bulkEvent.execute();

        }
        if (item instanceof SakaiSession) {
            while (itty.hasNext()) {
                bulkSession.insert(((SakaiSession) itty.next()).convertToDBObject());
            }
            result = bulkSession.execute();
        }

        System.out.println(result.getInsertedCount() + " records inserted");
    }
在这种情况下,适用于所有驱动程序实现:

执行后,如果不重新初始化,则无法重新执行批量对象

因此.execute方法有效地耗尽了当前发送给它的操作列表,现在包含了关于命令实际发送方式的状态信息。因此,您无法添加更多条目或调用。请在同一实例上再次执行,而无需重新初始化

因此,在对每个批量对象调用execute后,需要再次调用初始化:

bulkEvent = eventsCollection.initializeOrderedBulkOperation();
bulkSession = sessionsCollection.initializeOrderedBulkOperation();
这些行中的每一行在每一行之后重复放置。在函数中执行调用。然后,对这些实例的进一步调用可以添加操作,并再次调用execute继续循环

请注意,Bulk operations对象将存储您想要放入其中的任意数量的项,但会将对服务器的请求拆分为最多1000项。执行后,“操作”列表的状态将准确反映您希望检查的操作方式。

在这种情况下,适用于所有驱动程序实现:

执行后,如果不重新初始化,则无法重新执行批量对象

因此.execute方法有效地耗尽了当前发送给它的操作列表,现在包含了关于命令实际发送方式的状态信息。因此,您无法添加更多条目或调用。请在同一实例上再次执行,而无需重新初始化

因此,在对每个批量对象调用execute后,需要再次调用初始化:

bulkEvent = eventsCollection.initializeOrderedBulkOperation();
bulkSession = sessionsCollection.initializeOrderedBulkOperation();
这些行中的每一行在每一行之后重复放置。在函数中执行调用。然后,对这些实例的进一步调用可以添加操作,并再次调用execute继续循环


请注意,Bulk operations对象将存储您想要放入其中的任意数量的项,但会将对服务器的请求拆分为最多1000项。执行后,操作列表的状态将准确地反映您希望检查的操作方式。

这就是我最初的想法,一定是文档中遗漏了它。我将重写代码以反映这一点。我也知道1000件的限制。谢谢这就是我最初的想法,一定是文档中遗漏了它。我将重写代码以反映这一点。我也知道1000件的限制。谢谢