Как переделать scheduler для vaadin 14 (spring boot и vaadin 14)

94
13 февраля 2022, 00:20

Всем привет я написал чат, где мне сказали чтобы я сделал таймер который будет каждую секунду вызывать функцию (api/unread) из RestService. Я ранее создал класс TimerConfig. Он работал, но сказали чтобы я его убрал и переделал так, чтобы был в классе MainView

public class TimerConfig {
// Таймер вызывает каждую секунду метод на загрузку сообщений из БД
    @Autowired
    MessageServiceImpl messageService;
    @Bean
    public TimerTask timer () {
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                messageService.getAllMessages();
            }
        };
        Timer timer = new Timer();
        timer.schedule(timerTask, 1000, 1000);
        return timerTask;
    }
}

Вот мой класс Mainview, здесь должен быть (The @Scheduled Annotation in Spring) который должен каждую секунду вызывать (api/unread)

StyleSheet("frontend://styles/styles.css")
@Route
@PWA(name = "Vaadin MessagesInfoManager", shortName = "Vaadin MessagesInfoManager")
@Push
@EnableScheduling
public class MainView extends VerticalLayout {
    private final MessagesInfoManager messagesInfoManager;
    private final RestService restService;
    private String username;
    @Autowired
    public MainView(RestService restService) {
        this.messagesInfoManager = MessageConfigurator.getInstance().getChatMessagesInfoManager();
        addClassName("main-view");
        setSizeFull();
        setDefaultHorizontalComponentAlignment(Alignment.CENTER);
        H1 header = new H1("Vaadin Chat");
        header.getElement().getThemeList().add("dark");
        add(header);
        askUsername();
        this.restService = restService;
    }
    private void askUsername() {
        HorizontalLayout layout = new HorizontalLayout();
        TextField usernameField = new TextField();
        Button startButton = new Button("Start chat");
        layout.add(usernameField, startButton);
        startButton.addClickListener(click -> {
            username = usernameField.getValue();
            remove(layout);
            showChat(username);
        });
        add(layout);
    }
    private void showChat(String username) {
        MessageList messageList = new MessageList();
        List<Message> lasts = restService.getLast();
        for (Message message : lasts) {
            messageList.add(new Paragraph(message.getFrom() + ": " + message.getMessage()));
        }
        add(messageList, createInputLayout(username, messageList));
        expand(messageList);
    }
    private Component createInputLayout(String username, MessageList messageList) {
        HorizontalLayout layout = new HorizontalLayout();
        layout.setWidth("100%");
        TextField messageField = new TextField();
        messageField.addKeyDownListener(Key.ENTER, keyDownEvent -> sender(messageField, messageList));
        Button sendButton = new Button("Send");
        sendButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
        layout.add(messageField, sendButton);
        layout.expand(messageField);
        messageField.addFocusListener(event -> {
            for (Message message : messagesInfoManager.getMessagesByUI(getUI())) {
                if (!message.getFrom().equals(username)) {
                    message.setUnread(false);
                    this.restService.updateMessage(message.getId(), message);
                }
            }
        });
        sendButton.addClickListener(click -> sender(messageField, messageList));
        messageField.focus();
        return layout;
    }
    private void sender(TextField textField, MessageList messageList) {
        Message message = new Message(username, textField.getValue());
        message = restService.saveMessage(message);
        messagesInfoManager.updateMessageUIInfo(new MessageInfo(messageList, message, this));
        textField.clear();
        textField.focus();
    }

}

А вот мой RestController

public class RestController {
    @Autowired
    TimerTask timerTask;
    @Resource
    private final MessageService messageService;
    public RestController(MessageService messageService) {
        this.messageService = messageService;
    }

    @GetMapping("/api/unread")
    public void getUnreadMessages() {
        // тут мы вызываем сам таймер
        timerTask.run();
    }

RestService

public class RestService {
    private final RestTemplate restTemplate;
public RestService(RestTemplateBuilder restTemplateBuilder) {
    this.restTemplate = restTemplateBuilder.build();
}

public List<Message> getUnreadMessages() {
    List<Message> list = new ArrayList<>();
    String url = "http://localhost:8080/api/save";
    return (List<Message>) restTemplate.getForEntity(url, Message[].class);
}

Для более ознакомления с проектом мой гитхаб https://github.com/fallen3019/vaadin-chat

Answer 1

Создайте метод в MainView, поставьте над ним аннотацию @Scheduled. Например так:

@Scheduled(fixedDelay = 1000)
public void reload(){
    messageService.getAllMessages();
    ...
}

подробнее можете посмотреть здесь https://www.baeldung.com/spring-scheduled-tasks

@SpringBootApplication
@EnableScheduling
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}
READ ALSO
Could not find or load main class while opening .JAR using CMD | Gradle | Intellij-idea

Could not find or load main class while opening .JAR using CMD | Gradle | Intellij-idea

Мучаюсь уже не один деньГде-то лежит небольшая маленькая ошибка и из-за неё вот ничего не получаеться

97
Как обойтись без CloudPayments?

Как обойтись без CloudPayments?

Всем привет! У меня вопрос про то, как реализовать платежную систему в Java без использования систем как CloudPaymentsВот описание: В приложении реализуется...

88
Что не так с тэгами в XML(SPRING)

Что не так с тэгами в XML(SPRING)

Вроде делаю все по книжке, поменял лишь на свои данныеСреда разработки ругается, тэги указаны неверно

149
получение нужных строк из файла

получение нужных строк из файла

Начал изучать Java и передо мной встала такая задача:

214