Как асинхронно загружать отдельные элементы строки таблицы в PrimeFaces или JSF? - PullRequest
0 голосов
/ 17 июня 2020

ЦЕЛЬ

Я показываю таблицу, в которой строки - это физические компьютеры в локальной сети, а столбцы - это некоторые фрагменты информации с каждого отдельного компьютера. Часть этой информации хранится локально на сервере, но часть извлекается с самих компьютеров через запросы REST. Я хотел бы сделать вызовы асинхронными из соображений производительности; я имею в виду сначала отобразить таблицу с некоторыми заполнителями, затем отправить все запросы, а затем постепенно заполнять ее данными по мере получения ответов на отдельные запросы.

ПРОБЛЕМА

Проблема заключается в том, что ни одно из найденных мной решений не сработало. p: outputPanel со свойством deferred остается в состоянии заполнителя, показывая этот вращающийся виджет навсегда. remoteCommand не срабатывает, что бы я ни делал. Я пробовал все их варианты, и ни один из них не дал желаемого поведения.


ДРУГИЕ НАБЛЮДЕНИЯ

p: outputPanel успешно используется в другом месте в приложении, кроме как для вся таблица, и там она отлично работает. Однако использование его на всей таблице не поможет, мне все равно придется ждать ответов от каждого отдельного компьютера. Я также мог бы изменить API, чтобы получить всю информацию в одном запросе, но производительность все равно пострадает, если мы добавим больше компьютеров. Проблема здесь не в загрузке запросов, а в последовательном ожидании времени ожидания запросов к неотвечающим компьютерам.


Таблица:

    <p:dataTable value="#{stationController.items}" var="item" sortMode="multiple" lazy="true"
                 paginator="true" rows="50">

        <!--TestBundle Project Name-->
        <p:column sortBy="#{item.status}" filterBy="#{item.status}">
            <f:facet name="header">
                <h:outputText value="#{bundle.clientListTitle_testBundleProject}" />
            </f:facet>
            <p:outputPanel deferred="true">
                <h:outputText value="#{testStationsClient.getProjectName(item.ipAddress)}" />
            </p:outputPanel>
        </p:column>
        <!-- bunch of more of these... -->

    </p:dataTable>
...