This article describes how to log Spring Session for VMware Tanzu GemFire session information by function execution service using gfsh.
import org.apache.geode.cache.Declarable; import org.apache.geode.cache.execute.Function; import org.apache.geode.cache.execute.FunctionContext; import org.apache.geode.cache.execute.RegionFunctionContext; import org.apache.geode.cache.partition.PartitionRegionHelper; import org.apache.geode.cache.Region; import java.util.*; import static org.springframework.session.data.gemfire.AbstractGemFireOperationsSessionRepository.GemFireSession; public class DumpSessionsFunction implements Function, Declarable { public void execute(FunctionContext context) { RegionFunctionContext rfc = (RegionFunctionContext) context; Region region = PartitionRegionHelper.getLocalDataForContext(rfc); String sessions = getSessions(region); context.getCache().getLogger().info(sessions); context.getResultSender().lastResult(true); } private String getSessions(Region region) { Set keySet = region.entrySet(); String header = "This member contains the following " + keySet.size() + " primary sessions: " + "\n"; StringBuffer str = new StringBuffer(); Iterator iterator = keySet.iterator(); while (iterator.hasNext()) { Region.Entry e = (Region.Entry) iterator.next(); str.append("Session Key: " + e.getKey() + "\n"); str.append("Session Value: "+ e.getValue() + "\n\n"); } return header + str.toString(); } public String getId() { return getClass().getSimpleName(); } public boolean optimizeForWrite() { return true; } public static int sizeObject(Object o) { return ReflectionObjectSizer.getInstance().sizeof(o); } }
user1$ javac DumpSessionsFunction.java user1$ jar cf DumpSessionsFunction.jar DumpSessionsFunction.class gfsh>deploy --jar=/Users/user1/DumpSessionsFunction/DumpSessionsFunction.jar Deploying files: DumpSessionsFunction.jar Total file size is: 0.00MB Continue? (Y/n): Y Member | Deployed JAR | Deployed JAR Location ------------ | ------------------------ | ----------------------------------------------------------------------------------- cacheserver1 | DumpSessionsFunction.jar | /Users/user1/cacheserver1/DumpSessionsFunction.v1.jar cacheserver2 | DumpSessionsFunction.jar | /Users/user1/cacheserver2/DumpSessionsFunction.v1.jar cacheserver3 | DumpSessionsFunction.jar | /Users/user1/cacheserver3/DumpSessionsFunction.v1.jar cacheserver4 | DumpSessionsFunction.jar | /Users/user1/cacheserver4/DumpSessionsFunction.v1.jar
execute function --id=DumpSessionsFunction --region=/SpringSessionRegionNameFor example:
gfsh>execute function --id=DumpSessionsFunction --region=/SpringSessionRegion1 Member | Status | Message ------------ | ------ | ------------------------ cacheserver1 | OK | [true, true, true, true]
gfsh>show log --member=cacheserver1 [info 2022/01/05 19:26:59.794 JST cacheserver1 <Function Execution Processor3> tid=0xac] This member contains the following 3 primary sessions: Session Key: 856c246c-c985-423c-8798-4c23408fdc2a Session Value: { @type = org.springframework.session.data.gemfire.AbstractGemFireOperationsSessionRepository$GemFireSession, id = 856c246c-c985-423c-8798-4c23408fdc2a, creationTime = 2022-01-05T10:26:46.592Z, lastAccessedTime = 2022-01-05T10:26:46.592Z, maxInactiveInterval = PT15M, principalName = null } Session Key: f42d3fc7-33eb-47d6-9dea-dd344dcb923d Session Value: { @type = org.springframework.session.data.gemfire.AbstractGemFireOperationsSessionRepository$GemFireSession, id = f42d3fc7-33eb-47d6-9dea-dd344dcb923d, creationTime = 2022-01-05T10:21:32.305Z, lastAccessedTime = 2022-01-05T10:21:32.305Z, maxInactiveInterval = PT15M, principalName = null } Session Key: 6ece35a5-32d1-4d9e-9a00-ac32d1e56fee Session Value: null