This is an automated email from the ASF dual-hosted git repository. ningjiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/servicecomb-pack.git
commit 70e968301883c1fe9096555fcc45f689cb7fa962 Author: Lei Zhang <[email protected]> AuthorDate: Fri Aug 9 14:05:34 2019 +0800 SCB-1411 Transaction object adds suspended type attribute --- .../pack/alpha/core/fsm/SuspendedType.java | 5 +++++ .../pack/alpha/core/fsm/event/TxAbortedEvent.java | 6 ++++++ .../alpha/core/fsm/event/TxCompensatedEvent.java | 6 ++++++ .../pack/alpha/core/fsm/event/TxStartedEvent.java | 6 ++++++ .../fsm/repository/model/GlobalTransaction.java | 13 +++++++++++ .../servicecomb/pack/alpha/fsm/SagaActor.java | 24 +++++++++++++-------- .../pack/alpha/fsm/domain/SagaEndedDomain.java | 17 ++++++++++++++- .../servicecomb/pack/alpha/fsm/model/SagaData.java | 25 ++++++++++++++++++++++ .../spring/integration/akka/SagaDataExtension.java | 1 + .../alpha/server/fsm/GrpcSagaEventService.java | 8 ++++++- .../alpha/ui/controller/TransactionController.java | 4 ++++ .../resources/templates/transaction_details.html | 10 ++++++++- 12 files changed, 113 insertions(+), 12 deletions(-) diff --git a/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/fsm/SuspendedType.java b/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/fsm/SuspendedType.java new file mode 100644 index 0000000..82ceffa --- /dev/null +++ b/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/fsm/SuspendedType.java @@ -0,0 +1,5 @@ +package org.apache.servicecomb.pack.alpha.core.fsm; + +public enum SuspendedType { + NULL, TIMEOUT, UNPREDICTABLE +} diff --git a/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/fsm/event/TxAbortedEvent.java b/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/fsm/event/TxAbortedEvent.java index b3f8406..3b50a3b 100644 --- a/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/fsm/event/TxAbortedEvent.java +++ b/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/fsm/event/TxAbortedEvent.java @@ -17,6 +17,7 @@ package org.apache.servicecomb.pack.alpha.core.fsm.event; +import java.util.Date; import org.apache.servicecomb.pack.alpha.core.fsm.event.base.TxEvent; public class TxAbortedEvent extends TxEvent { @@ -73,6 +74,11 @@ public class TxAbortedEvent extends TxEvent { return this; } + public Builder createTime(Date createTime){ + txAbortedEvent.setCreateTime(createTime); + return this; + } + public TxAbortedEvent build() { return txAbortedEvent; } diff --git a/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/fsm/event/TxCompensatedEvent.java b/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/fsm/event/TxCompensatedEvent.java index 127c70d..4b7297a 100644 --- a/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/fsm/event/TxCompensatedEvent.java +++ b/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/fsm/event/TxCompensatedEvent.java @@ -17,6 +17,7 @@ package org.apache.servicecomb.pack.alpha.core.fsm.event; +import java.util.Date; import org.apache.servicecomb.pack.alpha.core.fsm.event.base.TxEvent; public class TxCompensatedEvent extends TxEvent { @@ -58,6 +59,11 @@ public class TxCompensatedEvent extends TxEvent { return this; } + public Builder createTime(Date createTime){ + txCompensatedEvent.setCreateTime(createTime); + return this; + } + public TxCompensatedEvent build() { return txCompensatedEvent; } diff --git a/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/fsm/event/TxStartedEvent.java b/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/fsm/event/TxStartedEvent.java index 9b1e540..4b6a64b 100644 --- a/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/fsm/event/TxStartedEvent.java +++ b/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/fsm/event/TxStartedEvent.java @@ -17,6 +17,7 @@ package org.apache.servicecomb.pack.alpha.core.fsm.event; +import java.util.Date; import org.apache.servicecomb.pack.alpha.core.fsm.event.base.TxEvent; public class TxStartedEvent extends TxEvent { @@ -114,6 +115,11 @@ public class TxStartedEvent extends TxEvent { return this; } + public Builder createTime(Date createTime){ + txStartedEvent.setCreateTime(createTime); + return this; + } + public TxStartedEvent build() { return txStartedEvent; } diff --git a/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/fsm/repository/model/GlobalTransaction.java b/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/fsm/repository/model/GlobalTransaction.java index f4548bd..01d8956 100644 --- a/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/fsm/repository/model/GlobalTransaction.java +++ b/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/fsm/repository/model/GlobalTransaction.java @@ -23,6 +23,7 @@ import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.Map; +import org.apache.servicecomb.pack.alpha.core.fsm.SuspendedType; import org.apache.servicecomb.pack.alpha.core.fsm.TransactionType; import org.apache.servicecomb.pack.alpha.core.fsm.event.base.BaseEvent; @@ -40,6 +41,7 @@ public class GlobalTransaction { private Long durationTime; private List<SagaSubTransaction> subTransactions = new ArrayList<>(); private List<Map<String,Object>> events = new LinkedList<>(); + private SuspendedType suspendedType; public String getGlobalTxId() { return globalTxId; @@ -85,6 +87,10 @@ public class GlobalTransaction { return events; } + public SuspendedType getSuspendedType() { + return suspendedType; + } + public static Builder builder() { return new Builder(); } @@ -101,6 +107,7 @@ public class GlobalTransaction { private Integer subTxSize; private List<SagaSubTransaction> subTransactions; private List<BaseEvent> events; + private SuspendedType suspendedType; private Builder() { } @@ -155,6 +162,11 @@ public class GlobalTransaction { return this; } + public Builder suspendedType(SuspendedType suspendedType) { + this.suspendedType = suspendedType; + return this; + } + public GlobalTransaction build() { GlobalTransaction globalTransaction = new GlobalTransaction(); globalTransaction.instanceId = this.instanceId; @@ -167,6 +179,7 @@ public class GlobalTransaction { globalTransaction.subTxSize = this.subTxSize; globalTransaction.durationTime = this.endTime.getTime() - this.beginTime.getTime(); globalTransaction.subTransactions = this.subTransactions; + globalTransaction.suspendedType = this.suspendedType; for(BaseEvent event : events){ try { globalTransaction.events.add(event.toMap()); diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaActor.java b/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaActor.java index 2734deb..fc06255 100644 --- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaActor.java +++ b/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaActor.java @@ -25,6 +25,7 @@ import java.util.Collections; import java.util.Date; import java.util.concurrent.TimeUnit; import org.apache.servicecomb.pack.alpha.core.AlphaException; +import org.apache.servicecomb.pack.alpha.core.fsm.SuspendedType; import org.apache.servicecomb.pack.alpha.core.fsm.TxState; import org.apache.servicecomb.pack.alpha.fsm.domain.AddTxEventDomain; import org.apache.servicecomb.pack.alpha.fsm.domain.DomainEvent; @@ -75,6 +76,7 @@ public class SagaActor extends SagaDataExtension.SAGA_DATA_EXTENSION_PROVIDER.get(context().system()).doSagaBeginCounter(); SagaStartedDomain domainEvent = new SagaStartedDomain(event); if (event.getTimeout() > 0) { + data.setTimeout(event.getTimeout()); return goTo(SagaActorState.READY) .applying(domainEvent) .forMax(Duration.create(event.getTimeout(), TimeUnit.SECONDS)); @@ -102,19 +104,19 @@ public class SagaActor extends } ).event(SagaEndedEvent.class, (event, data) -> { - SagaEndedDomain domainEvent = new SagaEndedDomain(event, SagaActorState.SUSPENDED); + SagaEndedDomain domainEvent = new SagaEndedDomain(event, SagaActorState.SUSPENDED, SuspendedType.UNPREDICTABLE); return goTo(SagaActorState.SUSPENDED) .applying(domainEvent); } ).event(SagaAbortedEvent.class, (event, data) -> { - SagaEndedDomain domainEvent = new SagaEndedDomain(event, SagaActorState.SUSPENDED); + SagaEndedDomain domainEvent = new SagaEndedDomain(event, SagaActorState.SUSPENDED, SuspendedType.UNPREDICTABLE); return goTo(SagaActorState.SUSPENDED) .applying(domainEvent); } ).event(Collections.singletonList(StateTimeout()), SagaData.class, (event, data) -> { - SagaEndedDomain domainEvent = new SagaEndedDomain(null, SagaActorState.SUSPENDED); + SagaEndedDomain domainEvent = new SagaEndedDomain(null, SagaActorState.SUSPENDED, SuspendedType.TIMEOUT); return goTo(SagaActorState.SUSPENDED) .applying(domainEvent); }) @@ -146,7 +148,8 @@ public class SagaActor extends } ).event(SagaTimeoutEvent.class, (event, data) -> { - SagaEndedDomain domainEvent = new SagaEndedDomain(event, SagaActorState.SUSPENDED); + SagaEndedDomain domainEvent = new SagaEndedDomain(event, SagaActorState.SUSPENDED, + SuspendedType.TIMEOUT); return goTo(SagaActorState.SUSPENDED) .applying(domainEvent); } @@ -158,7 +161,8 @@ public class SagaActor extends } ).event(Collections.singletonList(StateTimeout()), SagaData.class, (event, data) -> { - return goTo(SagaActorState.SUSPENDED); + SagaEndedDomain domainEvent = new SagaEndedDomain(null, SagaActorState.SUSPENDED, SuspendedType.TIMEOUT); + return goTo(SagaActorState.SUSPENDED).applying(domainEvent); }) ); @@ -188,7 +192,7 @@ public class SagaActor extends } ).event(SagaTimeoutEvent.class, (event, data) -> { - SagaEndedDomain domainEvent = new SagaEndedDomain(event, SagaActorState.SUSPENDED); + SagaEndedDomain domainEvent = new SagaEndedDomain(event, SagaActorState.SUSPENDED, SuspendedType.TIMEOUT); return goTo(SagaActorState.SUSPENDED) .applying(domainEvent); } @@ -210,14 +214,15 @@ public class SagaActor extends } ).event(Collections.singletonList(StateTimeout()), SagaData.class, (event, data) -> { - return goTo(SagaActorState.SUSPENDED); + SagaEndedDomain domainEvent = new SagaEndedDomain(null, SagaActorState.SUSPENDED, SuspendedType.TIMEOUT); + return goTo(SagaActorState.SUSPENDED).applying(domainEvent); }) ); when(SagaActorState.FAILED, matchEvent(SagaTimeoutEvent.class, SagaData.class, (event, data) -> { - SagaEndedDomain domainEvent = new SagaEndedDomain(event, SagaActorState.SUSPENDED); + SagaEndedDomain domainEvent = new SagaEndedDomain(event, SagaActorState.SUSPENDED, SuspendedType.TIMEOUT); return goTo(SagaActorState.SUSPENDED) .applying(domainEvent); } @@ -273,7 +278,7 @@ public class SagaActor extends } ).event(Arrays.asList(StateTimeout()), SagaData.class, (event, data) -> { - SagaEndedDomain domainEvent = new SagaEndedDomain(SagaActorState.SUSPENDED); + SagaEndedDomain domainEvent = new SagaEndedDomain(SagaActorState.SUSPENDED, SuspendedType.TIMEOUT); return goTo(SagaActorState.SUSPENDED) .applying(domainEvent); }) @@ -438,6 +443,7 @@ public class SagaActor extends } else if (domainEvent.getState() == SagaActorState.SUSPENDED) { data.setEndTime(new Date()); data.setTerminated(true); + data.setSuspendedType(domainEvent.getSuspendedType()); } else if (domainEvent.getState() == SagaActorState.COMPENSATED) { data.setEndTime(new Date()); data.setTerminated(true); diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/SagaEndedDomain.java b/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/SagaEndedDomain.java index 778feca..8da396b 100644 --- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/SagaEndedDomain.java +++ b/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/SagaEndedDomain.java @@ -17,6 +17,7 @@ package org.apache.servicecomb.pack.alpha.fsm.domain; +import org.apache.servicecomb.pack.alpha.core.fsm.SuspendedType; import org.apache.servicecomb.pack.alpha.fsm.SagaActorState; import org.apache.servicecomb.pack.alpha.core.fsm.event.base.BaseEvent; @@ -24,16 +25,26 @@ public class SagaEndedDomain implements DomainEvent { private SagaActorState state; private BaseEvent event; + private SuspendedType suspendedType; + + public SagaEndedDomain(BaseEvent event, SagaActorState state, SuspendedType suspendedType) { + if(event != null){ + this.event = event; + } + this.state = state; + this.suspendedType = suspendedType; + } public SagaEndedDomain(BaseEvent event, SagaActorState state) { if(event != null){ this.event = event; } this.state = state; + this.suspendedType = SuspendedType.NULL; } - public SagaEndedDomain(SagaActorState state) { + public SagaEndedDomain(SagaActorState state, SuspendedType suspendedType) { this.state = state; } @@ -45,4 +56,8 @@ public class SagaEndedDomain implements DomainEvent { public BaseEvent getEvent() { return event; } + + public SuspendedType getSuspendedType() { + return suspendedType; + } } diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/SagaData.java b/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/SagaData.java index 5b214f2..e3974b9 100644 --- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/SagaData.java +++ b/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/SagaData.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; +import org.apache.servicecomb.pack.alpha.core.fsm.SuspendedType; import org.apache.servicecomb.pack.alpha.fsm.SagaActorState; import org.apache.servicecomb.pack.alpha.core.fsm.event.base.BaseEvent; @@ -34,6 +35,8 @@ public class SagaData implements Serializable { private Date endTime; private String globalTxId; private Date expirationTime; + private int timeout; + private SuspendedType suspendedType = SuspendedType.NULL; private boolean terminated; private SagaActorState lastState; private AtomicLong compensationRunningCounter = new AtomicLong(); @@ -88,6 +91,18 @@ public class SagaData implements Serializable { this.expirationTime = expirationTime; } + public void setTimeout(int timeout) { + this.timeout = timeout; + } + + public SuspendedType getSuspendedType() { + return suspendedType; + } + + public void setSuspendedType(SuspendedType suspendedType) { + this.suspendedType = suspendedType; + } + public boolean isTerminated() { return terminated; } @@ -166,6 +181,11 @@ public class SagaData implements Serializable { return this; } + public Builder timeout(int timeout) { + sagaData.setTimeout(timeout); + return this; + } + public Builder terminated(boolean terminated) { sagaData.setTerminated(terminated); return this; @@ -191,6 +211,11 @@ public class SagaData implements Serializable { return this; } + public Builder suspendedType(SuspendedType suspendedType) { + sagaData.setSuspendedType(suspendedType); + return this; + } + public SagaData build() { return sagaData; } diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SagaDataExtension.java b/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SagaDataExtension.java index 0451a83..f8b50c7 100644 --- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SagaDataExtension.java +++ b/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SagaDataExtension.java @@ -86,6 +86,7 @@ public class SagaDataExtension extends AbstractExtensionId<SagaDataExt> { .subTxSize(sagaData.getTxEntityMap().size()) .subTransactions(subTransactions) .events(sagaData.getEvents()) + .suspendedType(sagaData.getSuspendedType()) .build(); repositoryChannel.send(record); sagaDataMap.remove(globalTxId); diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/GrpcSagaEventService.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/GrpcSagaEventService.java index 9c4dac0..cedfc30 100644 --- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/GrpcSagaEventService.java +++ b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/GrpcSagaEventService.java @@ -88,22 +88,26 @@ public class GrpcSagaEventService extends TxEventServiceImplBase { .serviceName(message.getServiceName()) .instanceId(message.getInstanceId()) .globalTxId(message.getGlobalTxId()) + .createTime(new Date()) .timeout(message.getTimeout()).build(); } else if (message.getType().equals(EventType.SagaEndedEvent.name())) { event = org.apache.servicecomb.pack.alpha.core.fsm.event.SagaEndedEvent.builder() .serviceName(message.getServiceName()) .instanceId(message.getInstanceId()) + .createTime(new Date()) .globalTxId(message.getGlobalTxId()).build(); } else if (message.getType().equals(EventType.SagaAbortedEvent.name())) { event = org.apache.servicecomb.pack.alpha.core.fsm.event.SagaAbortedEvent.builder() .serviceName(message.getServiceName()) .instanceId(message.getInstanceId()) .globalTxId(message.getGlobalTxId()) + .createTime(new Date()) .payloads(message.getPayloads().toByteArray()).build(); } else if (message.getType().equals(EventType.SagaTimeoutEvent.name())) { event = org.apache.servicecomb.pack.alpha.core.fsm.event.SagaTimeoutEvent.builder() .serviceName(message.getServiceName()) .instanceId(message.getInstanceId()) + .createTime(new Date()) .globalTxId(message.getGlobalTxId()).build(); } else if (message.getType().equals(EventType.TxStartedEvent.name())) { event = org.apache.servicecomb.pack.alpha.core.fsm.event.TxStartedEvent.builder() @@ -115,6 +119,7 @@ public class GrpcSagaEventService extends TxEventServiceImplBase { .compensationMethod(message.getCompensationMethod()) .retryMethod(message.getRetryMethod()) .retries(message.getRetries()) + .createTime(new Date()) .payloads(message.getPayloads().toByteArray()).build(); } else if (message.getType().equals(EventType.TxEndedEvent.name())) { event = org.apache.servicecomb.pack.alpha.core.fsm.event.TxEndedEvent.builder() @@ -130,6 +135,7 @@ public class GrpcSagaEventService extends TxEventServiceImplBase { .globalTxId(message.getGlobalTxId()) .parentTxId(message.getParentTxId()) .localTxId(message.getLocalTxId()) + .createTime(new Date()) .payloads(message.getPayloads().toByteArray()).build(); } else if (message.getType().equals(EventType.TxCompensatedEvent.name())) { event = org.apache.servicecomb.pack.alpha.core.fsm.event.TxCompensatedEvent.builder() @@ -137,12 +143,12 @@ public class GrpcSagaEventService extends TxEventServiceImplBase { .instanceId(message.getInstanceId()) .globalTxId(message.getGlobalTxId()) .parentTxId(message.getParentTxId()) + .createTime(new Date()) .localTxId(message.getLocalTxId()).build(); } else { ok = false; } if (event != null) { - event.setCreateTime(new Date()); actorEventChannel.send(event); } responseObserver.onNext(ok ? ALLOW : REJECT); diff --git a/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/controller/TransactionController.java b/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/controller/TransactionController.java index 5772103..9d21367 100644 --- a/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/controller/TransactionController.java +++ b/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/controller/TransactionController.java @@ -150,6 +150,7 @@ public class TransactionController { .type(event.get("type").toString()) .serviceName(event.get("serviceName").toString()) .instanceId(event.get("instanceId").toString()) + .timeout(event.get("timeout") != null ? Integer.valueOf(event.get("timeout").toString()) : 0) .globalTxId(event.get("globalTxId").toString()) .parentTxId(event.get("parentTxId") != null ? event.get("parentTxId").toString() : null) .localTxId(event.get("localTxId") != null ? event.get("localTxId").toString() : null) @@ -193,6 +194,9 @@ public class TransactionController { }); map.put("events", events); map.put("globalTxId", globalTransaction.getGlobalTxId()); + map.put("state", globalTransaction.getState()); + map.put("endTime", globalTransaction.getEndTime()); + map.put("suspendedType", globalTransaction.getSuspendedType()); map.put("subTransactions", subTransactions); return "transaction_details"; } diff --git a/alpha/alpha-ui/src/main/resources/templates/transaction_details.html b/alpha/alpha-ui/src/main/resources/templates/transaction_details.html index 697febc..e279fc2 100644 --- a/alpha/alpha-ui/src/main/resources/templates/transaction_details.html +++ b/alpha/alpha-ui/src/main/resources/templates/transaction_details.html @@ -41,7 +41,7 @@ </div> <div class="col-xl-6 col-lg-6"> <div><i class="fas fa-calendar"></i> <span class="small" th:text="${event.createTime}"></span></div> - <div><i class="fas fa-clock"></i> <span class="small" th:text="${event.timeout}+' ms'"></span></div> + <div th:if="${event.type}==SagaStartedEvent"><i class="fas fa-clock"></i> <span class="small" th:text="${event.timeout}+' ms'"></span></div> <div th:if="${event.type}==TxStartedEvent"><i class="fas fa-undo"></i> <span class="small" th:text="${event.retries}"></span></div> <div th:if="${event.type}==TxStartedEvent or ${event.type}==TxAbortedEvent or ${event.type}=='SagaAbortedEvent'" class="position-absolute" style="bottom: 0px; right: 15px;"> <i name="event_more" class="fas fa-caret-square-down" style="cursor:pointer" th:target="'div-more-'+${stat.index}"></i> @@ -70,6 +70,14 @@ </div> <hr th:if="${!stat.last}"/> </div> + <div class="events"> + <hr/> + <div th:if="${state}=='SUSPENDED'" class="row text-danger"> + <div class="col-xl-12 col-lg-12"> + <div><span class="small" th:text="'Suspended Type: ' + ${suspendedType} + ' - ' + ${endTime}"></span></div> + </div> + </div> + </div> </div> </div> </div>
