0

Caché の Objectscript での開発について助けが必要です。

私はこのテクノロジに数か月取り組んできましたが、数日以来、Java ゲートウェイを機能させようとしていますが、うまくいきません。java .class と .jar コードを実行できるはずです。
しかし、ドキュメントで説明されていても、完全な例はなく、エラーが何度も発生しています。それで、誰かが完全な例を提供したり、私を修正したり、私が間違っていることを説明したりできるかどうか疑問に思っていましたか?

ここに私が今持っているものがあります:

私の単純な Java クラス - ファイルに日付と時刻を書き込む

package packagename.packagename2;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDateTime;

public class entertest {

    public int enter() throws IOException
    {
         File file = new File("D:\\path\\filemane.txt");

         if (!file.exists()) {
              file.createNewFile();
         }

         BufferedWriter bf = new BufferedWriter(new FileWriter(file.getAbsoluteFile()));
         bf.write(LocalDateTime.now().toString());
         bf.close();

         return 1;
     }

}

私の objectscript コード - ゲートウェイを定義し、メソッドを呼び出してみます

Class domain.java.TestJava Extends EnsLib.HL7.Service.TCPService
{

    Method OnProcessInput(pLine As Ens.StringContainer, Output pLineLeftOver As Ens.StringContainer) As %Status
    {
        Do ##super(pLine,pLineLeftOver)
        Set val = 0

        $$$TRACE(val)

        Set gateway = ##class(%Net.Remote.Gateway).%New()
        Do gateway.%Connect("127.0.0.1", 55553)
        Do gateway.%Import("D:\\path\\entertest.jar")

        Set javaObj = ##class(packagename.packagename2.entertest).%New(gateway)
        Set val = javaObj.enter()

        $$$TRACE(val)

        Quit $$$OK
    }
}

エラーが発生します:

ERREUR <Ens>ErrException: <CLASS DOES NOT EXIST>zOnProcessInput+9^domain.java.TestJava.1 *packagename.packagename2.entertest 
    -- - connecté en tant que '-' numéro - @' Set javaObj = ##class(packagename.packagename2.entertest).%New(gateway)'

私はこの投稿を使用しましたが、彼がどのように機能させたのかわかりません: Intersystems Caché with Java Gateway - Pass parameter as java.io.FileInputStream

Ensembleプロダクションにサービス「JavaGatewayService」を追加してみました。役に立ちませんでした...
オブジェクトゲートウェイも追加しようとしました

[システム管理] > [構成] > [接続] > [オブジェクト ゲートウェイ]。

役に立たなかった...そして、それが私を助けるべきかどうかわからない...

アイデア/オプションがありません。

前もって感謝します。

4

2 に答える 2

0

Ensemble で Java を使用するには、JavaGateway サービスを使用する必要があり、Java クラスを Caché にインポートする必要があります。詳細については、ドキュメントを参照してください。InterSystems Developer Community portal
で質問すると、もう少し早く回答を得ることができます。

UPD : Java クラスをインポートしようとしましたが、方法が間違っていました。ドキュメントを見ると、 method の定義が表示されます%Import

最終メソッド %Import(javaClass As %String, ByRef javaClasses As %ListOfDataTypes, additionalClassPaths As %ListOfDataTypes = "", 除外 As %ListOfDataTypes = "")

ここでわかるように、最初のパラメーターは javaClass. だから、代わりに

Do gateway.%Import("D:\\path\\entertest.jar")

特定の Java クラスをインポートしようとする

Do gateway.%Import("packagename.packagename2.entertest")
于 2016-12-22T14:28:50.617 に答える
0

私はついに実用的な解決策を得ることができたので、これを共有して完全なステップバイステップガイドを提供するために追加しています.


Ensemble で、アドレスとして 127.0.0.1、ポートとして 55555 で構成された "EnsLib.JavaGateway.Service" の "JavaGateway" サービスを追加しました (これらはデフォルト値だと思います) 。また、JDKVersion で「Java 1.8」を使用するように指定しました。

これを Java コードとして記述し、Jar アーカイブとしてエクスポートしました。

package packageName;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDateTime;

public class EnterTestClass {

    public long enter() throws IOException {

        File file = new File("D:\\Path\\EnterTestClass.txt");

        if (!file.exists()) {
            file.createNewFile();
        }

        BufferedWriter bf = new BufferedWriter(new FileWriter(file.getAbsoluteFile()));
        bf.write(LocalDateTime.now().toString());
        bf.close();

        return 1;
    }
}

Studio で、新しいクラスを作成しました。
コードは次のとおりです。

Method OnProcessInput(pLine As Ens.StringContainer, Output pLineLeftOver As Ens.StringContainer) As %Status
{
    Set val = 0
    $$$TRACE(val)

    Set gateway = ##class(%Net.Remote.Gateway).%New()
    Do gateway.%Connect("127.0.0.1", 55555)

    Set javaObj = ##class(packageName.EnterTestClass).%New(gateway)
    Set val = javaObj.enter()

    $$$TRACE(val)
    Quit $$$OK   
}

そして、メニュー「ツール」->「拡張機能」->「Java Gateway Assistant」を使用しました。Jar ファイルを選択し、フルパス、上記の値 127.0.0.1 および 555555 を指定し、「次へ」をクリックして、クラスを ckecked しました。インポートして「完了」をクリックします。

Studio の右側のツリー (ネームスペース ビュー) に、インポートされたクラスが表示されます。

その後、OnProcessInput を起動するときに (私の場合は tcp リクエストを送信して) 機能しました。

DAiMor には、私のエラーのいくつかについて助けていただき、ありがとうございます。また、メニューに私が書いた名前と正確に一致していない場合は、私の英語で申し訳ありません (私はベルギー人で、Studio と Ensemble のフランス語版に取り組んでいます)。

于 2017-01-12T15:59:21.477 に答える