diff --git a/photon/src/main/java/org/marketcetera/ui/strategy/view/DisplayStrategyInstance.java b/photon/src/main/java/org/marketcetera/ui/strategy/view/DisplayStrategyInstance.java index a4b271cbc9..7c3088a52b 100644 --- a/photon/src/main/java/org/marketcetera/ui/strategy/view/DisplayStrategyInstance.java +++ b/photon/src/main/java/org/marketcetera/ui/strategy/view/DisplayStrategyInstance.java @@ -43,7 +43,9 @@ public DisplayStrategyInstance(String inName, owner.setValue(inOwnerName); strategyStatus.setValue(StrategyStatus.PREPARING); uploadProgress.setValue(0.0); - started.setValue(new Period(0)); + started.setValue(null); + uptime.setValue(new Period(0)); + setupRuntimeListener(); } /** * Create a new DisplayStrategy instance. @@ -55,18 +57,9 @@ public DisplayStrategyInstance(StrategyInstance inStrategyInstance) strategyName.setValue(inStrategyInstance.getName()); owner.setValue(inStrategyInstance.getUser().getName()); strategyStatus.setValue(inStrategyInstance.getStatus()); - switch(inStrategyInstance.getStatus()) { - case ERROR: - case LOADING: - case STOPPED: - started.setValue(new Period(0)); - break; - case RUNNING: - updateRunningProperty(inStrategyInstance.getStarted()); - break; - default: - break; - } + started.setValue(inStrategyInstance.getStarted()); + setupRuntimeListener(); + updateRunningProperty(); } /** * @@ -74,12 +67,12 @@ public DisplayStrategyInstance(StrategyInstance inStrategyInstance) * * @param inRunningValue */ - public void updateRunningProperty(Date inRunningValue) + public void updateRunningProperty() { - if(inRunningValue == null) { - started.setValue(new Period(0)); + if(started.get() == null || started.get().getTime() == 0) { + uptime.setValue(new Period(0)); } else { - started.setValue(new Period(DateTime.now().minus(inRunningValue.getTime()).getMillis())); + uptime.setValue(new Period(DateTime.now().minus(started.get().getTime()).getMillis())); } } /** @@ -92,13 +85,13 @@ public ReadOnlyStringProperty strategyNameProperty() return strategyName; } /** - * Get the started value. + * Get the uptime value. * * @return an ObjectProperty<Period> value */ - public ObjectProperty startedProperty() + public ObjectProperty uptimeProperty() { - return started; + return uptime; } /** * Get the owner value. @@ -109,6 +102,15 @@ public ReadOnlyStringProperty ownerProperty() { return owner; } + /** + * Get the started property. + * + * @return an ObjectProperty<Date> value + */ + public ObjectProperty startedProperty() + { + return started; + } /** * Get the strategyStatus value. * @@ -122,8 +124,13 @@ public DoubleProperty uploadProgressProperty() { return uploadProgress; } + private void setupRuntimeListener() + { + strategyStatus.addListener((observableValue,oldValue,newValue) -> updateRunningProperty()); + } + private final ObjectProperty started = new SimpleObjectProperty<>(); private final StringProperty strategyName = new SimpleStringProperty(); - private final ObjectProperty started = new SimpleObjectProperty<>(); + private final ObjectProperty uptime = new SimpleObjectProperty<>(); private final StringProperty owner = new SimpleStringProperty(); private final ObjectProperty strategyStatus = new SimpleObjectProperty<>(); private final DoubleProperty uploadProgress = new SimpleDoubleProperty(); diff --git a/photon/src/main/java/org/marketcetera/ui/strategy/view/StrategyView.java b/photon/src/main/java/org/marketcetera/ui/strategy/view/StrategyView.java index 2bb27568e0..60c4cd124d 100644 --- a/photon/src/main/java/org/marketcetera/ui/strategy/view/StrategyView.java +++ b/photon/src/main/java/org/marketcetera/ui/strategy/view/StrategyView.java @@ -2,9 +2,13 @@ import java.io.File; import java.util.Collection; +import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.Optional; import java.util.Properties; +import java.util.Timer; +import java.util.TimerTask; import java.util.UUID; import javax.annotation.PostConstruct; @@ -26,7 +30,6 @@ import org.marketcetera.strategy.StrategyPermissions; import org.marketcetera.strategy.StrategyStatus; import org.marketcetera.strategy.events.StrategyEvent; -import org.marketcetera.strategy.events.StrategyRuntimeUpdateEvent; import org.marketcetera.strategy.events.StrategyStartFailedEvent; import org.marketcetera.strategy.events.StrategyStartedEvent; import org.marketcetera.strategy.events.StrategyStatusChangedEvent; @@ -41,7 +44,9 @@ import org.marketcetera.ui.strategy.service.StrategyClientService; import org.marketcetera.ui.view.AbstractContentView; import org.marketcetera.util.log.SLF4JLoggerProxy; +import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -94,6 +99,7 @@ * @since $Release$ */ @Component +@AutoConfiguration @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class StrategyView extends AbstractContentView @@ -106,7 +112,7 @@ public class StrategyView public void start() { strategyClient = serviceManager.getService(StrategyClientService.class); - mainLayout = new VBox(5); + mainLayout = new VBox(10); initializeStrategyTable(); initializeEventTable(); eventTableCurrentPage = 0; @@ -126,8 +132,12 @@ public void changed(ObservableValue inObservable, }} ); strategyIdComboBox = new ComboBox<>(); + strategyIdComboBox.getItems().add(ALL_STRATEGIES); + strategyIdComboBox.valueProperty().addListener((observableValue,oldValue,newValue) -> updateEvents()); severityComboBox = new ComboBox<>(); severityComboBox.getItems().addAll(Severity.values()); + severityComboBox.setValue(Severity.INFO); + severityComboBox.valueProperty().addListener((observableValue,oldValue,newValue) -> updateEvents()); filterLayout = new GridPane(); filterLayout.setHgap(10); filterLayout.setVgap(10); @@ -141,7 +151,7 @@ public void changed(ObservableValue inObservable, loadStrategyButton = new Button("Load Strategy"); loadStrategyButton.setDisable(!authzHelperService.hasPermission(StrategyPermissions.LoadStrategyAction)); loadStrategyButton.setOnAction(event -> loadStrategy()); - buttonLayout = new HBox(5); + buttonLayout = new HBox(10); buttonLayout.getChildren().add(loadStrategyButton); mainLayout.getChildren().addAll(strategyTable, new Separator(Orientation.HORIZONTAL), @@ -154,14 +164,28 @@ public void changed(ObservableValue inObservable, updateStrategies(); updateEvents(); strategyClient.addStrategyEventListener(this); + strategyRuntimeUpdateTimer = new Timer(); + strategyRuntimeUpdateTimer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() + { + try { + updateStrategyRuntime(); + } catch (Exception e) { + SLF4JLoggerProxy.warn(StrategyView.this, + e); + } + }},new Date(System.currentTimeMillis() + strategyRuntimeUpdateInterval),strategyRuntimeUpdateInterval); } - /* (non-Javadoc) * @see org.marketcetera.ui.view.ContentView#onClose(javafx.stage.WindowEvent) */ @Override public void onClose(WindowEvent inEvent) { + try { + strategyRuntimeUpdateTimer.cancel(); + } catch (Exception ignored) {} strategyClient.removeStrategyEventListener(this); } /* (non-Javadoc) @@ -188,11 +212,9 @@ public void receiveStrategyEvent(StrategyEvent inEvent) public void run() { if(inEvent instanceof StrategyStoppedEvent) { - displayStrategyInstance.updateRunningProperty(null); - } else if(inEvent instanceof StrategyRuntimeUpdateEvent) { - StrategyRuntimeUpdateEvent event = (StrategyRuntimeUpdateEvent)inEvent; - displayStrategyInstance.updateRunningProperty(event.getStrategyInstance().getStarted()); + displayStrategyInstance.startedProperty().set(null); } else if(inEvent instanceof StrategyStartedEvent) { + displayStrategyInstance.startedProperty().set(inEvent.getStrategyInstance().getStarted()); } else if(inEvent instanceof StrategyUploadFailedEvent) { } else if(inEvent instanceof StrategyUploadSucceededEvent) { } else if(inEvent instanceof StrategyStartFailedEvent) { @@ -240,12 +262,21 @@ public StrategyView(Stage inParent, inEvent, inProperties); } + private void updateStrategyRuntime() + { + Platform.runLater(() -> { + for(DisplayStrategyInstance displayStrategyInstance : strategyTable.getItems()) { + displayStrategyInstance.updateRunningProperty(); + } + }); + } private void updateEvents() { PageRequest pageRequest = new PageRequest(eventTableCurrentPage, eventTablePageSize); - CollectionPageResponse response = strategyClient.getStrategyMessages(null, // TODO strategy name filter - null, // TODO strategy severity filter + String selectedStrategyName = strategyIdComboBox.valueProperty().get(); + CollectionPageResponse response = strategyClient.getStrategyMessages(selectedStrategyName == null || ALL_STRATEGIES.equals(selectedStrategyName) ? null : selectedStrategyName, + severityComboBox.getValue(), pageRequest); Platform.runLater(new Runnable() { @Override @@ -272,7 +303,6 @@ private void loadStrategy() return; } User owner = ownerOption.get(); - // TODO to avoid duplicates, check the existing strategies for this user and add a retry FileChooser strategyFileChooser = new FileChooser(); strategyFileChooser.setTitle("Choose the Strategy JAR File"); strategyFileChooser.getExtensionFilters().add(new ExtensionFilter("JAR Files", @@ -353,7 +383,7 @@ private void loadStrategy() name = nameOption.get(); String nonce = UUID.randomUUID().toString(); final DisplayStrategyInstance newItem = new DisplayStrategyInstance(name, - owner.getName()); + owner.getName()); strategyTable.getItems().add(newItem); try { getScene().setCursor(Cursor.WAIT); @@ -373,7 +403,7 @@ public void onProgress(double inPercentComplete) inPercentComplete); // TODO update progress bar in strategy table // TODO we've shoehorned in a new value that won't display if we refresh strategies - need to factor that in - newItem.uploadProgressProperty().set(inPercentComplete); + Platform.runLater(() -> newItem.uploadProgressProperty().set(inPercentComplete)); } /* (non-Javadoc) * @see org.marketcetera.strategy.FileUploadRequest#onStatus(org.marketcetera.strategy.FileUploadStatus) @@ -410,17 +440,17 @@ public void onError(Throwable inThrowable) }; strategyClient.uploadFile(uploadRequest); updateStrategies(); -// webMessageService.post(new NotificationEvent("Load Strategy", -// "Strategy '" + name + "' loaded with status: " + status, -// AlertType.INFORMATION)); + webMessageService.post(new NotificationEvent("Load Strategy", + "Strategy '" + name + "' loaded", + AlertType.INFORMATION)); } catch (Exception e) { -// SLF4JLoggerProxy.warn(this, -// e, -// "Unable to create '{}'", -// newStrategyInstance); -// webMessageService.post(new NotificationEvent("Load Strategy", -// "File '" + result.getAbsolutePath() + "' could not be read", -// AlertType.WARNING)); + SLF4JLoggerProxy.warn(this, + e, + "Unable to create '{}'", + name); + webMessageService.post(new NotificationEvent("Load Strategy", + "File '" + result.getAbsolutePath() + "' could not be read", + AlertType.WARNING)); } finally { getScene().setCursor(Cursor.DEFAULT); } @@ -445,14 +475,28 @@ private void cancelStrategyUpload(DisplayStrategyInstance inSelectedItem) private void updateStrategies() { Platform.runLater(() -> { + String selectedStrategyName = strategyIdComboBox.valueProperty().get(); + strategyIdComboBox.getItems().clear(); strategyTable.getItems().clear(); Collection results = strategyClient.getStrategyInstances(); if(results == null) { return; } List displayStrategies = Lists.newArrayList(); - results.forEach(result -> displayStrategies.add(new DisplayStrategyInstance(result))); + List strategyNames = Lists.newArrayList(); + results.forEach(result -> { + displayStrategies.add(new DisplayStrategyInstance(result)); + strategyNames.add(result.getName()); + }); + Collections.sort(strategyNames); + strategyIdComboBox.getItems().add(ALL_STRATEGIES); + strategyIdComboBox.getItems().addAll(strategyNames); strategyTable.getItems().addAll(displayStrategies); + if(strategyIdComboBox.getItems().contains(selectedStrategyName)) { + strategyIdComboBox.valueProperty().set(selectedStrategyName); + } else { + strategyIdComboBox.valueProperty().set(ALL_STRATEGIES); + } }); } private void initializeStrategyTable() @@ -473,21 +517,18 @@ private void initializeEventTable() } private void initializeEventTableColumns() { - eventStrategyIdColumn = new TableColumn<>("Strategy"); - eventStrategyIdColumn.setCellValueFactory(new PropertyValueFactory<>("strategyId")); + eventStrategyNameColumn = new TableColumn<>("Strategy"); + eventStrategyNameColumn.setCellValueFactory(new PropertyValueFactory<>("strategyId")); eventTimestampColumn = new TableColumn<>("Timestamp"); eventTimestampColumn.setCellValueFactory(new PropertyValueFactory<>("timestamp")); eventTimestampColumn.setCellFactory(tableColumn -> PhotonServices.renderDateTimeCell(tableColumn)); eventSeverityColumn = new TableColumn<>("Severity"); eventSeverityColumn.setCellValueFactory(new PropertyValueFactory<>("severity")); - eventTypeColumn = new TableColumn<>("Event Type"); - eventTypeColumn.setCellValueFactory(new PropertyValueFactory<>("eventType")); eventMessageColumn = new TableColumn<>("Message"); eventMessageColumn.setCellValueFactory(new PropertyValueFactory<>("message")); - eventTable.getColumns().add(eventStrategyIdColumn); + eventTable.getColumns().add(eventStrategyNameColumn); eventTable.getColumns().add(eventTimestampColumn); eventTable.getColumns().add(eventSeverityColumn); - eventTable.getColumns().add(eventTypeColumn); eventTable.getColumns().add(eventMessageColumn); } private void initializeStrategyTableColumns() @@ -497,7 +538,7 @@ private void initializeStrategyTableColumns() strategyStatusColumn = new TableColumn<>("Status"); strategyStatusColumn.setCellValueFactory(new PropertyValueFactory<>("strategyStatus")); strategyUptimeColumn = new TableColumn<>("Uptime"); - strategyUptimeColumn.setCellValueFactory(new PropertyValueFactory<>("started")); + strategyUptimeColumn.setCellValueFactory(new PropertyValueFactory<>("uptime")); strategyUptimeColumn.setCellFactory(tableColumn -> PhotonServices.renderPeriodCell(tableColumn)); strategyOwnerColumn = new TableColumn<>("Owner"); strategyOwnerColumn.setCellValueFactory(new PropertyValueFactory<>("owner")); @@ -679,9 +720,30 @@ private void startStrategy(DisplayStrategyInstance inSelectedStrategy) } updateStrategies(); } - protected int eventTableCurrentPage; - protected int eventTablePageSize; - protected Pagination eventTablePagination; +// private static class StringComparator +// implements Comparator +// { +// /* (non-Javadoc) +// * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) +// */ +// @Override +// public int compare(String inO1, +// String inO2) +// { +// return new CompareToBuilder().append(inO1,inO2).toComparison(); +// } +// private final static StringComparator instance = new StringComparator(); +// } + /** + * interval at which runtime update events will be sent out + */ + @Value("${metc.strategy.runtime.update.interval:1000}") + private long strategyRuntimeUpdateInterval; + private Timer strategyRuntimeUpdateTimer; + private final String ALL_STRATEGIES = ""; + private int eventTableCurrentPage; + private int eventTablePageSize; + private Pagination eventTablePagination; private MenuItem startStrategyMenuItem; private MenuItem stopStrategyMenuItem; private MenuItem unloadStrategyMenuItem; @@ -701,10 +763,9 @@ private void startStrategy(DisplayStrategyInstance inSelectedStrategy) private TableColumn strategyUptimeColumn; private TableColumn strategyOwnerColumn; private TableColumn strategyProgressColumn; - private TableColumn eventStrategyIdColumn; + private TableColumn eventStrategyNameColumn; private TableColumn eventTimestampColumn; private TableColumn eventSeverityColumn; - private TableColumn eventTypeColumn; private TableColumn eventMessageColumn; private Button loadStrategyButton; private TableView strategyTable; diff --git a/photon/todo.txt b/photon/todo.txt index fa8a79d48b..3e49e03ef2 100644 --- a/photon/todo.txt +++ b/photon/todo.txt @@ -66,6 +66,7 @@ ***************** * strategy view * ***************** +- don't need runtime update - can calculate locally until the status changes - reverify strategy before starting - how to identify the strategy instance for events emitted through the strategy client? maybe create a special kind of client that knows the strategy instance? otherwise, we run the risk of a strategy impersonating another strategy. - cancel big uploads diff --git a/strategy/strategy-api/src/main/java/org/marketcetera/strategy/events/StrategyRuntimeUpdateEvent.java b/strategy/strategy-api/src/main/java/org/marketcetera/strategy/events/StrategyRuntimeUpdateEvent.java deleted file mode 100644 index 90ed8dc9b8..0000000000 --- a/strategy/strategy-api/src/main/java/org/marketcetera/strategy/events/StrategyRuntimeUpdateEvent.java +++ /dev/null @@ -1,18 +0,0 @@ -// -// this file is automatically generated -// -package org.marketcetera.strategy.events; - -/* $License$ */ - -/** - * Indicates that a strategy runtime has changed. - * - * @author Colin DuPlantis - * @version $Id$ - * @since $Release$ - */ -public interface StrategyRuntimeUpdateEvent - extends org.marketcetera.strategy.HasStrategyInstance,org.marketcetera.strategy.events.StrategyEvent -{ -} diff --git a/strategy/strategy-core/src/main/java/org/marketcetera/strategy/events/SimpleStrategyRuntimeUpdateEvent.java b/strategy/strategy-core/src/main/java/org/marketcetera/strategy/events/SimpleStrategyRuntimeUpdateEvent.java deleted file mode 100644 index 181eb9fc0e..0000000000 --- a/strategy/strategy-core/src/main/java/org/marketcetera/strategy/events/SimpleStrategyRuntimeUpdateEvent.java +++ /dev/null @@ -1,69 +0,0 @@ -// -// this file is automatically generated -// -package org.marketcetera.strategy.events; - -import org.marketcetera.core.Preserve; -import org.marketcetera.strategy.StrategyInstance; - -/* $License$ */ - -/** - * Indicates that a strategy runtime has changed. - * - * @author Colin DuPlantis - * @version $Id$ - * @since $Release$ - */ -@Preserve -public class SimpleStrategyRuntimeUpdateEvent - implements StrategyRuntimeUpdateEvent -{ - /** - * Create a new SimpleStrategyRuntimeUpdateEvent instance. - */ - public SimpleStrategyRuntimeUpdateEvent() {} - /** - * Create a new SimpleStrategyRuntimeUpdateEvent instance. - * - * @param inRunningStrategyInstance a StrategyInstance value - */ - public SimpleStrategyRuntimeUpdateEvent(StrategyInstance inRunningStrategyInstance) - { - strategyInstance = inRunningStrategyInstance; - } - /** - * Get the strategyInstance value. - * - * @return an org.marketcetera.strategy.StrategyInstance value - */ - @Override - public org.marketcetera.strategy.StrategyInstance getStrategyInstance() - { - return strategyInstance; - } - /** - * Set the strategyInstance value. - * - * @param inStrategyInstance an org.marketcetera.strategy.StrategyInstance value - */ - public void setStrategyInstance(org.marketcetera.strategy.StrategyInstance inStrategyInstance) - { - strategyInstance = inStrategyInstance; - } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() - { - StringBuilder builder = new StringBuilder(); - builder.append("StrategyRuntimeUpdateEvent [") - .append("strategyInstance=").append(strategyInstance).append("]"); - return builder.toString(); - } - /** - * strategy instance for which the runtime is being updated - */ - private org.marketcetera.strategy.StrategyInstance strategyInstance; -} diff --git a/strategy/strategy-rpc-core/src/main/java/org/marketcetera/strategy/StrategyRpcUtil.java b/strategy/strategy-rpc-core/src/main/java/org/marketcetera/strategy/StrategyRpcUtil.java index 79917ffe23..ebff290df7 100644 --- a/strategy/strategy-rpc-core/src/main/java/org/marketcetera/strategy/StrategyRpcUtil.java +++ b/strategy/strategy-rpc-core/src/main/java/org/marketcetera/strategy/StrategyRpcUtil.java @@ -8,7 +8,6 @@ import org.marketcetera.admin.UserFactory; import org.marketcetera.core.Preserve; import org.marketcetera.rpc.base.BaseRpcUtil; -import org.marketcetera.strategy.events.SimpleStrategyRuntimeUpdateEvent; import org.marketcetera.strategy.events.SimpleStrategyStartFailedEvent; import org.marketcetera.strategy.events.SimpleStrategyStartedEvent; import org.marketcetera.strategy.events.SimpleStrategyStatusChangedEvent; @@ -17,7 +16,6 @@ import org.marketcetera.strategy.events.SimpleStrategyUploadFailedEvent; import org.marketcetera.strategy.events.SimpleStrategyUploadSucceededEvent; import org.marketcetera.strategy.events.StrategyEvent; -import org.marketcetera.strategy.events.StrategyRuntimeUpdateEvent; import org.marketcetera.strategy.events.StrategyStartFailedEvent; import org.marketcetera.strategy.events.StrategyStartedEvent; import org.marketcetera.strategy.events.StrategyStatusChangedEvent; @@ -201,7 +199,6 @@ public static void setStrategyEvent(StrategyEvent inStrategyEvent, if(inStrategyEvent instanceof StrategyUploadFailedEvent) { StrategyUploadFailedEvent failedEvent = (StrategyUploadFailedEvent)inStrategyEvent; rpcEventBuilder.setMessage(failedEvent.getErrorMessage()); - } else if(inStrategyEvent instanceof StrategyRuntimeUpdateEvent) { } else if(inStrategyEvent instanceof StrategyUploadSucceededEvent) { } else if(inStrategyEvent instanceof StrategyUnloadedEvent) { } else if(inStrategyEvent instanceof StrategyStartedEvent) { @@ -241,10 +238,6 @@ public static StrategyEvent getStrategyEvent(StrategyRpc.StrategyEventListenerRe if(strategyInstanceOption.isPresent()) { StrategyInstance strategyInstance = strategyInstanceOption.get(); switch(rpcEvent.getEventType()) { - case "SimpleStrategyRuntimeUpdateEvent": - SimpleStrategyRuntimeUpdateEvent updateEvent = new SimpleStrategyRuntimeUpdateEvent(); - updateEvent.setStrategyInstance(strategyInstance); - return updateEvent; case "SimpleStrategyStartedEvent": SimpleStrategyStartedEvent startEvent = new SimpleStrategyStartedEvent(); startEvent.setStrategyInstance(strategyInstance); diff --git a/strategy/strategy-rpc-core/src/test/resources/code-generator.xml b/strategy/strategy-rpc-core/src/test/resources/code-generator.xml index 9c2e901161..cb67cdd4d0 100644 --- a/strategy/strategy-rpc-core/src/test/resources/code-generator.xml +++ b/strategy/strategy-rpc-core/src/test/resources/code-generator.xml @@ -63,13 +63,13 @@ type="org.marketcetera.strategy.StrategyStatus" pojoType="org.marketcetera.strategy.StrategyStatus" apiType="org.marketcetera.strategy.StrategyStatus"/> - + <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a> - + diff --git a/strategy/strategy-server/src/main/java/org/marketcetera/strategy/DirectStrategyClient.java b/strategy/strategy-server/src/main/java/org/marketcetera/strategy/DirectStrategyClient.java index 5fd19621f1..f79c25c623 100644 --- a/strategy/strategy-server/src/main/java/org/marketcetera/strategy/DirectStrategyClient.java +++ b/strategy/strategy-server/src/main/java/org/marketcetera/strategy/DirectStrategyClient.java @@ -3,6 +3,7 @@ import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.util.Collection; +import java.util.Date; import java.util.Optional; import org.apache.commons.lang.Validate; @@ -143,6 +144,7 @@ public void emitMessage(Severity inSeverity, strategyMessage.setSeverity(inSeverity); strategyMessage.setMessage(inMessage); strategyMessage.setStrategyInstance(getStrategyInstanceHolder().getStrategyInstance()); + strategyMessage.setMessageTimestamp(new Date()); getStrategyService().createStrategyMessage(strategyMessage); } /* (non-Javadoc) diff --git a/strategy/strategy-server/src/main/java/org/marketcetera/strategy/StrategyServiceImpl.java b/strategy/strategy-server/src/main/java/org/marketcetera/strategy/StrategyServiceImpl.java index aa4ce6c134..04064c5fef 100644 --- a/strategy/strategy-server/src/main/java/org/marketcetera/strategy/StrategyServiceImpl.java +++ b/strategy/strategy-server/src/main/java/org/marketcetera/strategy/StrategyServiceImpl.java @@ -13,12 +13,9 @@ import java.nio.file.Paths; import java.util.Collection; import java.util.Date; -import java.util.EnumSet; import java.util.List; import java.util.Optional; import java.util.Set; -import java.util.Timer; -import java.util.TimerTask; import java.util.jar.Attributes; import java.util.jar.JarInputStream; import java.util.jar.Manifest; @@ -47,7 +44,6 @@ import org.marketcetera.strategy.dao.QPersistentStrategyMessage; import org.marketcetera.strategy.dao.StrategyInstanceDao; import org.marketcetera.strategy.dao.StrategyMessageDao; -import org.marketcetera.strategy.events.SimpleStrategyRuntimeUpdateEvent; import org.marketcetera.strategy.events.SimpleStrategyStartFailedEvent; import org.marketcetera.strategy.events.SimpleStrategyStartedEvent; import org.marketcetera.strategy.events.SimpleStrategyStatusChangedEvent; @@ -68,13 +64,9 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; -import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.stereotype.Component; -import org.springframework.transaction.TransactionDefinition; -import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.support.DefaultTransactionDefinition; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; @@ -144,18 +136,6 @@ public void start() strategyInstanceDao.delete(existingStrategyInstance); } } - strategyUpdateTimer = new Timer(); - strategyUpdateTimer.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() - { - try { - updateRunningStrategies(); - } catch (Exception e) { - SLF4JLoggerProxy.warn(StrategyServiceImpl.this, - e); - } - }},new Date(System.currentTimeMillis() + strategyRuntimeUpdateInterval),strategyRuntimeUpdateInterval); } /** * Stop the object. @@ -163,7 +143,6 @@ public void run() @PreDestroy public void stop() { - strategyUpdateTimer.cancel(); eventBusService.unregister(this); if(strategyWatcher != null) { try { @@ -210,9 +189,11 @@ public CollectionPageResponse getStrategyMessages(Str new Sort.Order(Sort.Direction.DESC, QPersistentStrategyMessage.persistentStrategyMessage.severity.getMetadata().getName()))); SLF4JLoggerProxy.debug(this, - "getStrategyMessages sort order is {} renders: {}", + "getStrategyMessages sort order is {} renders: {} with strategy name {} and severity {}", inPageRequest.getSortOrder(), - sort); + sort, + inStrategyName, + inSeverity); Pageable pageRequest = PageRequest.of(inPageRequest.getPageNumber(), inPageRequest.getPageSize(), sort); @@ -596,29 +577,6 @@ private Sort buildSort(org.marketcetera.persist.PageRequest inPageRequest, return Sort.by(specifiedSorts); } } - /** - * Sends out update events for all running strategies. - */ - private void updateRunningStrategies() - { - DefaultTransactionDefinition def = new DefaultTransactionDefinition(); - def.setName("updateRunningStrategiesTransaction"); - def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); - def.setReadOnly(true); - TransactionStatus status = txManager.getTransaction(def); - try { - for(PersistentStrategyInstance runningStrategyInstance : strategyInstanceDao.findAllByStatusIn(EnumSet.of(StrategyStatus.RUNNING))) { - try { - eventBusService.post(new SimpleStrategyRuntimeUpdateEvent(runningStrategyInstance)); - } catch (Exception e) { - SLF4JLoggerProxy.warn(this, - e); - } - } - } finally { - txManager.commit(status); - } - } /** * Tracks a running strategy instance. * @@ -763,10 +721,6 @@ private RunningStrategy(StrategyInstance inStrategyInstance, * directory which is used to store uploaded strategies after they are verified */ private Path storageStrategyDirectoryPath; - /** - * timer used to send out strategy runtime updates - */ - private Timer strategyUpdateTimer; /** * main application context */ @@ -777,11 +731,6 @@ private RunningStrategy(StrategyInstance inStrategyInstance, */ @Value("${metc.strategy.incoming.directory.polling.intervalms:5000}") private long pollingInterval; - /** - * interval at which runtime update events will be sent out - */ - @Value("${metc.strategy.runtime.update.interval:1000}") - private long strategyRuntimeUpdateInterval; /** * strategy storage directory base */ @@ -805,11 +754,6 @@ private RunningStrategy(StrategyInstance inStrategyInstance, * watches the incoming strategy directory */ private DirectoryWatcherImpl strategyWatcher; - /** - * provides access to the transaction manager - */ - @Autowired - private JpaTransactionManager txManager; /** * provides access to cluster services */