Грааль Аякс Таймер - PullRequest
       6

Грааль Аякс Таймер

0 голосов
/ 03 апреля 2012

Я разрабатываю программу миграции, которая переносит данные из sybase в postgresql в grails. В бэкэнде служба миграции Grails работает в выделенном потоке. В веб-интерфейсе я хочу отобразить, сколько данных и сколько времени занимает служба Grails. В данный момент я могу только вручную обновить страницу gsp, чтобы текущее время могло отображать количество данных на странице gsp. Тем не менее, хорошей идеей является автоматическое обновление страницы gsp через ajax timer. Я пытаюсь использовать setInterval или setTimeOut в HTML, но это как-то не работает вообще. Ниже приведен мой контроллер Grails и соответствующий вид

def migrateSchuldner() {
    def isRunning = personMigrationThreadService.isRunning() // boolean is the Service is running
    def results = MigrationRun.findAllByEndDateIsNull()
    def threadInfo
    if (results.empty) {
        def runCounter = personMigrationService.lastRun()
        threadInfo = MigrationRun.findByCounter(runCounter) // threadInfo contains the Date and processedData and ErrorData
    }
    else {
        threadInfo = results.get(0)
    }
    render view: 'migrateSchuldner', model: [threadInfo: threadInfo, isRunning: isRunning]
}

Соответствующий вид:

<%@ page import="de.rvgmbh.nemesis.domain.security.Role" %>
<sec:ifAnyGranted roles="ROLE_ADMIN,ROLE_MIGRATION">
<g:applyLayout name="mainSecured" params="[currentTopNavigationIndex: 'migration',  currentLeftNavigationIndex: 3]">
    <head>
        <title>${message(code: 'page.migration.migrate.SchuldnerData.headline.show')}  
    </title>
    </head>

    <body>
    <div class="span-20 rightBorder">
        <h3>${message(code: "page.migration.migrate.schuldnerData.headline.show")}</h3>
    </div>

    <fieldset id="migration-form">
        <table>
            <tr><td style="background-color: transparent">
                <g:if test="${isRunning}">
                    <legend>
                        ${message(code: 'page.migration.migrate.SchuldnerData.migrationInProgress')}
                    </legend>
                </g:if>
                <g:else>
                    <g:form action="migrateSchuldnerButtonClick" method="post" useToken="true">
                        ${message(code: 'page.migration.migrate.SchuldnerData.legend.text')}
                        <input type="submit"
                               value= ${message(code: "page.migration.migrate.SchuldnerData.submit.text")}>
                    </g:form>
                </g:else>
                <g:if test="${threadInfo}">
                    <g:if test="${!isRunning}">
                        <legend>
                            ${message(code: 'page.migration.migrate.SchuldnerData.lastResult')}
                        </legend>
                    </g:if>
                    <ul>
                        <li>
                            <label>${message(code: 'page.migration.migrate.SchuldnerData.currentTime')}:</label>
                            <p>${threadInfo.currentRuntime}</p>
                        </li>
                        <li>
                            <label>${message(code: 'page.migration.migrate.SchuldnerData.processedPersons')}:</label>

                            <p>${threadInfo.processedPersons}</p>
                        </li>
                        <li>
                            <label>${message(code: 'page.migration.migrate.SchuldnerData.personErrors')}:</label>

                            <p>${threadInfo.personErrors}</p>
                        </li>
                        <li>
                            <label>${message(code: 'page.migration.migrate.SchuldnerData.processedPersonData')}:</label>

                            <p>${threadInfo.processedPersonData}</p>
                        </li>
                        <li>
                            <label>${message(code: 'page.migration.migrate.SchuldnerData.dataErrors')}:</label>

                            <p>${threadInfo.dataErrors}</p>
                        </li>
                    </ul>
                </g:if>
            </td></tr>
        </table>
    </fieldset>
    </body>
</g:applyLayout>

Дело в том, что переменная currentRuntime, processingPersons ... всегда обновляется внутри потока. Я должен обновить представление GSP, чтобы получить текущее время и обработанные лица. У кого-нибудь есть идея, какой таймер Ajax мне следует использовать для достижения цели

1 Ответ

0 голосов
/ 03 апреля 2012

1) Переместите целое <fieldset id="migration-form"> в отдельное действие, скажем, progress с помощью progress.gsp. Заключите действие , включите в div с идентификатором:

def progress = {
  [threadInfo: threadInfo]
}

на главной странице:

<div id="migration_progress">
  <g:include action="progress" model="[threadInfo: threadInfo]">
</div>

2) Используйте remoteFunction для обновления migration_progress деления по таймеру, например:

onsomething="${remoteFunction(action: 'progress', update: 'migration_progress')"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...