Edited at

C# で DataSpider のサービスを呼び出してみた

More than 3 years have passed since last update.

慣れ親しんだ C# から直接 DataSpider Servista のサービスを呼び出せると便利だなと思ったのでまとめてみました。


DataSpider Servista とは

ここをご覧になられている方はご存じだと思いますがお約束のために説明しますと、DataSpider Servista は様々なシステムやアプリケーション間のデータのやり取りを GUI ベースで作成することができるデータ連携ミドルウェアです。

ミドルウェアというと難しそうですが、簡単に言うと処理アイコンをポトペタで張り付けて線を引くだけで処理が作れる開発環境と、それを実行するためのサーバーアプリケーションがセットになったようなものです。詳細は こちらの製品ページ へ。


DataSpider Servista 開発の流れ

開発の流れは大雑把に分けると以下のようになります。

 1. DataSpider Studio でスクリプトを作成する

 2. DataSpiderServer にスクリプトをサービスとして登録する

 3. DataSpiderServer でサービスを実行させる

開発環境があるといっても実行ファイルを生成するような仕組みではないので、サーバーアプリケーションに実行させる必要があります。そして「実行させる」といっても方法には色々あります。



  • トリガー


    • 特定の条件を満たしたタイミングでDataSpiderServerがサービスを実行する方法です。定期実行やファイル監視、HTTP要求など様々な種類があります。




  • ScriptRunner


    • コマンドプロンプトでプログラムと引数を設定してサービスを実行する方法です。bat ファイルなどで定期処理をまとめたい場合に便利です。事前に設定ファイルを用意する必要があり、すこし面倒かも知れません。




  • ScriptRunnerProxy


    • DataSpider Servista が提供している Java API を使用してサービスを実行する方法です。Java アプリケーションから直接呼び出せるので、かなり柔軟に色々とできるようになります。



こんな感じにサービスの実行ができるのですが、C# アプリケーションから呼び出すことを考えると少し手間がかかります。

なぜ C# から呼び出すことを考えたかって? それは C#er だからです。

そこで C# から DataSpider のサービスを呼び出す方法を調べてみました。


環境

今回使用する環境は以下のとおりです。



  • DataSpider Servista


    • これがないと始まりません。お持ちでない方は 体験版/評価版ページ から入手可能です。体験版ならWebダウンロードできるのでお手軽です。




  • Java Development Kit


    • DataSpider は JRE を内蔵しているので JDK のインストールは必要ありませんが、ScriptRunnerProxy のために必要です。あと後述の jni4net のためにも。とりあえず最新版を使います。




  • Windows 7


    • DataSpider Servista 体験版の動作環境 OS にはサーバー系の OS しか記載ありませんが、クライアント系 OS でもとりあえず動作するので安心してください。




  • Visual Studio 2015


    • C#プログラムを作ります。.NET Framework で開発できればなんでも構いません。無料化万歳。




作成

C# から DataSpider のサービスを実行させる方法は色々思いつきましたが、今回はたまたま見かけた jni4net を使ってみました。


動作確認用のサンプルスクリプト作成とサービス登録

文字列型の入力変数と出力変数を持つスクリプトを作成して変数代入アイコンを配置し、以下の図のように「Hello, DataSpider!」の文字列と入力変数の値を連結して出力変数に渡すようにしてみました。

002.png

入力変数の初期値は「from Studio」なので、デバッグ実行してみると実行ログには「output(String) = Hello, DataSpider! from Studio」と表示されます。

これを DataSpiderServer へサービスとして登録しておきます。


jni4net で Java API のプロキシ作成

ここからが本番です。

C# から目的の Java API を呼び出せるように準備します。

まずは jni4net を こちらのサイト からダウンロードしてきます。


  • 今回は「jni4net-0.8.8.0-bin.zip」をダウンロードして、とりあえずCドライブ直下に解凍しました。

