@ -43,7 +43,9 @@ import org.thingsboard.server.common.transport.service.TransportActivityState;
import org.thingsboard.server.gen.transport.TransportProtos ;
import org.thingsboard.server.gen.transport.TransportProtos ;
import org.thingsboard.server.queue.util.TbTransportComponent ;
import org.thingsboard.server.queue.util.TbTransportComponent ;
import java.util.HashSet ;
import java.util.Map ;
import java.util.Map ;
import java.util.Set ;
import java.util.UUID ;
import java.util.UUID ;
import java.util.concurrent.ConcurrentHashMap ;
import java.util.concurrent.ConcurrentHashMap ;
import java.util.concurrent.ConcurrentMap ;
import java.util.concurrent.ConcurrentMap ;
@ -56,7 +58,7 @@ import static org.thingsboard.server.common.transport.service.DefaultTransportSe
@Component
@Component
@TbTransportComponent
@TbTransportComponent
@ConditionalOnProperty ( prefix = "transport.activity" , value = "reporting_strategy" , havingValue = "last" )
@ConditionalOnProperty ( prefix = "transport.activity" , value = "reporting_strategy" , havingValue = "last" )
public class LastOnly TransportActivityManager extends AbstractActivityManager < UUID , TransportActivityState > {
public class OnlyLastEvent TransportActivityManager extends AbstractActivityManager < UUID , TransportActivityState > {
private final ConcurrentMap < UUID , TransportActivityState > states = new ConcurrentHashMap < > ( ) ;
private final ConcurrentMap < UUID , TransportActivityState > states = new ConcurrentHashMap < > ( ) ;
@ -67,9 +69,9 @@ public class LastOnlyTransportActivityManager extends AbstractActivityManager<UU
private TransportService transportService ;
private TransportService transportService ;
@Override
@Override
protected void doOnActivity ( UUID activityKey , Supplier < TransportActivityState > newStateSupplier ) {
protected void doOnActivity ( UUID sessionId , Supplier < TransportActivityState > newStateSupplier ) {
long newLastRecordedTime = System . currentTimeMillis ( ) ;
long newLastRecordedTime = System . currentTimeMillis ( ) ;
states . compute ( activityKey , ( __ , activityState ) - > {
states . compute ( sessionId , ( __ , activityState ) - > {
if ( activityState = = null ) {
if ( activityState = = null ) {
activityState = newStateSupplier . get ( ) ;
activityState = newStateSupplier . get ( ) ;
}
}
@ -82,6 +84,7 @@ public class LastOnlyTransportActivityManager extends AbstractActivityManager<UU
@Override
@Override
protected void doOnReportingPeriodEnd ( ) {
protected void doOnReportingPeriodEnd ( ) {
Set < UUID > statesToRemove = new HashSet < > ( ) ;
for ( Map . Entry < UUID , TransportActivityState > entry : states . entrySet ( ) ) {
for ( Map . Entry < UUID , TransportActivityState > entry : states . entrySet ( ) ) {
var sessionId = entry . getKey ( ) ;
var sessionId = entry . getKey ( ) ;
var activityState = entry . getValue ( ) ;
var activityState = entry . getValue ( ) ;
@ -90,8 +93,8 @@ public class LastOnlyTransportActivityManager extends AbstractActivityManager<UU
if ( sessionMetaData ! = null ) {
if ( sessionMetaData ! = null ) {
activityState . setSessionInfoProto ( sessionMetaData . getSessionInfo ( ) ) ;
activityState . setSessionInfoProto ( sessionMetaData . getSessionInfo ( ) ) ;
} else {
} else {
log . debug ( "[{}] Session with id: [{}] is not present. Removing it's activity state ." , name , sessionId ) ;
log . debug ( "[{}] Session with id: [{}] is not present. Marking it's activity state for removal ." , name , sessionId ) ;
states . remove ( sessionId ) ;
statesToRemove . add ( sessionId ) ;
}
}
long lastActivityTime = activityState . getLastRecordedTime ( ) ;
long lastActivityTime = activityState . getLastRecordedTime ( ) ;
@ -112,9 +115,9 @@ public class LastOnlyTransportActivityManager extends AbstractActivityManager<UU
long expirationTime = System . currentTimeMillis ( ) - sessionInactivityTimeout ;
long expirationTime = System . currentTimeMillis ( ) - sessionInactivityTimeout ;
boolean hasExpired = sessionMetaData ! = null & & lastActivityTime < expirationTime ;
boolean hasExpired = sessionMetaData ! = null & & lastActivityTime < expirationTime ;
if ( hasExpired ) {
if ( hasExpired ) {
log . debug ( "[{}] Session with id: [{}] has expired due to last activity time: [{}]. Removing it's activity state." , name , sessionId , lastActivityTime ) ;
log . debug ( "[{}] Session with id: [{}] has expired due to last activity time: [{}]. Marking it's activity state for removal." , name , sessionId , lastActivityTime ) ;
states . remove ( sessionId ) ;
transportService . deregisterSession ( sessionInfo ) ;
transportService . deregisterSession ( sessionInfo ) ;
statesToRemove . add ( sessionId ) ;
transportService . process ( sessionInfo , SESSION_EVENT_MSG_CLOSED , null ) ;
transportService . process ( sessionInfo , SESSION_EVENT_MSG_CLOSED , null ) ;
sessionMetaData . getListener ( ) . onRemoteSessionCloseCommand ( sessionId , SESSION_EXPIRED_NOTIFICATION_PROTO ) ;
sessionMetaData . getListener ( ) . onRemoteSessionCloseCommand ( sessionId , SESSION_EXPIRED_NOTIFICATION_PROTO ) ;
}
}
@ -133,6 +136,7 @@ public class LastOnlyTransportActivityManager extends AbstractActivityManager<UU
} ) ;
} ) ;
}
}
}
}
statesToRemove . forEach ( states : : remove ) ;
}
}
private void updateLastReportedTime ( UUID key , long newLastReportedTime ) {
private void updateLastReportedTime ( UUID key , long newLastReportedTime ) {