Что вызывает блокировку таблицы сущностей в QuickBooks Online API?

Я пытаюсь оптимизировать свое приложение для работы на максимальной скорости. Я намеревался иметь два потока, каждый из которых выполняет пакетный запрос на добавление квитанций о продажах. Я также намеревался иметь два параллельных потока, каждый с пакетным запросом дополнений клиентов. Мне было интересно, возможно ли это, или API заблокирует таблицу чеков/покупателей в QuickBooks, что позволит выполнять только один поток.

Из моего исследования я знаю, что существует три типа объектов (список имен, транзакция и вспомогательные объекты). Итак, каковы причины блокировки этих сущностей, т.е. какой сценарий вызовет блокировку? Есть ли какая-либо документация по этому вопросу, которую я не смог найти?

Спасибо


person MohsinG    schedule 03.01.2014    source источник


Ответы (2)


Блокировка применима к объектам Name (поставщик, клиент и сотрудник). При создании нового объекта имени сервис гарантирует, что уникальное имя будет вставлено в облако. Таким образом, он блокирует все имена этих трех объектов.

Вы можете попробовать этот сценарий, используя достойную полезную нагрузку.

public static void main(String args[]) {
    PropertyConfigurator
            .configure("log4j.properties");
    Config.setProperty(Config.SERIALIZATION_REQUEST_FORMAT, "xml");
    Config.setProperty(Config.SERIALIZATION_RESPONSE_FORMAT, "xml");

    final Context platformContext = getPlatformContext("QBO");  
    final QBOV3ProdTest qbov3ProdTest = new QBOV3ProdTest(platformContext);

    Thread customerThread = new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < 15; i++) {
                qbov3ProdTest.addCustomer();
            }
        }
    });
    customerThread.start();

    Thread vendorThread = new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < 15; i++) {
                qbov3ProdTest.addVendor();
            }
        }
    });
    vendorThread.start();

}

private void addCustomer() {
    Customer customer = new Customer();
    customer.setDisplayName("TestCustomer-" + staticCount++);
    try {
        this.service.add(customer);
    } catch (FMSException e) {
        e.printStackTrace();
    }
}

private void addVendor() {
    Vendor vendor = new Vendor();
    vendor.setDisplayName("TestVendor-" + staticCount++);
    try {
        this.service.add(vendor);
    } catch (FMSException e) {
        e.printStackTrace();
    }
}

Служба не возвращает правильный ответ. Везде, где это не удается, служба возвращает 401. Пожалуйста, дайте мне знать, если вы можете воспроизвести это поведение, пытаясь использовать этот вариант использования в своей тестовой учетной записи QBO.

Спасибо

person Manas Mukherjee    schedule 04.01.2014
comment
Привет, Манас, спасибо за ответ. Что, если бы оба потока выполняли addCustomer? будет ли по-прежнему блокироваться объект имени клиента? Я понимаю, что параллельная обработка разных объектов имен невозможна из-за блокировки, но что делать, если объекты имен в нескольких потоках одинаковы (например, 2 потока с добавлением клиента в одном потоке и добавлением клиента во втором потоке)? будет ли это работать? - person MohsinG; 04.01.2014
comment
Я постараюсь воспроизвести поведение и сообщить вам о результатах как можно скорее. Когда у вас будет время, пожалуйста, ответьте на комментарий выше. Большое спасибо, вы очень помогли. - person MohsinG; 04.01.2014
comment
Привет Манас, у меня есть для тебя интересная информация. Я использую комплект разработчика .NET. Я попробовал предоставленный вами код, но преобразовал его в .NET. Я сделал пакетный запрос поставщиков в одном потоке и пакет клиентов в другом. Возникли ошибки и конфликты. Добавлены некоторые, но не все клиенты, и добавлены некоторые, но не все поставщики. Я также получил эту ошибку в некоторых частях журналов: Ошибка проверки: вы можете добавлять или редактировать только одно имя за раз. Пожалуйста, попробуйте еще раз. Также два потока с добавлениями клиентов вызывают сбой Visual Studio, как и два потока с добавлениями квитанций о продажах. - person MohsinG; 05.01.2014
comment
Два потока, один с добавлениями клиентов и один с добавлениями чеков о продажах, работали нормально. - person MohsinG; 05.01.2014
comment
Вы получите аналогичное поведение при использовании java devkit. Некоторые объекты будут добавлены, а некоторые потерпят неудачу. Клиент не имеет значения в этих вызовах API. Я постараюсь поделиться более подробной информацией, связанной с этой блокировкой. Если вы создаете клиентские и зависимые транзакции (счета-фактуры, товарные квитанции), это не должно вызывать никаких проблем. - person Manas Mukherjee; 05.01.2014
comment
Да, пожалуйста, когда у вас будет время, поделитесь дополнительной информацией о функции блокировки. Также, к сожалению, Visual Studio сообщает об ошибке, когда два потока обращаются к одному и тому же объекту через пакетные запросы (например, клиент, клиент или товарный чек, торговый чек), однако иногда один поток выполняется успешно. Было бы очень быстро, если бы, например, два потока с пакетными запросами на добавление чеков были совместимы с API. Я думаю, это все еще нормально, потому что один пакетный запрос, за которым следует другой в том же потоке, в любом случае достаточно быстр. Спасибо за вашу помощь. - person MohsinG; 06.01.2014
comment
Мы связались с командой разработчиков. Нимиша поделилась обновлением, которое мы получили от них. Мы обновим всю эту информацию (специфическое поведение объекта) в документах IPP. Спасибо - person Manas Mukherjee; 10.01.2014

Это не совсем правило блокировки БД, а из-за того, как мы сохраняем данные в нашем кеше для списков имен.

Мы не разрешаем пользователям обновлять эти объекты в многопоточном режиме:

Учетная запись, Отдел, Товар, Класс, Клиент, Сотрудник, Поставщик, Способ оплаты, Условия.

Вышеизложенное было подтверждено нашей командой инженеров.

person nimisha shrivastava    schedule 10.01.2014