diff --git a/quartz-manager-frontend/src/app/components/logs-panel/logs-panel.component.ts b/quartz-manager-frontend/src/app/components/logs-panel/logs-panel.component.ts index d630987..069747b 100644 --- a/quartz-manager-frontend/src/app/components/logs-panel/logs-panel.component.ts +++ b/quartz-manager-frontend/src/app/components/logs-panel/logs-panel.component.ts @@ -2,10 +2,12 @@ import {Component, OnInit, Input, Output, EventEmitter, OnDestroy} from '@angula import {LogsWebsocketService, ApiService, getBaseUrl, CONTEXT_PATH, QuartzManagerWebsocketMessage} from '../../services'; import {Observable} from 'rxjs'; -import {RxStompService, } from '../../services/rx-stomp.service'; +import {RxStompService,} from '../../services/rx-stomp.service'; import {RxStompConfig} from '@stomp/rx-stomp/esm6/rx-stomp-config'; import {LogsRxWebsocketService} from '../../services/logs.rx-websocket.service'; import {map} from 'rxjs/operators'; +import {Trigger} from '../../model/trigger.model'; +import {TriggerKey} from '../../model/triggerKey.model'; @Component({ @@ -21,6 +23,8 @@ export class LogsPanelComponent implements OnInit, OnDestroy { topicSubscription; + private selectedTriggerKey: TriggerKey; + constructor( // private logsWebsocketService: LogsWebsocketService, private logsRxWebsocketService: LogsRxWebsocketService, @@ -28,6 +32,14 @@ export class LogsPanelComponent implements OnInit, OnDestroy { ) { } + @Input() + set triggerKey(triggerKey: TriggerKey) { + this.selectedTriggerKey = {...triggerKey} as TriggerKey; + if (this.selectedTriggerKey && this.selectedTriggerKey.name) { + this._subscribeToTheTopic(this.selectedTriggerKey); + } + } + ngOnInit() { // const obs = this.logsWebsocketService.getObservable() // obs.subscribe({ @@ -37,17 +49,34 @@ export class LogsPanelComponent implements OnInit, OnDestroy { // } // }); - this.topicSubscription = this.logsRxWebsocketService.watch('/topic/logs') + // this.topicSubscription = this.logsRxWebsocketService.watch('/topic/logs') + // .pipe(map(msg => JSON.parse(msg.body))) + // .subscribe(this._showNewLog, (err) => { + // console.log(err); + // // TODO in case of 401 + // // this.apiService.get('/quartz-manager/session/refresh'); + // }); + } + + private _subscribeToTheTopic = (triggerKey: TriggerKey) => { + if (this.topicSubscription) { + this.topicSubscription.unsubscribe(); + } + this.topicSubscription = this.logsRxWebsocketService.watch(`/topic/logs/${triggerKey.name}`) .pipe(map(msg => JSON.parse(msg.body))) .subscribe(this._showNewLog, (err) => { console.log(err); // TODO in case of 401 // this.apiService.get('/quartz-manager/session/refresh'); }); - } + }; ngOnDestroy() { + if (this.topicSubscription) { + this.topicSubscription.unsubscribe(); + } this.topicSubscription.unsubscribe(); + this.topicSubscription = null; } // onNewLogMsg = (receivedMsg) => { diff --git a/quartz-manager-frontend/src/app/components/simple-trigger-config/simple-trigger-config.component.ts b/quartz-manager-frontend/src/app/components/simple-trigger-config/simple-trigger-config.component.ts index 1b643ae..15bd6db 100644 --- a/quartz-manager-frontend/src/app/components/simple-trigger-config/simple-trigger-config.component.ts +++ b/quartz-manager-frontend/src/app/components/simple-trigger-config/simple-trigger-config.component.ts @@ -73,8 +73,10 @@ export class SimpleTriggerConfigComponent implements OnInit { @Input() set triggerKey(triggerKey: TriggerKey) { - this.selectedTriggerKey = {...triggerKey} as TriggerKey; - this.fetchSelectedTrigger(); + if (!this.selectedTriggerKey || this.selectedTriggerKey.name !== triggerKey.name){ + this.selectedTriggerKey = {...triggerKey} as TriggerKey; + this.fetchSelectedTrigger(); + } } diff --git a/quartz-manager-frontend/src/app/components/trigger-list/trigger-list.component.ts b/quartz-manager-frontend/src/app/components/trigger-list/trigger-list.component.ts index 9e98f91..14e784c 100644 --- a/quartz-manager-frontend/src/app/components/trigger-list/trigger-list.component.ts +++ b/quartz-manager-frontend/src/app/components/trigger-list/trigger-list.component.ts @@ -90,7 +90,7 @@ export class TriggerListComponent implements OnInit { onNewTrigger(newTrigger: SimpleTrigger) { this.newTriggers = [newTrigger, ...this.newTriggers]; - this.selectedTrigger = newTrigger.triggerKeyDTO; + this.selectTrigger(newTrigger.triggerKeyDTO); } } diff --git a/quartz-manager-frontend/src/app/views/manager/manager.component.html b/quartz-manager-frontend/src/app/views/manager/manager.component.html index 05b11c9..c03d20c 100644 --- a/quartz-manager-frontend/src/app/views/manager/manager.component.html +++ b/quartz-manager-frontend/src/app/views/manager/manager.component.html @@ -30,7 +30,10 @@
- + +
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/jobs/AbstractQuartzManagerJob.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/jobs/AbstractQuartzManagerJob.java index 609ee8d..20d6c90 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/jobs/AbstractQuartzManagerJob.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/jobs/AbstractQuartzManagerJob.java @@ -38,11 +38,13 @@ public abstract class AbstractQuartzManagerJob implements Job { LogRecord logMsg = doIt(jobExecutionContext); log.info(logMsg.getMessage()); + String triggerName = jobExecutionContext.getTrigger().getKey().getName(); + logMsg.setThreadName(Thread.currentThread().getName()); - webSocketLogsNotifier.send(logMsg); + webSocketLogsNotifier.send(triggerName, logMsg); TriggerFiredBundleDTO triggerFiredBundleDTO = WebSocketProgressNotifier.buildTriggerFiredBundle(jobExecutionContext); - webSocketProgressNotifier.send(triggerFiredBundleDTO); + webSocketProgressNotifier.send(triggerName, triggerFiredBundleDTO); } } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/websockets/WebSocketLogsNotifier.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/websockets/WebSocketLogsNotifier.java index 9ced563..9cdbfb7 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/websockets/WebSocketLogsNotifier.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/websockets/WebSocketLogsNotifier.java @@ -14,7 +14,7 @@ public class WebSocketLogsNotifier implements WebhookSender { private SimpMessageSendingOperations messagingTemplate; @Override - public void send(LogRecord logRecord) { - messagingTemplate.convertAndSend(TOPIC_LOGS, logRecord); + public void send(String triggerName, LogRecord logRecord) { + messagingTemplate.convertAndSend(TOPIC_LOGS + "/" + triggerName, logRecord); } } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/websockets/WebSocketProgressNotifier.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/websockets/WebSocketProgressNotifier.java index 7eeba6d..281d744 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/websockets/WebSocketProgressNotifier.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/websockets/WebSocketProgressNotifier.java @@ -20,7 +20,7 @@ public class WebSocketProgressNotifier implements WebhookSender { - void send(T message); + void send(String triggerName, T message); } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/jobs/SampleJobTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/jobs/SampleJobTest.java index f56bd0d..f233979 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/jobs/SampleJobTest.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/jobs/SampleJobTest.java @@ -32,6 +32,7 @@ class SampleJobTest { @Test void givenASampleJob_whenTheJobIsExecuted_thenTheWebhookSendersAreCalled() { JobExecutionContext jobExecutionContext = Mockito.mock(JobExecutionContext.class); + String triggerName = "test-trigger"; ScheduleBuilder schedulerBuilder = SimpleScheduleBuilder.simpleSchedule() .withRepeatCount(5) @@ -40,6 +41,7 @@ class SampleJobTest { .newJob(SampleJob.class).withIdentity(JobKey.jobKey("test-job")) .build(); Trigger trigger = TriggerBuilder.newTrigger() + .withIdentity(triggerName) .forJob(jobDetail) .withSchedule(schedulerBuilder) .build(); @@ -47,14 +49,14 @@ class SampleJobTest { Mockito.when(jobExecutionContext.getJobDetail()).thenReturn(jobDetail); sampleJob.execute(jobExecutionContext); - Mockito.verify(webSocketLogsNotifier).send(argThat(actualLogRecord -> { + Mockito.verify(webSocketLogsNotifier).send(triggerName, argThat(actualLogRecord -> { Assertions.assertThat(actualLogRecord.getMessage()).isEqualTo("Hello!"); Assertions.assertThat(actualLogRecord.getType()).isEqualTo(LogRecord.LogType.INFO); Assertions.assertThat(actualLogRecord.getDate()).isNotNull(); Assertions.assertThat(actualLogRecord.getThreadName()).isNotNull(); return true; })); - Mockito.verify(webSocketProgressNotifier).send(argThat(triggerFiredBundleDTO -> { + Mockito.verify(webSocketProgressNotifier).send(triggerName, argThat(triggerFiredBundleDTO -> { Assertions.assertThat(triggerFiredBundleDTO.getJobKey()).isEqualTo("test-job"); Assertions.assertThat(triggerFiredBundleDTO.getRepeatCount()).isEqualTo(6); Assertions.assertThat(triggerFiredBundleDTO.getJobClass()).isEqualTo(SampleJob.class.getName());