次に、作業用フォルダを作成して、目的の Java API 含まれているパッケージを配置します。


  • 今回はデスクトップに「jni4net」フォルダを作成しました。


  • DataSpider Servista のヘルプ によると、必要なパッケージファイルは $DATASPIDER_HOME/server/system/common/lib フォルダにある dssrconnection.jar というファイルのようなので、これを作業用フォルダにコピーします。

Visual Studio の開発者コマンドプロンプトを起動して、作業用フォルダに移動して以下のコマンドを実行します。


command

C:\jni4net-0.8.8.0-bin\bin\proxygen.exe dssrconnection.jar -wd C:\Users\shikacu\Desktop\jni4net



  • 実行後に Proxygen must be run as trusted assembly! (shared drive could cause the problem) というエラーが表示されたら、解凍した jni4net フォルダ内の bin や lib フォルダにあるファイルのプロパティを表示して ブロックの解除を実施しましょう。

  • 実行が成功すると以下のように出力されます。


CommandPrompt

C:\Users\shikacu\Desktop\jni4net>C:\jni4net-0.8.8.0-bin\bin\proxygen.exe dssrconnection.jar -wd C:\Users\shikacu\Desktop\jni4net

jni4net.proxygen - Copyright (C) 2009 Pavel Savara - licensed under GPLv3
will generate CLR com.appresso.ds.common.fw.gid
will generate CLR com.appresso.ds.common.fw.rmiportconfiguration
will generate CLR com.appresso.ds.common.fw.id.globalid
will generate CLR com.appresso.ds.common.fw.id.main
will generate CLR com.appresso.ds.common.fw.id.remoteid
will generate CLR com.appresso.ds.common.fw.id.remoteidimpl
will generate CLR com.appresso.ds.common.fw.id.timeid
will generate CLR com.appresso.ds.common.fw.util.httpurlconnectionutil
will generate CLR com.appresso.ds.common.kernel.webnames
will generate CLR com.appresso.ds.common.messagecode.messagecode
will generate CLR com.appresso.ds.common.messagecode.messagecodeholder
will generate CLR com.appresso.ds.common.script.executionidgenerator
will generate CLR com.appresso.ds.common.script.executiontypes
will generate CLR com.appresso.ds.common.script.failure
will generate CLR com.appresso.ds.common.script.scriptpk
will generate CLR com.appresso.ds.common.script.scriptrunnerexception
will generate CLR com.appresso.ds.common.script.scriptrunnerloginexception
will generate CLR com.appresso.ds.common.script.scriptrunneroption
will generate CLR com.appresso.ds.common.script.scriptrunnerparam
will generate CLR com.appresso.ds.common.script.scriptrunnerresult
will generate CLR com.appresso.ds.common.script.ext.scriptrunnerlistener
will generate CLR com.appresso.ds.common.script.http.httpproxy
will generate CLR com.appresso.ds.common.script.runner.scriptrunnerconnectionfactory
will generate CLR com.appresso.ds.common.script.http.httpscriptrunnerconnectionfactory
will generate CLR com.appresso.ds.common.script.http.httpsproxy
will generate CLR com.appresso.ds.common.script.id.generator
will generate CLR com.appresso.ds.common.script.runner.main
will generate CLR com.appresso.ds.common.script.runner.scriptrunnerconnection
will generate CLR com.appresso.ds.common.script.runner.scriptrunnerconnectionmanager
will generate CLR com.appresso.ds.common.script.runner.scriptrunnerlogger
will generate CLR com.appresso.ds.common.script.runner.variableparser
proxygen done

実行が成功すると build.cmd が生成されているので、続けて開発者用コマンドプロンプトでこれを実行します。


CommandPrompt

C:\Users\shikacu\Desktop\jni4net>build.cmd

compile classes
dssrconnection.j4n.jar
dssrconnection.j4n.dll

以上で準備は完了です。


サービス呼び出し用の C# アプリケーション作成

Visual Studio を起動して C# のコンソールアプリケーションプロジェクトを作成します。


  • 今回は「ScriptRunnerProxyTest」という名前でプロジェクトを作成しました。

  • プロジェクトの対象フレームワークは「.NET Framework 4」に設定しました。

