Java言語のロギングとランタイム情報
この例では、次のファイル名を使用する: 'TestJavaRuntime.java
コード
この例のコードは、一般的には使用されないかもしれない機能を探っている。 ログの記録は、AEの実行を追跡するのに役立つ。 使用するには、AEがログマスクで登録され、nzudxdbgを介してロギングが有効になっていなければならない。 NPS システムが起動したウィンドウでシステム・ログ・メッセージを受信するには、NPS を'-i'オプションで起動する必要がある(例えば、'nzstart-i') これにより、NPSプロセスは端末に接続されたままとなる。 ランタイム情報は、データスライス数、SPU 数、実行場所など、NPS システムに関する統計情報を提供する。
import org.netezza.ae.*;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
public class TestJavaRuntime {
private static final Executor exec =
Executors.newCachedThreadPool();
public static final void main(String [] args) {
try {
mainImpl(args);
} catch (Throwable t) {
System.err.println(t.toString());
NzaeUtil.logException(t, "main");
}
}
public static final void mainImpl(String [] args) {
NzaeApiGenerator helper = new NzaeApiGenerator();
while (true) {
final NzaeApi api = helper.getApi(NzaeApi.FUNCTION);
if (api.apiType == NzaeApi.FUNCTION) {
if (!helper.isRemote()) {
run(api.aeFunction);
break;
} else {
Runnable task = new Runnable() {
public void run() {
try {
TestJavaRuntime.run(api.aeFunction);
} finally {
api.aeFunction.close();
}
}
};
exec.execute(task);
}
}
}
helper.close();
}
public static void validateRuntime(Nzae aeFunc, long[] args, int type)
{
// argss:
// dataslice, transaction, hardware, numslices, numspus, locus
long dataslice = args[0];
long txid = args[1];
long hwid = args[2];
long nslices = args[3];
long nspus = args[4];
long locus = args[5];
NzaeRuntime aeRun = aeFunc.getRuntime();
String buf;
if (locus != aeRun.getLocus())
{
buf = "test fails: 1\n";
aeFunc.log(Nzae.LOG_DEBUG, buf);
}
if (aeRun.getSuggestedMemoryLimit() != 123)
{
buf = "test fails: 7 \n";
aeFunc.log(Nzae.LOG_DEBUG, buf);
}
if (aeRun.getUserQuery() == false)
{
buf ="test fails: 8 \n";
aeFunc.log(Nzae.LOG_DEBUG, buf);
}
if (type != aeRun.getAdapterType())
{
buf = "test fails: 9 \n";
aeFunc.log(Nzae.LOG_DEBUG, buf);
}
if (locus == NzaeRuntime.NZAE_LOCUS_POSTGRES) {
return;
}
if (dataslice != aeRun.getDataSliceId())
{
buf = "test fails: 2 \n";
aeFunc.log(Nzae.LOG_DEBUG, buf);
}
if ((txid != 0) && (txid != aeRun.getTransactionId()))
{
buf ="test fails: 3 \n";
aeFunc.log(Nzae.LOG_DEBUG, buf);
}
if (hwid != aeRun.getHardwareId())
{
buf = "test fails: 4 \n";
aeFunc.log(Nzae.LOG_DEBUG, buf);
}
if (nslices != aeRun.getNumberDataSlices())
{
buf = "test fails: 5 \n";
aeFunc.log(Nzae.LOG_DEBUG, buf);
}
if (nspus != aeRun.getNumberSpus())
{
buf = "test fails: 6 \n";
aeFunc.log(Nzae.LOG_DEBUG, buf);
}
}
public static class MyHandler implements NzaeMessageHandler
{
public void evaluate(Nzae ae, NzaeRecord input, NzaeRecord output) {
final NzaeMetadata meta = ae.getMetadata();
long ar[] = new long[6];
for (int i=0; i < 6; i++)
{
Object o = input.getField(i);
NzaeFieldInfo fi = input.getFieldInfo(i);
if (fi.getNzType() == NzaeDataTypes.NZUDSUDX_INT64){
ar[i] = (Long)o;
}
else if (fi.getNzType() == NzaeDataTypes.NZUDSUDX_INT32){
ar[i] = (Integer)o;
}
}
validateRuntime(ae, ar, NzaeRuntime.NZAE_ADAPTER_UDTF);
String str = "done";
output.setField(0,str);
}
}
public static int run(Nzae ae)
{
ae.run(new MyHandler());
return 0;
}
}
コンパイル
標準コンパイルを使用する:
$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language java --template compile \
TestJavaRuntime.java --version 3
登録
memオプションと-maskオプションを使ってサンプルを登録する。 maskオプションはDEBUGのロギングを有効にし、-memオプションはメモリーのランタイム情報を設定する。
$NZ_EXPORT_DIR/ae/utilities/bin/register_ae \
--sig "runtimeae(int8,int8,int8,int8,int8,int8)" \
--return "table(val varchar(1000))" --class AeUdtf --language java \
--template udtf --version 3 --define "java_class=TestJavaRuntime" \
--mem 123 --mask debug
実行中
実行する前に、'nzudxdbg:実行してロギングを有効にする。
nzudxdbg
Processing 1 spus
.
done
Processing host
done
nzsqlでクエリを実行する:
SELECT * FROM TABLE WITH FINAL(runtimeae(1,1,1,1,1,1));
VAL
------
done
(1 row)
NPS システムのログは、NPS システムが起動されたウィンドウに表示されます:
04-16-10 12:27:27 (dbos.19600) [d,udx ] test fails: 2
04-16-10 12:27:27 (dbos.19600) [d,udx ] test fails: 3
04-16-10 12:27:27 (dbos.19600) [d,udx ] test fails: 4
これらのケースでは、指定された引数がランタイムと一致しなかったので、これは期待された出力である。