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 extends Number> 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 extends Number> 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 extends Number> 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 extends StrategyMessage> response = strategyClient.getStrategyMessages(null, // TODO strategy name filter
- null, // TODO strategy severity filter
+ String selectedStrategyName = strategyIdComboBox.valueProperty().get();
+ CollectionPageResponse extends StrategyMessage> 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 extends StrategyInstance> 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 extends StrategyMessage> 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
*/