在VC环境下,创建虚拟机对象,进而调用Java类,实现预先定义好的连接Cassandra数据库功能,满足某种业务需要
首先定义连接Cassandra的Java代码,包含插入、查询功能
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.List;
import org.apache.cassandra.thrift.Cassandra;
import org.apache.cassandra.thrift.Cassandra.Client;
import org.apache.cassandra.thrift.Column;
import org.apache.cassandra.thrift.ColumnOrSuperColumn;
import org.apache.cassandra.thrift.ColumnParent;
import org.apache.cassandra.thrift.ColumnPath;
import org.apache.cassandra.thrift.ConsistencyLevel;
import org.apache.cassandra.thrift.InvalidRequestException;
import org.apache.cassandra.thrift.KeyRange;
import org.apache.cassandra.thrift.KeySlice;
import org.apache.cassandra.thrift.NotFoundException;
import org.apache.cassandra.thrift.SlicePredicate;
import org.apache.cassandra.thrift.SliceRange;
import org.apache.cassandra.thrift.TimedOutException;
import org.apache.cassandra.thrift.UnavailableException;
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;
public class Cassandratest{
public static String KEYSPACE = "NDOUTILS";
public static String HOST = "172.16.0.204";
public static int PORT = 9160;
public static String COLUMN_FAMILY = "logentries";
private static Client client;
private static TSocket socket;
private static TTransport transport;
private static TProtocol protocol;
private boolean isOpen = false;
public static void main(String args[]){
Cassandratest ccl = new Cassandratest();
ccl.init();
ccl.end();
}
Cassandratest(String keyspace, String column_family, String host,
int port) {
// TODO Auto-generated constructor stub
KEYSPACE = keyspace;
COLUMN_FAMILY = column_family;
HOST = host;
PORT = port;
}
Cassandratest() {
}
private static ByteBuffer strToBB(String msg) {
Charset charset = Charset.forName("UTF-8");
return ByteBuffer.wrap(msg.getBytes(charset));
}
private static String byteToStr(byte[] buf) {
Charset charset = Charset.forName("UTF-8");
return new String(buf, charset);
}
private void init() {
try {
socket = new TSocket(HOST, PORT);
transport = new TFramedTransport(socket);
protocol = new TBinaryProtocol(transport);
client = new Cassandra.Client(protocol);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if (!isOpen) {
try {
transport.open();
client.set_keyspace(KEYSPACE);
System.out.println("Opening...OK");
} catch (TTransportException e) {
// TODO Auto-generated catch block
System.out.println("Network is unreachable...");
} catch (InvalidRequestException e) {
// TODO Auto-generated catch block
System.out.println("请求无效");
} catch (TException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
isOpen = true;
// insertNewColumn(COLUMN_FAMILY, "logentry_id", "value", "0000");
} else {
System.out.println("连接已经打开");
}
}
private void end(){
if (isOpen) {
try {
transport.flush();
transport.close();
System.out.println("Closing...OK");
} catch (TTransportException e) {
// TODO Auto-generated catch block
System.out.println("Network is unreachable...");
}
} else {
System.out.println("连接已经关闭");
}
}
@SuppressWarnings("unused")
private Column insertNewColumn(String ColumnFamily, String Field,
String Name, String Value) {
long timestamp = System.currentTimeMillis();
Column column = new Column(strToBB(Name));
column.setValue(strToBB(Value));
column.setTimestamp(timestamp);
try {
client.insert(strToBB(Field), new ColumnParent(ColumnFamily),
column, ConsistencyLevel.ONE);
return column;
} catch (InvalidRequestException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (UnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (TimedOutException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (TException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
@SuppressWarnings("unused")
private ColumnOrSuperColumn getColumn(String ColumnFamily, String Field,
String Name, boolean print) {
ColumnPath path = new ColumnPath(ColumnFamily);
path.setColumn(strToBB(Name));
try {
ColumnOrSuperColumn column = client.get(strToBB(Field), path,
ConsistencyLevel.ONE);
if (print) {
System.out.println(byteToStr(column.getColumn().getName())
+ ":" + byteToStr(column.getColumn().getValue()));
}
return column;
} catch (InvalidRequestException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (NotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (UnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (TimedOutException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (TException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
@SuppressWarnings("unused")
private SlicePredicate getPredicate(String RangeFrom, String RangeTo,
boolean reversed, int GetNum) {
SlicePredicate predicate = new SlicePredicate();
predicate.setSlice_range(new SliceRange(strToBB(RangeFrom),
strToBB(RangeTo), reversed, GetNum));
return predicate;
}
@SuppressWarnings("unused")
private List<ColumnOrSuperColumn> getRangeValue(String ColumnFamily,
String Field, SlicePredicate Predicate, boolean Print) {
List<ColumnOrSuperColumn> columns;
try {
columns = client.get_slice(strToBB("test1"), new ColumnParent(
COLUMN_FAMILY), Predicate, ConsistencyLevel.ONE);
if (Print) {
for (ColumnOrSuperColumn aColumn : columns) {
System.out.println(byteToStr(aColumn.getColumn().getName())
+ ":" + byteToStr(aColumn.getColumn().getValue()));
}
}
return columns;
} catch (InvalidRequestException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (UnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (TimedOutException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (TException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
@SuppressWarnings("unused")
private List<KeySlice> ListFieldValue(String ColumnFamily,
String FromField, String ToField, SlicePredicate Predicate,
boolean print) {
// check all range--->key:name:value
KeyRange range = new KeyRange();
range.setStart_key(strToBB(FromField));
range.setEnd_key(strToBB(ToField));
List<KeySlice> keys;
try {
keys = client.get_range_slices(new ColumnParent(ColumnFamily),
Predicate, range, ConsistencyLevel.ONE);
if (print) {
for (KeySlice key : keys) {
for (ColumnOrSuperColumn aColumn : key.getColumns()) {
System.out.println(byteToStr(key.getKey()) + ":"
+ byteToStr(aColumn.getColumn().getName())
+ ":"
+ byteToStr(aColumn.getColumn().getValue()));
}
}
}
return keys;
} catch (InvalidRequestException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (UnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (TimedOutException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (TException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
将编译后的class文件导入VC工程下,配置jvm.dll到工程中,同时添加相关环境变量,以上过程略过
在VC工程中创建C++,实现虚拟机调用
#include <stdio.h>
#include <jni.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main() {
// 定义用到的变量
int res;
JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options[3];
vm_args.version;
// 设置初始化参数
options[0].optionString = "-Djava.compiler=NONE";
// classpath有多个时,用";"分隔,UNIX下以":"分割。
options[1].optionString =
"-Djava.class.path=.;D:\\apache-cassandra-1.0.0\\lib\\apache-cassandra-1.0.0.jar;D:\\apache-cassandra-1.0.0\\lib\\apache-cassandra-clientutil-1.0.0.jar;D:\\apache-cassandra-1.0.0\\lib\\apache-cassandra-thrift-1.0.0.jar;D:\\apache-cassandra-1.0.0\\lib\\commons-cli-1.1.jar;D:\\apache-cassandra-1.0.0\\lib\\commons-codec-1.2.jar;D:\\apache-cassandra-1.0.0\\lib\\antlr-3.2.jar;D:\\apache-cassandra-1.0.0\\lib\\avro-1.4.0-fixes.jar;D:\\apache-cassandra-1.0.0\\lib\\avro-1.4.0-sources-fixes.jar;D:\\apache-cassandra-1.0.0\\lib\\commons-lang-2.4.jar;D:\\apache-cassandra-1.0.0\\lib\\compress-lzf-0.8.4.jar;D:\\apache-cassandra-1.0.0\\lib\\concurrentlinkedhashmap-lru-1.2.jar;D:\\apache-cassandra-1.0.0\\lib\\guava-r08.jar;D:\\apache-cassandra-1.0.0\\lib\\high-scale-lib-1.1.2.jar;D:\\apache-cassandra-1.0.0\\lib\\jackson-core-asl-1.4.0.jar;D:\\apache-cassandra-1.0.0\\lib\\jackson-mapper-asl-1.4.0.jar;D:\\apache-cassandra-1.0.0\\lib\\jamm-0.2.5.jar;D:\\apache-cassandra-1.0.0\\lib\\jline-0.9.94.jar;D:\\apache-cassandra-1.0.0\\lib\\json-simple-1.1.jar;D:\\apache-cassandra-1.0.0\\lib\\libthrift-0.6.jar;D:\\apache-cassandra-1.0.0\\lib\\log4j-1.2.16.jar;D:\\apache-cassandra-1.0.0\\lib\\servlet-api-2.5-20081211.jar;D:\\apache-cassandra-1.0.0\\lib\\slf4j-api-1.6.1.jar;D:\\apache-cassandra-1.0.0\\lib\\slf4j-log4j12-1.6.1.jar;D:\\apache-cassandra-1.0.0\\lib\\snakeyaml-1.6.jar;D:\\apache-cassandra-1.0.0\\lib\\snappy-java-1.0.3.jar;";
// 用于跟踪运行时的信息
options[2].optionString = "-verbose:jni";
// 版本号设置
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 3;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
// 1.初始化虚拟机
res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if (res < 0)
{
fprintf(stderr, "Can't create Java VM\n");
exit(1);
}
// 2.获取类
jclass cls = env->FindClass("Cassandratest");
// 3.获取类的方法
jmethodID init= env->GetMethodID(cls,"init","()V");
jmethodID end= env->GetMethodID(cls,"end","()V");
//其中格式为 A Function(B b, C c)--->(BC)A
//例如,String类型,写为Ljava/lang/String,若自定义类型,则写为Lyour.pack.yourClass
//int类型写作I,空值返回写作(XXXX)V,返回值类型在括号右侧
//Short类型写作S,等等
jmethodID insertNewColumn= env->GetMethodID(cls,"insertNewColumn","(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/apache/cassandra/thrift/Column;");
// 获取Java的构造方法
jmethodID con=env->GetMethodID(cls,"<init>","()V");
jvalue arg[1];
// 4.创建类的对象
jobject obj = env->NewObjectA(cls,con,arg);
// 调用对象的方法
env->CallObjectMethod(obj,init);
env->CallObjectMethod(obj,end);
// 5.退出虚拟机
jvm->DestroyJavaVM();
fprintf(stdout, "Java VM destory.\n");
return 0;
}
以上方法能简单调用初始化方法,2011-11-08