194 lines
6.0 KiB
Java
194 lines
6.0 KiB
Java
/*
|
|
* Copyright 2015-present the original author or authors.
|
|
*
|
|
* 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
|
|
*
|
|
* https://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 sample.server;
|
|
|
|
import java.io.BufferedWriter;
|
|
import java.io.File;
|
|
import java.io.FileWriter;
|
|
import java.io.IOException;
|
|
import java.io.PrintWriter;
|
|
import java.util.Properties;
|
|
|
|
import org.apache.geode.cache.Cache;
|
|
import org.apache.geode.cache.CacheFactory;
|
|
import org.apache.geode.cache.ExpirationAction;
|
|
import org.apache.geode.cache.ExpirationAttributes;
|
|
import org.apache.geode.cache.Region;
|
|
import org.apache.geode.cache.RegionFactory;
|
|
import org.apache.geode.cache.RegionShortcut;
|
|
import org.apache.geode.cache.server.CacheServer;
|
|
|
|
import org.springframework.session.data.gemfire.AbstractGemFireOperationsSessionRepository;
|
|
import org.springframework.session.data.gemfire.config.annotation.web.http.GemFireHttpSessionConfiguration;
|
|
import org.springframework.util.StringUtils;
|
|
|
|
/**
|
|
* The {@link NativeGemFireServer} class uses the Pivotal GemFire API to create a Pivotal GemFire (cache) instance.
|
|
*
|
|
* @author John Blum
|
|
* @see org.apache.geode.cache.Cache
|
|
* @see org.apache.geode.cache.Region
|
|
* @see org.apache.geode.cache.server.CacheServer
|
|
* @see org.springframework.session.data.gemfire.config.annotation.web.http.GemFireHttpSessionConfiguration
|
|
* @since 1.3.0
|
|
*/
|
|
@SuppressWarnings("unused")
|
|
public final class NativeGemFireServer implements Runnable {
|
|
|
|
private static final int GEMFIRE_CACHE_SERVER_PORT =
|
|
Integer.getInteger("spring-session-data-gemfire.cache.server.port", 12480);
|
|
|
|
private static final String GEMFIRE_CACHE_SERVER_HOST = "localhost";
|
|
private static final String GEMFIRE_CACHE_SERVER_HOSTNAME_FOR_CLIENTS = GEMFIRE_CACHE_SERVER_HOST;
|
|
private static final String GEMFIRE_LOG_FILENAME_PATTERN =
|
|
String.format("%s", NativeGemFireServer.class.getSimpleName()).concat("-%s.log");
|
|
|
|
public static void main(String[] args) {
|
|
newNativeGemFireServer(args).run();
|
|
}
|
|
|
|
private final String[] args;
|
|
|
|
private static File newGemFireLogFile(String suffix) {
|
|
return new File(String.format(GEMFIRE_LOG_FILENAME_PATTERN, suffix));
|
|
}
|
|
|
|
private static NativeGemFireServer newNativeGemFireServer(String[] args) {
|
|
return new NativeGemFireServer(args);
|
|
}
|
|
|
|
private static String[] nullSafeStringArray(String[] array) {
|
|
return (array != null ? array.clone() : new String[0]);
|
|
}
|
|
|
|
private static void writeStringTo(File file, String fileContents) {
|
|
|
|
PrintWriter fileWriter = null;
|
|
|
|
try {
|
|
fileWriter = new PrintWriter(new BufferedWriter(new FileWriter(file, true)), true);
|
|
fileWriter.println(fileContents);
|
|
fileWriter.flush();
|
|
}
|
|
catch (IOException e) {
|
|
throw new RuntimeException(String.format("Failed to write [%s] to file [%s]", fileContents, file), e);
|
|
}
|
|
finally {
|
|
if (fileWriter != null) {
|
|
fileWriter.close();
|
|
}
|
|
}
|
|
}
|
|
|
|
private NativeGemFireServer(String[] args) {
|
|
this.args = nullSafeStringArray(args);
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
public void run() {
|
|
run(this.args);
|
|
}
|
|
|
|
private void run(String[] args) {
|
|
try {
|
|
writeStringTo(newGemFireLogFile("stdout"), "Before");
|
|
|
|
registerShutdownHook(addCacheServer(createRegion(gemfireCache(
|
|
gemfireProperties(applicationName())))));
|
|
|
|
writeStringTo(newGemFireLogFile("stdout"), "After");
|
|
}
|
|
catch (Throwable e) {
|
|
writeStringTo(newGemFireLogFile("stderr"), e.toString());
|
|
}
|
|
}
|
|
|
|
private String applicationName() {
|
|
return applicationName(null);
|
|
}
|
|
|
|
private String applicationName(String applicationName) {
|
|
|
|
return StringUtils.hasText(applicationName) ? applicationName
|
|
: "spring-session-data-gemfire.boot.sample." + NativeGemFireServer.class.getSimpleName();
|
|
}
|
|
|
|
private Properties gemfireProperties(String applicationName) {
|
|
|
|
Properties gemfireProperties = new Properties();
|
|
|
|
gemfireProperties.setProperty("name", applicationName);
|
|
gemfireProperties.setProperty("log-file", "gemfire-server.log");
|
|
gemfireProperties.setProperty("log-level", "config");
|
|
//gemfireProperties.setProperty("jmx-manager", "true");
|
|
//gemfireProperties.setProperty("jmx-manager-start", "true");
|
|
|
|
return gemfireProperties;
|
|
}
|
|
|
|
private Cache gemfireCache(Properties gemfireProperties) {
|
|
return new CacheFactory(gemfireProperties).create();
|
|
}
|
|
|
|
private Cache createRegion(Cache gemfireCache) {
|
|
|
|
RegionFactory<Object, AbstractGemFireOperationsSessionRepository.GemFireSession> regionFactory =
|
|
gemfireCache.createRegionFactory(RegionShortcut.PARTITION);
|
|
|
|
regionFactory.setKeyConstraint(Object.class);
|
|
regionFactory.setValueConstraint(AbstractGemFireOperationsSessionRepository.GemFireSession.class);
|
|
regionFactory.setStatisticsEnabled(true);
|
|
regionFactory.setEntryIdleTimeout(newExpirationAttributes(1800, ExpirationAction.INVALIDATE));
|
|
|
|
Region region = regionFactory.create(
|
|
GemFireHttpSessionConfiguration.DEFAULT_SESSION_REGION_NAME);
|
|
|
|
return gemfireCache;
|
|
}
|
|
|
|
private ExpirationAttributes newExpirationAttributes(int expirationTime, ExpirationAction expirationAction) {
|
|
return new ExpirationAttributes(expirationTime, expirationAction);
|
|
}
|
|
|
|
private Cache addCacheServer(Cache gemfireCache) throws IOException {
|
|
|
|
CacheServer cacheServer = gemfireCache.addCacheServer();
|
|
|
|
cacheServer.setBindAddress(GEMFIRE_CACHE_SERVER_HOST);
|
|
cacheServer.setHostnameForClients(GEMFIRE_CACHE_SERVER_HOSTNAME_FOR_CLIENTS);
|
|
cacheServer.setPort(GEMFIRE_CACHE_SERVER_PORT);
|
|
cacheServer.start();
|
|
|
|
return gemfireCache;
|
|
}
|
|
|
|
private Cache registerShutdownHook(final Cache gemfireCache) {
|
|
|
|
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
|
|
public void run() {
|
|
if (gemfireCache != null) {
|
|
gemfireCache.close();
|
|
}
|
|
}
|
|
}));
|
|
|
|
return gemfireCache;
|
|
}
|
|
}
|