/* * Copyright 2014, The Sporting Exchange Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.betfair.cougar.transport.jms.monitoring; import com.betfair.tornjak.monitor.OnDemandMonitor; import com.betfair.tornjak.monitor.Status; import org.springframework.jmx.export.annotation.ManagedAttribute; import org.springframework.jmx.export.annotation.ManagedResource; /** * */ @ManagedResource public class TopicSubscriberPingMonitor extends OnDemandMonitor { private final String transportIdentifier; private final String destinationName; private final String subscriptionId; private final long pingWarningTimeout; private final long pingFailureTimeout; private volatile long lastPingReceivedTime; private volatile long lastPingTransmissionTime; private volatile long totalPingTransmissionTime; private volatile long pingReceivedCount; public TopicSubscriberPingMonitor(String transportIdentifier, String destinationName, String subscriptionId, long pingWarningTimeout, long pingFailureTimeout, Status maxStatus) { this.transportIdentifier = transportIdentifier; this.destinationName = destinationName; this.subscriptionId = subscriptionId; if (pingFailureTimeout < pingWarningTimeout) { throw new IllegalArgumentException("pingFailureTimeout cannot be less than pingWarningTimeout"); } this.pingWarningTimeout = pingWarningTimeout; this.pingFailureTimeout = pingFailureTimeout; setMaxImpactToOverallStatus(maxStatus); } @Override @ManagedAttribute public String getName() { String ret = "TopicSubscriberPingMonitor-"; if (transportIdentifier != null) { ret += transportIdentifier+"-"; } ret+=destinationName; if (subscriptionId != null) { ret += "["+subscriptionId+"]"; } return ret; } public synchronized void pingReceived(PingEvent ping) { long now = System.currentTimeMillis(); lastPingReceivedTime = now; long transmissionDuration = now - ping.getEmissionTime(); lastPingTransmissionTime = transmissionDuration; totalPingTransmissionTime += transmissionDuration; pingReceivedCount ++; } @Override protected synchronized Status checkStatus() { long timeSinceLastPing = System.currentTimeMillis() - lastPingReceivedTime; if (timeSinceLastPing > pingFailureTimeout) { return Status.FAIL; } if (timeSinceLastPing > pingWarningTimeout) { return Status.WARN; } return Status.OK; } @ManagedAttribute public String getStatusAsString() { return checkStatus().toString(); } @ManagedAttribute public String getDestinationName() { return destinationName; } @ManagedAttribute public String getSubscriptionId() { return subscriptionId; } @ManagedAttribute public long getPingWarningTimeout() { return pingWarningTimeout; } @ManagedAttribute public long getPingFailureTimeout() { return pingFailureTimeout; } @ManagedAttribute public long getLastPingReceivedTime() { return lastPingReceivedTime; } @ManagedAttribute public long getLastPingTransmissionTime() { return lastPingTransmissionTime; } @ManagedAttribute public long getTotalPingTransmissionTime() { return totalPingTransmissionTime; } @ManagedAttribute public long getPingReceivedCount() { return pingReceivedCount; } }