Yes, use Spring ApplicationEvent
s.
Create the publisher bean:
import io.jmix.ui.App;
import io.jmix.ui.AppUI;
import org.springframework.context.ApplicationEvent;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class CurrentSessionUiEventsPublisher {
public void publishEvent(ApplicationEvent event) {
// active app in this session
App app = App.getInstance();
// notify all opened web browser tabs
List<AppUI> appUIs = app.getAppUIs();
for (AppUI ui : appUIs) {
if (!ui.isClosing()) {
// work in context of UI
ui.accessSynchronously(() -> {
ui.getUiEventsMulticaster().multicastEvent(event);
});
}
}
}
}
Create the event class:
import org.springframework.context.ApplicationEvent;
public class GreetingEvent extends ApplicationEvent {
private final String greeting;
public GreetingEvent(Object source, String greeting) {
super(source);
this.greeting = greeting;
}
public String getGreeting() {
return greeting;
}
}
In a sender screen, publish the event:
@Autowired
private CurrentSessionUiEventsPublisher currentSessionUiEventsPublisher;
@Subscribe("sendEvent")
public void onSendEventClick(Button.ClickEvent event) {
currentSessionUiEventsPublisher.publishEvent(new GreetingEvent(this, "Hello!"));
}
Subscribe to the event in receiver screens:
@Autowired
private Notifications notifications;
@EventListener
public void onGreeting(GreetingEvent event) {
notifications.create().withCaption(event.getGreeting()).show();
}
The event will be delivered to receiver screens in all browser tabs of the currently connected user.
See also this message for other options for sending events.
Regards,
Konstantin