Я разрабатываю программу миграции, которая переносит данные из 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 мне следует использовать для достижения цели