diff --git a/activemq-broker/src/main/java/org/apache/activemq/broker/Connection.java b/activemq-broker/src/main/java/org/apache/activemq/broker/Connection.java index 8548a95a49..26b1a5b18d 100644 --- a/activemq-broker/src/main/java/org/apache/activemq/broker/Connection.java +++ b/activemq-broker/src/main/java/org/apache/activemq/broker/Connection.java @@ -121,7 +121,6 @@ public interface Connection extends Service { void updateClient(ConnectionControl control); - /** * Returns the number of active transactions established on this Connection. * @@ -136,4 +135,10 @@ public interface Connection extends Service { */ public Long getOldestActiveTransactionDuration(); + /** + * Returns the time in ms since epoch when connection was established. + * + * @return time in ms since epoch when connection was established. + */ + public Long getConnectedTimestamp(); } diff --git a/activemq-broker/src/main/java/org/apache/activemq/broker/TransportConnection.java b/activemq-broker/src/main/java/org/apache/activemq/broker/TransportConnection.java index 7533a714ed..443e368174 100644 --- a/activemq-broker/src/main/java/org/apache/activemq/broker/TransportConnection.java +++ b/activemq-broker/src/main/java/org/apache/activemq/broker/TransportConnection.java @@ -163,6 +163,7 @@ public class TransportConnection implements Connection, Task, CommandVisitor { private TransportConnectionStateRegister connectionStateRegister = new SingleTransportConnectionStateRegister(); private final ReentrantReadWriteLock serviceLock = new ReentrantReadWriteLock(); private String duplexNetworkConnectorId; + private final long connectedTimestamp; /** * @param taskRunnerFactory - can be null if you want direct dispatch to the transport @@ -220,6 +221,7 @@ public class TransportConnection implements Connection, Task, CommandVisitor { } }); connected = true; + connectedTimestamp = System.currentTimeMillis(); } /** @@ -1726,4 +1728,9 @@ public class TransportConnection implements Connection, Task, CommandVisitor { public Response processBrokerSubscriptionInfo(BrokerSubscriptionInfo info) throws Exception { return null; } + + @Override + public Long getConnectedTimestamp() { + return this.connectedTimestamp; + } } diff --git a/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/ConnectionView.java b/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/ConnectionView.java index 937b4c079c..48beb6ce53 100644 --- a/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/ConnectionView.java +++ b/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/ConnectionView.java @@ -191,4 +191,9 @@ public class ConnectionView implements ConnectionViewMBean { public boolean isNetworkConnection() { return connection.isNetworkConnection(); } + + @Override + public long getConnectedTimestamp() { + return connection.getConnectedTimestamp(); + } } diff --git a/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/ConnectionViewMBean.java b/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/ConnectionViewMBean.java index a0e399a13f..1013a8e8ba 100644 --- a/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/ConnectionViewMBean.java +++ b/activemq-broker/src/main/java/org/apache/activemq/broker/jmx/ConnectionViewMBean.java @@ -133,4 +133,10 @@ public interface ConnectionViewMBean extends Service { */ @MBeanInfo("Connection is a network connection.") boolean isNetworkConnection(); + + /** + * @return the time in ms since epoch when connection was established + */ + @MBeanInfo("Time in ms since epoch when connection was established.") + long getConnectedTimestamp(); } diff --git a/activemq-broker/src/main/java/org/apache/activemq/broker/scheduler/SchedulerBroker.java b/activemq-broker/src/main/java/org/apache/activemq/broker/scheduler/SchedulerBroker.java index 1355a88230..c86a3a104f 100644 --- a/activemq-broker/src/main/java/org/apache/activemq/broker/scheduler/SchedulerBroker.java +++ b/activemq-broker/src/main/java/org/apache/activemq/broker/scheduler/SchedulerBroker.java @@ -81,6 +81,9 @@ public class SchedulerBroker extends BrokerFilter implements JobListener { this.context.setSecurityContext(SecurityContext.BROKER_SECURITY_CONTEXT); // we only get response on unexpected error this.context.setConnection(new Connection() { + + private final long connectedTimestamp = System.currentTimeMillis(); + @Override public Connector getConnector() { return null; @@ -183,6 +186,12 @@ public class SchedulerBroker extends BrokerFilter implements JobListener { return null; } + + @Override + public Long getConnectedTimestamp() { + return connectedTimestamp; + } + @Override public void start() throws Exception {} diff --git a/activemq-shiro/src/test/java/org/apache/activemq/shiro/authc/DefaultAuthenticationPolicyTest.java b/activemq-shiro/src/test/java/org/apache/activemq/shiro/authc/DefaultAuthenticationPolicyTest.java index 0d390619df..a3060a935a 100644 --- a/activemq-shiro/src/test/java/org/apache/activemq/shiro/authc/DefaultAuthenticationPolicyTest.java +++ b/activemq-shiro/src/test/java/org/apache/activemq/shiro/authc/DefaultAuthenticationPolicyTest.java @@ -218,6 +218,9 @@ public class DefaultAuthenticationPolicyTest { ConnectionContext ctx = new ConnectionContext(); Connection connection = new Connection() { + + private final long connectedTimestamp = System.currentTimeMillis(); + @Override public Connector getConnector() { return null; //To change body of implemented methods use File | Settings | File Templates. @@ -327,6 +330,12 @@ public class DefaultAuthenticationPolicyTest { public Long getOldestActiveTransactionDuration() { return null; //To change body of implemented methods use File | Settings | File Templates. } + + @Override + public Long getConnectedTimestamp() { + return connectedTimestamp; + } + }; ctx.setConnection(connection); diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/broker/region/QueueOptimizedDispatchExceptionTest.java b/activemq-unit-tests/src/test/java/org/apache/activemq/broker/region/QueueOptimizedDispatchExceptionTest.java index b46169e194..1e86ca6298 100644 --- a/activemq-unit-tests/src/test/java/org/apache/activemq/broker/region/QueueOptimizedDispatchExceptionTest.java +++ b/activemq-unit-tests/src/test/java/org/apache/activemq/broker/region/QueueOptimizedDispatchExceptionTest.java @@ -104,6 +104,8 @@ public class QueueOptimizedDispatchExceptionTest { final ConnectionContext contextNotInTx = new ConnectionContext(); contextNotInTx.setConnection(new Connection() { + private final long connectedTimestamp = System.currentTimeMillis(); + @Override public void stop() throws Exception { } @@ -207,6 +209,11 @@ public class QueueOptimizedDispatchExceptionTest { public Long getOldestActiveTransactionDuration() { return null; } + + @Override + public Long getConnectedTimestamp() { + return connectedTimestamp; + } }); final DestinationStatistics destinationStatistics = new DestinationStatistics();