package eu.fbk.knowledgestore.client; import java.util.Date; import com.google.common.collect.AbstractIterator; import org.openrdf.model.ValueFactory; import org.openrdf.model.vocabulary.DCTERMS; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import eu.fbk.knowledgestore.KnowledgeStore; import eu.fbk.knowledgestore.OperationException; import eu.fbk.knowledgestore.Outcome; import eu.fbk.knowledgestore.Session; import eu.fbk.knowledgestore.data.Data; import eu.fbk.knowledgestore.data.Handler; import eu.fbk.knowledgestore.data.Record; import eu.fbk.knowledgestore.data.Stream; import eu.fbk.knowledgestore.vocabulary.KS; public class ClientStressTest { private static final Logger LOGGER = LoggerFactory.getLogger(ClientStressTest.class); private static final String SERVER_URL = "http://localhost:8080/"; private static final String USERNAME = "ks"; private static final String PASSWORD = "kspass"; private static final int NUM_RECORDS = 100; public static void main(final String... args) throws Throwable { // Initialize a KnowledgeStore client final KnowledgeStore store = Client.builder(SERVER_URL).maxConnections(2) .validateServer(false).build(); try { // Acquire a session for a given username/password pair final Session session = store.newSession(USERNAME, PASSWORD); // Clear all resources stored in the KS session.delete(KS.RESOURCE).exec(); session.delete(KS.MENTION).exec(); // Upload records storeSingle(session); // Clear all resources stored in the KS session.delete(KS.RESOURCE).exec(); // Close the session session.close(); } finally { // Ensure to close the KS (will also close pending sessions) store.close(); } } static void storeSingle(final Session session) throws Throwable { final Stream<Record> records = createRecordStream(); for (final Record record : records) { session.merge(KS.RESOURCE).criteria("overwrite *").records(record).exec(); } } static void storeBatch(final Session session) throws OperationException { session.merge(KS.RESOURCE).criteria("overwrite *").records(createRecordStream()) .exec(new Handler<Outcome>() { private boolean started = false; @Override public void handle(final Outcome outcome) throws Throwable { if (outcome == null) { LOGGER.info("Done receiving outcomes"); } else if (!this.started) { LOGGER.info("Started receiving outcomes"); this.started = true; } } }); } static Stream<Record> createRecordStream() { return Stream.create(new AbstractIterator<Record>() { private int index = 0; @Override protected Record computeNext() { ++this.index; if (this.index > NUM_RECORDS) { return endOfData(); } if (this.index % 100 == 0) { LOGGER.info("{} records generated", this.index); } final ValueFactory factory = Data.getValueFactory(); final Record record = Record.create(factory.createURI("ex:resource" + this.index), KS.RESOURCE); record.set(DCTERMS.TITLE, "Resource " + this.index); record.set(DCTERMS.CREATOR, "John Smith"); record.set(DCTERMS.CREATED, new Date()); // record.set(DCTERMS.ABSTRACT, Strings.repeat("... bla ...\n", 1000)); return record; } }); } }