Возникла проблема при получении наблюдаемых состояний из данного аккаунта в корде? - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь передать данное состояние некоторым учетным записям наблюдателей (все находится на уровне учетных записей). Проблема, с которой я сталкиваюсь, заключается в том, что для наблюдателя я не могу получить потоки, которые я ему транслировал. Широковещательная рассылка прошла успешно, что я подтвердил наличием записей в таблице account_to_state_refs, а также на самом узле (я транслировал состояние от учетной записи на одном узле к другой учетной записи на другом узле).

запрос, который я использую для получения учетных записей, выглядит следующим образом:

public List<StateAndRef<TradeState>> getTradeStatesByAccount(){
    AccountInfo myAccount = UtilitiesKt.getAccountService(this).accountInfo(accountName).get(0).getState().getData();
    QueryCriteria.VaultQueryCriteria criteria = new QueryCriteria.VaultQueryCriteria(Vault.StateStatus.ALL).withExternalIds(Collections.singletonList(myAccount.getIdentifier().getId()));

    List<StateAndRef<TradeState>> myOrders = getServiceHub().getVaultService().queryBy(TradeState.class,criteria).getStates();
    return myOrders;
}

И код, который используется для передачи состояния другим учетным записям:

UtilitiesKt.getAccountService(this).shareStateWithAccount(accountInfo.getIdentifier().getId(), stateToBroadcast);

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

Редактировать: Найден обходной путь, добавлен в ответ.

1 Ответ

0 голосов
/ 20 февраля 2020

Решил проблему, выполнив запрос JDB C к самой таблице, чтобы получить идентификаторы транзакций состояний, в которых учетная запись была в качестве наблюдателя. Ниже приведен код, написанный в потоке корда:

AccountInfo myAccount = UtilitiesKt.getAccountService(this).accountInfo(accountName).get(0).getState().getData();
String accId = myAccount.getLinearId().getId().toString();
String nativeQuery = "SELECT transaction_id FROM account_to_state_refs WHERE external_id=\'" + accId + "\'";
java.sql.Connection connection = getServiceHub().jdbcSession();
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(nativeQuery);

List<StateAndRef<TradeState>> result = new ArrayList<StateAndRef<TradeState>>();

// All the states related to the node
    List<StateAndRef<TradeState>> myOrders = getServiceHub().getVaultService().queryBy(TradeState.class).getStates();

// To filter out the observed states from all the states above
while ( rs.next() ) {
    String txnId = rs.getString("transaction_id");
    for (StateAndRef<TradeState> order: myOrders) {
        if(order.getRef().getTxhash().toString().equalsIgnoreCase(txnId)) {
                result.add(order);
        }
    }
}

return result;

Это может быть не самый лучший / оптимальный способ выполнения желаемого действия, но это работает для меня, пока я не найду правильный путь.

...