mirror of https://github.com/apache/cassandra
197 lines
7.3 KiB
Java
197 lines
7.3 KiB
Java
/**
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
* or more contributor license agreements. See the NOTICE file
|
|
* distributed with this work for additional information
|
|
* regarding copyright ownership. The ASF licenses this file
|
|
* to you 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
|
|
*
|
|
* http://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.
|
|
*/
|
|
|
|
import java.nio.ByteBuffer;
|
|
import java.util.*;
|
|
|
|
import org.apache.cassandra.db.*;
|
|
import org.apache.cassandra.db.filter.QueryPath;
|
|
import org.apache.cassandra.service.StorageProxy;
|
|
import org.apache.cassandra.service.StorageService;
|
|
import org.apache.cassandra.thrift.*;
|
|
import org.apache.cassandra.utils.ByteBufferUtil;
|
|
|
|
import org.apache.thrift.TException;
|
|
import org.apache.thrift.protocol.TBinaryProtocol;
|
|
import org.apache.thrift.protocol.TProtocol;
|
|
import org.apache.thrift.transport.TFramedTransport;
|
|
import org.apache.thrift.transport.TSocket;
|
|
import org.apache.thrift.transport.TTransport;
|
|
import org.apache.thrift.transport.TTransportException;
|
|
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
public class ClientOnlyExample
|
|
{
|
|
private static final Logger logger = LoggerFactory.getLogger(ClientOnlyExample.class);
|
|
|
|
private static final String KEYSPACE = "Keyspace1";
|
|
private static final String COLUMN_FAMILY = "Standard1";
|
|
|
|
private static void startClient() throws Exception
|
|
{
|
|
StorageService.instance.initClient();
|
|
// sleep for a bit so that gossip can do its thing.
|
|
try
|
|
{
|
|
Thread.sleep(10000L);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw new AssertionError(ex);
|
|
}
|
|
}
|
|
|
|
private static void testWriting() throws Exception
|
|
{
|
|
// do some writing.
|
|
for (int i = 0; i < 100; i++)
|
|
{
|
|
RowMutation change = new RowMutation(KEYSPACE, ByteBufferUtil.bytes(("key" + i)));
|
|
ColumnPath cp = new ColumnPath(COLUMN_FAMILY).setColumn(("colb").getBytes());
|
|
change.add(new QueryPath(cp), ByteBufferUtil.bytes(("value" + i)), 0);
|
|
|
|
// don't call change.apply(). The reason is that is makes a static call into Table, which will perform
|
|
// local storage initialization, which creates local directories.
|
|
// change.apply();
|
|
|
|
StorageProxy.mutate(Arrays.asList(change), ConsistencyLevel.ONE);
|
|
System.out.println("wrote key" + i);
|
|
}
|
|
System.out.println("Done writing.");
|
|
}
|
|
|
|
private static void testReading() throws Exception
|
|
{
|
|
// do some queries.
|
|
Collection<ByteBuffer> cols = new ArrayList<ByteBuffer>()
|
|
{{
|
|
add(ByteBufferUtil.bytes("colb"));
|
|
}};
|
|
for (int i = 0; i < 100; i++)
|
|
{
|
|
List<ReadCommand> commands = new ArrayList<ReadCommand>();
|
|
SliceByNamesReadCommand readCommand = new SliceByNamesReadCommand(KEYSPACE, ByteBufferUtil.bytes(("key" + i)),
|
|
new QueryPath(COLUMN_FAMILY, null, null), cols);
|
|
readCommand.setDigestQuery(false);
|
|
commands.add(readCommand);
|
|
List<Row> rows = StorageProxy.read(commands, ConsistencyLevel.ONE);
|
|
assert rows.size() == 1;
|
|
Row row = rows.get(0);
|
|
ColumnFamily cf = row.cf;
|
|
if (cf != null)
|
|
{
|
|
for (IColumn col : cf.getSortedColumns())
|
|
{
|
|
System.out.println(ByteBufferUtil.string(col.name()) + ", " + ByteBufferUtil.string(col.value()));
|
|
}
|
|
}
|
|
else
|
|
System.err.println("This output indicates that nothing was read.");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* First, bring one or more nodes up. Then run ClientOnlyExample with these VM arguments:
|
|
*
|
|
* -Xmx1G
|
|
* -Dcassandra.config=/Users/gary/cassandra/conf/cassandra.yaml (optional, will first look for cassandra.yaml on classpath)
|
|
*
|
|
* Pass "write" or "read" into the program to exercise the various methods.
|
|
*
|
|
* Caveats:
|
|
*
|
|
* 1. Much of cassandra is not reentrant. That is, you can't spin a client up, down, then back up in the same jvm.
|
|
* 2. Because of the above, you still need to force-quit the process. StorageService.stopClient() doesn't (can't)
|
|
* spin everything down.
|
|
*/
|
|
public static void main(String args[]) throws Exception
|
|
{
|
|
startClient();
|
|
setupKeyspace(createConnection());
|
|
testWriting();
|
|
logger.info("Writing is done. Sleeping, then will try to read.");
|
|
try
|
|
{
|
|
Thread.currentThread().sleep(10000);
|
|
}
|
|
catch (InterruptedException ex)
|
|
{
|
|
throw new RuntimeException(ex);
|
|
}
|
|
|
|
testReading();
|
|
|
|
// no need to do this:
|
|
// StorageService.instance().decommission();
|
|
// do this instead:
|
|
StorageService.instance.stopClient();
|
|
System.exit(0); // the only way to really stop the process.
|
|
}
|
|
|
|
/**
|
|
* This method will fail if the keyspace already exists
|
|
*/
|
|
private static void setupKeyspace(Cassandra.Iface client) throws TException, InvalidRequestException
|
|
{
|
|
List<CfDef> cfDefList = new ArrayList<CfDef>();
|
|
CfDef columnFamily = new CfDef(KEYSPACE, COLUMN_FAMILY);
|
|
cfDefList.add(columnFamily);
|
|
|
|
try
|
|
{
|
|
client.system_add_keyspace(new KsDef(KEYSPACE, "org.apache.cassandra.locator.SimpleStrategy", 1, cfDefList));
|
|
int magnitude = client.describe_ring(KEYSPACE).size();
|
|
try
|
|
{
|
|
Thread.sleep(1000 * magnitude);
|
|
}
|
|
catch (InterruptedException e)
|
|
{
|
|
throw new RuntimeException(e);
|
|
}
|
|
}
|
|
catch (InvalidRequestException probablyExists)
|
|
{
|
|
logger.warn("Problem creating keyspace: " + probablyExists.getMessage());
|
|
}
|
|
}
|
|
|
|
private static Cassandra.Iface createConnection() throws TTransportException
|
|
{
|
|
if (System.getProperty("cassandra.host") == null || System.getProperty("cassandra.port") == null)
|
|
{
|
|
logger.warn("cassandra.host or cassandra.port is not defined, using default");
|
|
}
|
|
return createConnection( System.getProperty("cassandra.host","localhost"),
|
|
Integer.valueOf(System.getProperty("cassandra.port","9160")),
|
|
Boolean.valueOf(System.getProperty("cassandra.framed", "true")) );
|
|
}
|
|
|
|
private static Cassandra.Client createConnection(String host, Integer port, boolean framed) throws TTransportException
|
|
{
|
|
TSocket socket = new TSocket(host, port);
|
|
TTransport trans = framed ? new TFramedTransport(socket) : socket;
|
|
trans.open();
|
|
TProtocol protocol = new TBinaryProtocol(trans);
|
|
|
|
return new Cassandra.Client(protocol);
|
|
}
|
|
}
|