作業用フォルダにある以下のファイルをプロジェクトのフォルダにコピーします。


  • dssrconnection.j4n.dll

  • dssrconnection.j4n.jar

  • dssrconnection.jar

jni4net の lib フォルダにある以下のファイルもプロジェクトのフォルダにコピーします。


  • jni4net.j-0.8.8.0.jar

  • jni4net.n.w64.v40-0.8.8.0.dll

  • jni4net.n-0.8.8.0.dll

コピーしてきたファイルはすべてプロジェクトに含めておきます。

プロジェクトの参照にコピーしてきた以下のアセンブリを追加します。


  • dssrconnection.j4n.dll

  • jni4net.n-0.8.8.0.dll

Visual Studio ソリューションエクスプローラで以下のファイルのプロパティの出力ディレクトリにコピーの値を常にコピーするに設定します。


  • dssrconnection.j4n.jar

  • dssrconnection.jar

  • jni4net.j-0.8.8.0.jar

  • jni4net.n.w64.v40-0.8.8.0.dll

DataSpider Servista ヘルプの作成例 を参考に Program.cs にサービス呼び出しの処理を記述します。


Program.cs

using com.appresso.ds.common.script;

using com.appresso.ds.common.script.runner;
using net.sf.jni4net;
using net.sf.jni4net.jni;
using System;
using System.Reflection;

namespace ScriptRunnerProxyTest
{
class Program
{
static void Main(string[] args)
{
var setup = new BridgeSetup();
setup.AddAllJarsClassPath("./");

Bridge.CreateJVM(setup);
try
{
Bridge.RegisterAssembly(Assembly.Load("dssrconnection.j4n"));
}
catch (JNIException){ }

var manager = ScriptRunnerConnectionManager.getInstance();
var factory = manager.createConnectionFactory();

factory.setHost("127.0.0.1");
factory.setPort(7700);
factory.setUser("root");
factory.setPassword("********");
factory.setSSLEnabled(false);

ScriptRunnerConnection conn = null;
try
{
conn = factory.newConnection();
var param = new ScriptRunnerParam();

// スクリプトパッケージの作成
var pk = new ScriptPK("root@プロジェクト", "スクリプト");
param.setScriptPK(pk);

// 引数の設定
var input = new java.util.Properties();
input.put(new java.lang.String("input"), new java.lang.String("from C#"));
param.setInput(input);

// 実行および結果の取得
ScriptRunnerResult result = conn.execute(param);

// 終了ステータスの取得
Console.WriteLine("Exit Status: " + result.getExitStatus());
if (result.isSucceeded())
{
// 処理が成功の場合
var output = result.getResultData();
var iterator = output.keySet().iterator();
while (iterator.hasNext())
{
var key = iterator.next();
java.lang.Object value = output.get(key);
if (value == null)
{
Console.WriteLine(key + "(null): " + value);
}
else
{
Console.WriteLine(key + "(" + value.GetType() + "): " + value);
}
}
}
else
{
// 処理が失敗の場合
for (Failure f = result.getFailure(); f != null; f = f.next())
{
Console.WriteLine(f.toString());
}
}
}
finally
{
if (conn != null) conn.close();
}
}
}
}


実行してみます。


CommandPrompt

C:\ScriptRunnerProxyTest\ScriptRunnerProxyTest\bin\Debug>ScriptRunnerProxyTest.exe

Exit Status: 0
output(java.lang.String): Hello, DataSpider! from C#


まとめ

C# から DataSpider のサービスを呼び出すことができました!

さらっとできたように書いていますが、呼び出せるようになるまで多数の問題が発生していました。

特定環境以外の dssrconnection.jar だと ScriptRunnerConnectionManager.getInstance() で NullReferenceException が発生して動作しないという問題は原因不明のままです。ごめんなさい(/_;)

解決出来たらページ更新します!


参考