目前 用户收件箱 组件的消息通知是通过定时器来触发的
现在改为事件订阅模式,只要发送了消息就实时更新未读消息数。
创建消息发布订阅事件
package de.diedavids.cuba.userinbox.web.message;
import com.haulmont.cuba.gui.events.UiEvent;
import org.springframework.context.ApplicationEvent;
/**
* @author Rubin
* @version v1 2021/4/8 11:08
*/
public class SendMessageEvent extends ApplicationEvent implements UiEvent {
/**
* Create a new {@code ApplicationEvent}.
*
* @param source the object on which the event initially occurred or with
* which the event is associated (never {@code null})
*/
public SendMessageEvent(Object source) {
super(source);
}
}
修改SendMessage类,添加事件发布。
package de.diedavids.cuba.userinbox.web.message;
import com.haulmont.cuba.core.entity.Entity;
import com.haulmont.cuba.core.global.CommitContext;
import com.haulmont.cuba.core.global.Events;
import com.haulmont.cuba.gui.screen.*;
import de.diedavids.cuba.userinbox.entity.SendMessageEntity;
import de.diedavids.cuba.userinbox.service.MessageService;
import org.springframework.context.ApplicationEvent;
import javax.inject.Inject;
import java.util.Collections;
import java.util.Set;
@UiController("ddcui$send-message")
@UiDescriptor("send-message.xml")
@EditedEntityContainer("messageDc")
@LoadDataBeforeShow
public class SendMessage extends StandardEditor<SendMessageEntity> {
@Inject
protected Events events;
@Inject
protected MessageService messageService;
@Install(target = Target.DATA_CONTEXT)
protected Set<Entity> commitDelegate(CommitContext commitContext) {
messageService.sendMessage(getEditedEntity());
events.publish(new SendMessageEvent(""));
return Collections.singleton(getEditedEntity());
}
}
修改UserInboxMessageMenuBadge类,去掉定时器。
package de.diedavids.cuba.userinbox.web.screens;
import com.haulmont.cuba.core.global.Messages;
import com.haulmont.cuba.gui.ScreenBuilders;
import com.haulmont.cuba.gui.components.Timer;
import com.haulmont.cuba.gui.components.mainwindow.SideMenu;
import com.haulmont.cuba.gui.screen.FrameOwner;
import com.haulmont.cuba.gui.screen.OpenMode;
import com.haulmont.cuba.web.WebConfig;
import de.diedavids.cuba.userinbox.service.MessageService;
import de.diedavids.cuba.userinbox.web.message.UserInbox;
import org.springframework.stereotype.Component;
import javax.inject.Inject;
@Component(UserInboxMessageMenuBadge.NAME)
public class UserInboxMessageMenuBadge {
static final String NAME = "ddcui_UserInboxMessageMenuBadge";
@Inject
protected Messages messages;
@Inject
protected ScreenBuilders screenBuilders;
@Inject
protected MessageService messageService;
public void initMessagesMenuItem(SideMenu sideMenu, FrameOwner frameOwner) {
SideMenu.MenuItem messagesMenuItem = sideMenu.createMenuItem("messages");
messagesMenuItem.setCaption(messages.getMainMessage("menu-config.ddcui$user-inbox"));
messagesMenuItem.setIcon("font-icon:ENVELOPE");
messagesMenuItem.setCommand(menuItem ->
screenBuilders.screen(frameOwner)
.withLaunchMode(OpenMode.NEW_TAB)
.withScreenClass(UserInbox.class)
.show()
);
sideMenu.addMenuItem(messagesMenuItem, 0);
}
public void updateMessageCounter(SideMenu sideMenu) {
sideMenu.getMenuItemNN("messages")
.setBadgeText(
messages.formatMainMessage("menu-config.ddcui$user-inbox.badge", getMessageCounter())
);
}
private long getMessageCounter() {
return messageService.countUnreadMessagesForCurrentUser();
}
}
订阅消息发布事件
这里是我自己实现的主界面,如果想用默认的可以修改UserInboxSideMenuMainScreen
这个类。
package com.enruipu.rfid.web.mainscreen;
import com.haulmont.cuba.gui.components.mainwindow.SideMenu;
import com.haulmont.cuba.gui.screen.Subscribe;
import com.haulmont.cuba.gui.screen.UiController;
import com.haulmont.cuba.gui.screen.UiDescriptor;
import com.haulmont.cuba.web.app.main.MainScreen;
import de.diedavids.cuba.userinbox.service.MessageService;
import de.diedavids.cuba.userinbox.web.message.SendMessageEvent;
import de.diedavids.cuba.userinbox.web.screens.UserInboxMessageMenuBadge;
import org.springframework.context.event.EventListener;
import javax.inject.Inject;
/**
* @author Rubin
* @version v1 2021/3/6 16:41
*/
@UiController("extMainScreen")
@UiDescriptor("ext-main-screen.xml")
public class ExtMainScreen extends MainScreen {
@Inject
protected MessageService messageService;
@Inject
protected SideMenu sideMenu;
@Inject
protected UserInboxMessageMenuBadge userInboxMessageMenuBadge;
@Subscribe
protected void onInit(InitEvent event) {
userInboxMessageMenuBadge.initMessagesMenuItem(sideMenu, this);
}
@EventListener
public void onSendMessage(SendMessageEvent event) {
if (messageService.countUnreadMessagesForCurrentUser() > 0) {
userInboxMessageMenuBadge.updateMessageCounter(sideMenu);
}
}
@Override
@Subscribe
protected void onAfterShow(AfterShowEvent event) {
if (messageService.countUnreadMessagesForCurrentUser() > 0) {
userInboxMessageMenuBadge.updateMessageCounter(sideMenu);
}
}
}
搞定~