package org.xdi.oxauth.dev;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.Date;
import java.util.HashMap;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import org.xdi.oxauth.model.common.MemcachedGrant;
import org.xdi.oxauth.model.common.SessionState;
import org.xdi.oxauth.model.common.User;
import org.xdi.oxauth.model.registration.Client;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import net.spy.memcached.DefaultConnectionFactory;
import net.spy.memcached.MemcachedClient;
import net.spy.memcached.internal.OperationFuture;
import net.spy.memcached.ops.OperationStatus;
/**
* @author yuriyz on 02/02/2017.
*/
public class MemcacheManual {
private static final int CLIENT_COUNT = 10;
private static final Random RANDOM = new Random();
private static MemcachedClient createClients() throws IOException {
return new MemcachedClient(new DefaultConnectionFactory(100, 32768),
Lists.newArrayList(new InetSocketAddress("localhost", 11211)));
}
private static int random() {
int min = 0;
int max = CLIENT_COUNT;
return RANDOM.nextInt(max - min + 1) + min;
}
public static void main(String[] args) throws IOException {
final MemcachedClient client = createClients();
final ExecutorService executorService = Executors.newFixedThreadPool(1000, daemonThreadFactory());
int count = 10000;
final long start = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
final int key = i;
executorService.execute(new Runnable() {
@Override
public void run() {
// MemcachedClient client = clients.get(random);
Object toPut = testGrant();
// Object toPut = UUID.randomUUID().toString();
OperationFuture<Boolean> set = null;
for (int j = 0; j < 3; j++) {
set = client.set(Integer.toString(key), 60, toPut);
}
OperationStatus status = set.getStatus(); // block
System.out.println(
" key: " + key + ", time: " + (new Date().getTime() - start) + "ms, set: " + status);
executorService.execute(new Runnable() {
@Override
public void run() {
int random = random();
if (random % 3 == 0) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Object get = client.get(Integer.toString(key));
System.out.println("GET key: " + key + " result: " + get);
}
});
}
});
}
sleep(40);
// System.out.println(client.get("myKey"));
//
// client.set("myKey", 30, testState());
//
// sleep(12);
// System.out.println(client.get("myKey"));
//
// sleep(12);
// System.out.println(client.get("myKey"));
client.shutdown();
}
private static void sleep(int seconds) {
try {
Thread.sleep(seconds * 1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
public static ThreadFactory daemonThreadFactory() {
return new ThreadFactory() {
public Thread newThread(Runnable p_r) {
Thread thread = new Thread(p_r);
thread.setDaemon(true);
return thread;
}
};
}
private static SessionState testState() {
HashMap<String, String> map = new HashMap<String, String>();
map.put("mapKey", "mapValue");
SessionState state = new SessionState();
state.setUserDn("userDn");
state.setId(UUID.randomUUID().toString());
state.setLastUsedAt(new Date());
state.setSessionAttributes(map);
return state;
}
private static Client testClient() {
Client client = new Client();
client.setClientId(UUID.randomUUID().toString());
return client;
}
private static User testUser() {
User user = new User();
user.setUserId(UUID.randomUUID().toString());
return user;
}
private static MemcachedGrant testGrant() {
MemcachedGrant grant = new MemcachedGrant();
grant.setAcrValues("basic");
grant.setAuthenticationTime(new Date());
grant.setAuthorizationCodeString(UUID.randomUUID().toString());
grant.setClient(testClient());
grant.setGrantId(UUID.randomUUID().toString());
grant.setNonce(UUID.randomUUID().toString());
grant.setScopes(Sets.newHashSet("openid"));
grant.setUser(testUser());
return grant;
}
}