Что вы ищете Нажмите особенность Vaadin и способ отправить сообщение в список зарегистрированных «клиентов» (в данном случае пользовательский интерфейс Vaadin, который должен знать об изменениях).
Вы можете прочитать о Vaadin Нажмите здесь: Enabling Server Push, а также в статье Advanced Push
Толчок функция Vaadin позволяет серверу, чтобы заставить обновления клиента, а не ждать в браузере, чтобы запросить снова.
Компонент сообщения просто выступает в качестве способа сообщить подписанным пользовательским интерфейсам, что есть обновление, которое им необходимо выполнить.
Это говорит о том, что у меня есть проект, который работает примерно так же, как несколько пользователей - это действия, и есть запланированные задачи Spring, которые также могут влиять на изменения, которые пользователь должен знать.
Обратите внимание, что приведенные ниже примеры основаны на примерах, доступных в статье Enabling Server Push.
Broadcaster.java - Действует как механизм, который регистрирует экземпляры для приема широковещательных сообщений и предоставляет возможность отправлять трансляции. В приведенном ниже примере у меня есть класс, представляющий сообщение (BroadcastMessage), но вы можете его упростить.
public class Broadcaster implements Serializable {
private static final long serialVersionUID = 3540459607283346649L;
static ExecutorService executorService = Executors.newSingleThreadExecutor();
private static LinkedList<BroadcastListener> listeners = new LinkedList<BroadcastListener>();
public interface BroadcastListener {
void receiveBroadcast(BroadcastMessage message);
}
public static synchronized void register(BroadcastListener listener) {
listeners.add(listener);
}
public static synchronized void unregister(BroadcastListener listener) {
listeners.remove(listener);
}
public static synchronized void broadcast(final BroadcastMessage message) {
for (final BroadcastListener listener: listeners)
executorService.execute(new Runnable() {
@Override
public void run() {
listener.receiveBroadcast(message);
}
});
}
}
Это класс, который я определил для своего BroadcastMessage. Идея заключается в том, чтобы иметь возможность обозначить, какие сообщения у меня есть, а также некоторая полезная нагрузка в виде карты
public class BroadcastMessage implements Serializable {
private static final long serialVersionUID = 5637577096751222106L;
public BroadcastMessageType messageType;
public Map<String, String> params;
public BroadcastMessage() {
}
public BroadcastMessage(BroadcastMessageType messageType) {
this.messageType = messageType;
this.params = new HashMap<String, String>();
}
public BroadcastMessage(BroadcastMessageType messageType, Map<String, String> params) {
this.messageType = messageType;
this.params = params;
}
public BroadcastMessageType getMessageType() {
return messageType;
}
public void setMessageType(BroadcastMessageType messageType) {
this.messageType = messageType;
}
public Map<String, String> getParams() {
return params;
}
public void setParams(Map<String, String> params) {
this.params = params;
}
}
Это пример Vaadin UI, который хочет прослушивать передачи в эфир. Обратите внимание на аннотацию @Push. Без этого клиент будет обновляться только при выборе браузером. @Push делает его немедленным **
@SpringComponent
@UIScope
@Push
@SpringView(name=TaskListComponent.NAME)
public class TaskListComponent extends MyCustomComponent implements Broadcaster.BroadcastListener, View {
/** PRUNED DOWN, TO DEMONSTRATE THE KEY CODE **/
// Register this window when we enter it
@Override
public void enter(ViewChangeEvent event) {
Broadcaster.register(this);
}
// Must also unregister when the UI expires
@Override
public void detach() {
Broadcaster.unregister(this);
super.detach();
}
// Receive a broadcast
@Override
public void receiveBroadcast(BroadcastMessage message) {
getUI().access(new Runnable() {
@Override
public void run() {
// DO WHATEVER YOU NEED TO DO HERE.
// I CALLED INITIALIZE BUT IT COULD BE
// JUST YOU FIELD UPDATE
if (message.getMessageType().equals(BroadcastMessageType.REFRESH_TASK_LIST))
initialize();
}
});
}
}
Для отправки сообщения через интерфейс отдыха:
Broadcaster.broadcast(
new BroadcastMessage(
BroadcastMessageType.AUTO_REFRESH_LIST
)
);
Надеется, что это помогает! :)
Когда у вас есть 10 экземпляров пользовательского интерфейса, к какому из них вы хотите получить доступ?Вероятно, вам будет лучше с tome queue/broadcast system –
ваше право, но я считаю, что это нормально, так как приложение будет частью пользовательской конфигурации программного обеспечения. Однако существуют ли возможности различать экземпляры пользовательского интерфейса, например, Я БЫ? – eSKape