diff --git a/core/commons/che-core-commons-gwt/src/main/java/org/eclipse/che/ide/websocket/AbstractMessageBus.java b/core/commons/che-core-commons-gwt/src/main/java/org/eclipse/che/ide/websocket/AbstractMessageBus.java
index 47734a67e8..9b6435aac0 100644
--- a/core/commons/che-core-commons-gwt/src/main/java/org/eclipse/che/ide/websocket/AbstractMessageBus.java
+++ b/core/commons/che-core-commons-gwt/src/main/java/org/eclipse/che/ide/websocket/AbstractMessageBus.java
@@ -139,6 +139,13 @@ abstract class AbstractMessageBus implements MessageBus {
};
}
+ public void cancelReconnection() {
+ frequentlyReconnectionAttemptsCounter = MAX_FREQUENTLY_RECONNECTION_ATTEMPTS;
+ seldomReconnectionAttemptsCounter = MAX_SELDOM_RECONNECTION_ATTEMPTS;
+ frequentlyReconnectionTimer.cancel();
+ seldomReconnectionTimer.cancel();
+ }
+
private void initialize() {
ws = WebSocket.create(wsConnectionUrl);
wsListener = new WsListener();
@@ -329,7 +336,6 @@ abstract class AbstractMessageBus implements MessageBus {
* e.g.: WebSocket is not supported by browser, WebSocket connection is not opened
*/
private void send(String message) throws WebSocketException {
-// checkWebSocketConnectionState();
if (getReadyState() != ReadyState.OPEN) {
messages2send.add(message);
return;
diff --git a/core/commons/che-core-commons-gwt/src/main/java/org/eclipse/che/ide/websocket/MessageBus.java b/core/commons/che-core-commons-gwt/src/main/java/org/eclipse/che/ide/websocket/MessageBus.java
index 3ceda0f6fe..7cf8877eb1 100644
--- a/core/commons/che-core-commons-gwt/src/main/java/org/eclipse/che/ide/websocket/MessageBus.java
+++ b/core/commons/che-core-commons-gwt/src/main/java/org/eclipse/che/ide/websocket/MessageBus.java
@@ -183,4 +183,9 @@ public interface MessageBus extends MessageReceivedHandler {
* @return true if handler subscribed to channel and false if not
*/
boolean isHandlerSubscribed(MessageHandler handler, String channel);
-}
\ No newline at end of file
+
+ /**
+ * Cancels attempts to reconnect by WebSocket
+ */
+ void cancelReconnection();
+}
diff --git a/core/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/workspace/WorkspaceComponent.java b/core/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/workspace/WorkspaceComponent.java
index d3f6fe763c..4eb6e385e7 100644
--- a/core/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/workspace/WorkspaceComponent.java
+++ b/core/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/workspace/WorkspaceComponent.java
@@ -182,6 +182,9 @@ public abstract class WorkspaceComponent implements Component, WsAgentStateHandl
loader.show(initialLoadingInfo);
initialLoadingInfo.setOperationStatus(WORKSPACE_BOOTING.getValue(), IN_PROGRESS);
+ if (messageBus != null) {
+ messageBus.cancelReconnection();
+ }
messageBus = messageBusProvider.createMessageBus(workspace.getId());
messageBus.addOnOpenHandler(new ConnectionOpenedHandler() {
diff --git a/core/platform-api-client-gwt/che-core-client-gwt-machine/src/main/java/org/eclipse/che/api/machine/gwt/client/MachineManager.java b/core/platform-api-client-gwt/che-core-client-gwt-machine/src/main/java/org/eclipse/che/api/machine/gwt/client/MachineManager.java
index b19309823d..9a6ca198b6 100644
--- a/core/platform-api-client-gwt/che-core-client-gwt-machine/src/main/java/org/eclipse/che/api/machine/gwt/client/MachineManager.java
+++ b/core/platform-api-client-gwt/che-core-client-gwt-machine/src/main/java/org/eclipse/che/api/machine/gwt/client/MachineManager.java
@@ -26,6 +26,14 @@ public interface MachineManager {
START, RESTART, DESTROY
}
+ /**
+ * Performs some actions when dev machine is creating.
+ *
+ * @param machineConfig
+ * contains information about dev machine configuration
+ */
+ void onDevMachineCreating(MachineConfigDto machineConfig);
+
/**
* Performs some actions when machine is running.
*
@@ -72,10 +80,12 @@ public interface MachineManager {
void restartMachine(final MachineDto machine);
/**
- * Performs some actions when dev machine is creating.
+ * Checks if the the status for dev machine is tracked by machine manager.
*
- * @param machineConfig
- * contains information about dev machine configuration
+ * @param machine
+ * contains information about machine state
+ * @return {@code true} if status for dev machine is tracked by machine manager and {@code false} - otherwise.
*/
- void onDevMachineCreating(MachineConfigDto machineConfig);
+ boolean isDevMachineStatusTracked(MachineDto machine);
+
}
diff --git a/core/platform-api-client-gwt/che-core-client-gwt-machine/src/main/java/org/eclipse/che/api/machine/gwt/client/WsAgentStateController.java b/core/platform-api-client-gwt/che-core-client-gwt-machine/src/main/java/org/eclipse/che/api/machine/gwt/client/WsAgentStateController.java
index 94488444a5..6ab16f0e36 100644
--- a/core/platform-api-client-gwt/che-core-client-gwt-machine/src/main/java/org/eclipse/che/api/machine/gwt/client/WsAgentStateController.java
+++ b/core/platform-api-client-gwt/che-core-client-gwt-machine/src/main/java/org/eclipse/che/api/machine/gwt/client/WsAgentStateController.java
@@ -201,10 +201,13 @@ public class WsAgentStateController implements ConnectionOpenedHandler, Connecti
* Try to connect via WebSocket connection
*/
private void checkWsConnection() {
+ if (messageBus != null) {
+ messageBus.cancelReconnection();
+ }
messageBus = messageBusProvider.createMachineMessageBus(wsUrl);
+
messageBus.addOnCloseHandler(this);
messageBus.addOnCloseHandler(this);
messageBus.addOnOpenHandler(this);
-
}
}
diff --git a/plugins/plugin-machine/che-plugin-machine-ext-client/src/main/java/org/eclipse/che/ide/extension/machine/client/MachineComponent.java b/plugins/plugin-machine/che-plugin-machine-ext-client/src/main/java/org/eclipse/che/ide/extension/machine/client/MachineComponent.java
index 24a4ad3d7b..574301b27c 100644
--- a/plugins/plugin-machine/che-plugin-machine-ext-client/src/main/java/org/eclipse/che/ide/extension/machine/client/MachineComponent.java
+++ b/plugins/plugin-machine/che-plugin-machine-ext-client/src/main/java/org/eclipse/che/ide/extension/machine/client/MachineComponent.java
@@ -62,9 +62,11 @@ public class MachineComponent implements WsAgentComponent {
if (isDev && status == RUNNING) {
callback.onSuccess(MachineComponent.this);
-
appContext.setDevMachineId(descriptor.getId());
- machineManager.onMachineRunning(descriptor.getId());
+
+ if (!machineManager.isDevMachineStatusTracked(descriptor)) {
+ machineManager.onMachineRunning(descriptor.getId());
+ }
break;
}
if (isDev && status == CREATING) {
diff --git a/plugins/plugin-machine/che-plugin-machine-ext-client/src/main/java/org/eclipse/che/ide/extension/machine/client/machine/MachineManagerImpl.java b/plugins/plugin-machine/che-plugin-machine-ext-client/src/main/java/org/eclipse/che/ide/extension/machine/client/machine/MachineManagerImpl.java
index 1ccd6727a0..776cdd0261 100644
--- a/plugins/plugin-machine/che-plugin-machine-ext-client/src/main/java/org/eclipse/che/ide/extension/machine/client/machine/MachineManagerImpl.java
+++ b/plugins/plugin-machine/che-plugin-machine-ext-client/src/main/java/org/eclipse/che/ide/extension/machine/client/machine/MachineManagerImpl.java
@@ -15,13 +15,12 @@ import com.google.inject.Singleton;
import com.google.web.bindery.event.shared.EventBus;
import org.eclipse.che.api.core.rest.shared.dto.LinkParameter;
-import org.eclipse.che.api.machine.gwt.client.WsAgentStateController;
import org.eclipse.che.api.machine.gwt.client.MachineManager;
import org.eclipse.che.api.machine.gwt.client.MachineServiceClient;
import org.eclipse.che.api.machine.gwt.client.OutputMessageUnmarshaller;
+import org.eclipse.che.api.machine.gwt.client.WsAgentStateController;
import org.eclipse.che.api.machine.gwt.client.events.DevMachineStateEvent;
import org.eclipse.che.api.machine.gwt.client.events.MachineStartingEvent;
-import org.eclipse.che.api.machine.shared.Constants;
import org.eclipse.che.api.machine.shared.dto.LimitsDto;
import org.eclipse.che.api.machine.shared.dto.MachineConfigDto;
import org.eclipse.che.api.machine.shared.dto.MachineDto;
@@ -53,6 +52,8 @@ import org.eclipse.che.ide.websocket.rest.Unmarshallable;
import static org.eclipse.che.api.machine.gwt.client.MachineManager.MachineOperationType.DESTROY;
import static org.eclipse.che.api.machine.gwt.client.MachineManager.MachineOperationType.RESTART;
import static org.eclipse.che.api.machine.gwt.client.MachineManager.MachineOperationType.START;
+import static org.eclipse.che.api.machine.shared.Constants.LINK_REL_GET_MACHINE_LOGS_CHANNEL;
+import static org.eclipse.che.api.machine.shared.Constants.LINK_REL_GET_MACHINE_STATUS_CHANNEL;
import static org.eclipse.che.ide.extension.machine.client.perspective.OperationsPerspective.OPERATIONS_PERSPECTIVE_ID;
import static org.eclipse.che.ide.ui.loaders.initialization.InitialLoadingInfo.Operations.MACHINE_BOOTING;
import static org.eclipse.che.ide.ui.loaders.initialization.OperationInfo.Status.ERROR;
@@ -252,7 +253,7 @@ public class MachineManagerImpl implements MachineManager, WorkspaceStoppedHandl
eventBus.fireEvent(new MachineStartingEvent(machineDto));
subscribeToChannel(machineDto.getConfig()
- .getLink(Constants.LINK_REL_GET_MACHINE_LOGS_CHANNEL)
+ .getLink(LINK_REL_GET_MACHINE_LOGS_CHANNEL)
.getParameter("channel")
.getDefaultValue(),
outputHandler);
@@ -286,6 +287,17 @@ public class MachineManagerImpl implements MachineManager, WorkspaceStoppedHandl
});
}
+ @Override
+ public boolean isDevMachineStatusTracked(MachineDto machine) {
+ final LinkParameter statusChannelLinkParameter = machine.getConfig().getLink(LINK_REL_GET_MACHINE_STATUS_CHANNEL).getParameter("channel");
+ if (statusChannelLinkParameter == null) {
+ return false;
+ }
+
+ String machineStatusChannel = statusChannelLinkParameter.getDefaultValue();
+ return machineStatusChannel != null && messageBus.isHandlerSubscribed(statusHandler, machineStatusChannel);
+ }
+
@Override
public Promise destroyMachine(final MachineDto machineState) {
return machineServiceClient.destroyMachine(machineState.getId()).then(new Operation() {
@@ -306,15 +318,13 @@ public class MachineManagerImpl implements MachineManager, WorkspaceStoppedHandl
perspectiveManager.setPerspectiveId(OPERATIONS_PERSPECTIVE_ID);
initialLoadingInfo.setOperationStatus(MACHINE_BOOTING.getValue(), IN_PROGRESS);
- if (machineConfig.getLink(Constants.LINK_REL_GET_MACHINE_LOGS_CHANNEL) != null &&
- machineConfig.getLink(Constants.LINK_REL_GET_MACHINE_STATUS_CHANNEL) != null) {
- final LinkParameter logsChannelLinkParameter = machineConfig.getLink(Constants.LINK_REL_GET_MACHINE_LOGS_CHANNEL)
- .getParameter("channel");
+ if (machineConfig.getLink(LINK_REL_GET_MACHINE_LOGS_CHANNEL) != null &&
+ machineConfig.getLink(LINK_REL_GET_MACHINE_STATUS_CHANNEL) != null) {
+ final LinkParameter logsChannelLinkParameter = machineConfig.getLink(LINK_REL_GET_MACHINE_LOGS_CHANNEL).getParameter("channel");
if (logsChannelLinkParameter != null) {
outputChannel = logsChannelLinkParameter.getDefaultValue();
}
- final LinkParameter statusChannelLinkParameter = machineConfig.getLink(Constants.LINK_REL_GET_MACHINE_STATUS_CHANNEL)
- .getParameter("channel");
+ final LinkParameter statusChannelLinkParameter = machineConfig.getLink(LINK_REL_GET_MACHINE_STATUS_CHANNEL).getParameter("channel");
if (statusChannelLinkParameter != null) {
statusChannel = statusChannelLinkParameter.getDefaultValue();
}