blob: 09ac218c7ecc98cc2145861864ad7e209e791994 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 flex.management.runtime.messaging.services.remoting;
import java.io.IOException;
import flex.management.BaseControl;
import flex.management.runtime.AdminConsoleTypes;
import flex.management.runtime.messaging.DestinationControl;
import flex.messaging.services.remoting.RemotingDestination;
/**
* The <code>RemotingDestinationControl</code> class is the MBean implementation for
* monitoring and managing a <code>RemotingDestination</code> at runtime.
*
* This class performs no internal synchronization, so the statistics it tracks may differ slightly from
* the true values but they don't warrant the cost full synchronization.
*/
public class RemotingDestinationControl extends DestinationControl implements
RemotingDestinationControlMBean
{
private static final String TYPE = "RemotingDestination";
/**
* Constructs a new <code>RemotingDestinationControl</code> instance.
*
* @param destination The <code>RemotingDestination</code> managed by this MBean.
* @param parent The parent MBean in the management hierarchy.
*/
public RemotingDestinationControl(RemotingDestination destination, BaseControl parent)
{
super(destination, parent);
}
private int invocationSuccessCount = 0;
private int invocationFaultCount = 0;
private int totalProcessingTimeMillis = 0;
private int averageProcessingTimeMillis = 0;
/** {@inheritDoc} */
@Override
public String getType()
{
return TYPE;
}
/** {@inheritDoc} */
public Integer getInvocationSuccessCount() throws IOException
{
return Integer.valueOf(invocationSuccessCount);
}
/**
* Increments the invocation success count by one.
*
* @param processingTimeMillis The processing duration of the invocation success.
*/
public void incrementInvocationSuccessCount(int processingTimeMillis)
{
try
{
invocationSuccessCount++;
totalProcessingTimeMillis += processingTimeMillis;
averageProcessingTimeMillis = totalProcessingTimeMillis / (invocationSuccessCount + invocationFaultCount);
}
catch (Exception needsReset)
{
reset();
}
}
/** {@inheritDoc} */
public Integer getInvocationFaultCount() throws IOException
{
return Integer.valueOf(invocationFaultCount);
}
/**
* Increments the invocation fault count by one.
*
* @param processingTimeMillis The processing duration of the invocation fault.
*/
public void incrementInvocationFaultCount(int processingTimeMillis)
{
try
{
invocationFaultCount++;
totalProcessingTimeMillis += processingTimeMillis;
averageProcessingTimeMillis = totalProcessingTimeMillis / (invocationSuccessCount + invocationFaultCount);
}
catch (Exception needsReset)
{
reset();
}
}
/** {@inheritDoc} */
public Integer getAverageInvocationProcessingTimeMillis() throws IOException
{
return Integer.valueOf(averageProcessingTimeMillis);
}
/**
* Callback used to register properties for display in the admin application.
*/
@Override
protected void onRegistrationComplete()
{
String name = this.getObjectName().getCanonicalName();
String[] pollablePerInterval = { "InvocationSuccessCount", "InvocationFaultCount",
"AverageInvocationProcessingTimeMillis" };
getRegistrar().registerObjects(
new int[] {AdminConsoleTypes.DESTINATION_POLLABLE, AdminConsoleTypes.GRAPH_BY_POLL_INTERVAL},
name, pollablePerInterval);
}
/**
* Helper method to reset state in the case of errors updating statistics.
*/
private void reset()
{
invocationSuccessCount = 0;
invocationFaultCount = 0;
totalProcessingTimeMillis = 0;
averageProcessingTimeMillis = 0;
}
}