Msgstr "RequestCycle в данный момент не установлен!" Исключение при использовании интеграции IcePush Wicket и попытке вызвать "push()" из другого класса
Хорошо здесь идет. Это мое первое приложение для калитки, и я пытаюсь интегрировать icepush на примере push-панели.
То, что я пытаюсь сделать, это отправить обновление на панель, вызвав метод updatePanel(String content) из другого класса.
Вот код
В моей расширенной PushPanel у меня есть:
public AsyncCommsPanel(String id) {
super(id);
this.setOutputMarkupId(true);
ajaxForm = new Form("ajaxForm");
ajaxForm.setOutputMarkupId(true);
ajaxForm.add(textStore = new Label("textStore",""));
ajaxForm.add(new AjaxButton("updateButton") {
@Override
protected void onSubmit(AjaxRequestTarget target, Form form) {
System.out.println("Update button pressed!");
/* CODE TO PULL NEW DATA FROM ELSEWHERE */
/* UPDATE TAKES TIME SO HAS ITS OWN CALLBACK */
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
System.out.println("Update button error.");
}
});
add(ajaxForm);
}
@Override
protected void pushCallback(AjaxRequestTarget target) {
target.add(ajaxForm);
}
public void updatePanel(String updateString) {
/* THIS METHOD SHOULD ALLOW THE PANEL TO BE UPDATED FROM ELSEWHERE */
if (textStore != null) ajaxForm.remove(textStore);
ajaxForm.add(textStore = new Label("textStore", updateString));
push();
}
Когда я пытаюсь вызвать метод updatePanel из метода обратного вызова сборщика данных, я получаю следующее исключение:
ERROR (SelectorManager.run): org.apache.wicket.WicketRuntimeException: No RequestCycle is currently set!
at org.apache.wicket.Component.getRequest(Component.java:1831)
at org.apache.wicket.markup.html.WebPage.dirty(WebPage.java:315)
at org.apache.wicket.Page.dirty(Page.java:288)
at org.apache.wicket.Page.componentRemoved(Page.java:948)
at org.apache.wicket.MarkupContainer.removedComponent(MarkupContainer.java:1422)
at org.apache.wicket.MarkupContainer.remove(MarkupContainer.java:612)
at uk.ac.warwick.collabtex.AsyncCommsPanel.updatePanel(AsyncCommsPanel.java:107)
at uk.ac.warwick.collabtex.Editor$1.updateSuccess(Editor.java:98)
1 ответ
Добро пожаловать в асинхронный мир:-) ThreadLocals (Application, Session и ThreadLocal) доступны только во время обработки потока HTTP-запроса (он же рабочий поток). Таким образом, есть две проблемы: 1) при запуске собственного потока вы теряете ThreadLocal, 2) даже если вы экспортируете их, есть вероятность, что ответ будет уже закрыт по окончании вашей работы. Я не уверен, как работает IcePush, но вот что я считаю лучшим вариантом - отправьте задачу, сохраните ссылку на нее в приложении (например, на карте), а затем запустите поведение таймера ajax, которое запрашивает futureTask.isDone () периодически, и когда он возвращает true, меняются необходимые вам иерархии (я вижу вызов MarkupContainer # remove () в трассировке стека).