Frage

würde Ich mag bekommen Windows Vista-Suchdienst direkt abfragen (oder indirekt) von Java.

Ich weiß, es möglich ist, die Suche-ms abgefragt werden: Protokoll, aber ich möchte das Ergebnis innerhalb der App konsumieren

.

ich gefunden habe gute Informationen in dem Windows Search API aber keine im Zusammenhang mit Java.

Ich würde die Antwort als angenommen markieren, die auf nützliche und definitive Informationen liefern, wie dies zu erreichen.

Vielen Dank im Voraus.

Bearbeiten

Hat jemand eine JACOB Probe, bevor ich dies als angenommen markieren? :)

War es hilfreich?

Lösung

Sie können an einem der Java-COM Integrationstechnologien zu suchen. Ich habe persönlich mit JACOB (Java COM-Brücke) gearbeitet:

Welche recht umständlich war (man denke ausschließlich mit Reflexion arbeiten), aber bekam den Job für mich getan (Quick Proof of Concept, MapPoint aus Java zugreifen).

Die einzige andere solche Technologie mir bewusst bin, ist Jawin, aber ich habe keine persönliche Erfahrung mit ihm:

Update 2009.04.26: Nur für das Heck von ihm, habe ich mehr Forschung in Microsoft Windows Search, und fand eine einfache Möglichkeit, mit ihm über OLE DB zu integrieren. Hier einige Code, den ich als Proof of Concept schrieb:

public static void main(String[] args) {
    DispatchPtr connection = null;
    DispatchPtr results = null;
    try {
        Ole32.CoInitialize();
        connection = new DispatchPtr("ADODB.Connection");
        connection.invoke("Open",
            "Provider=Search.CollatorDSO;" +
            "Extended Properties='Application=Windows';");
        results = (DispatchPtr)connection.invoke("Execute",
            "select System.Title, System.Comment, System.ItemName, System.ItemUrl, System.FileExtension, System.ItemDate, System.MimeType " +
            "from SystemIndex " +
            "where contains('Foo')");
        int count = 0;
        while(!((Boolean)results.get("EOF")).booleanValue()) {
            ++ count;
            DispatchPtr fields = (DispatchPtr)results.get("Fields");
            int numFields = ((Integer)fields.get("Count")).intValue();

            for (int i = 0; i < numFields; ++ i) {
                DispatchPtr item =
                    (DispatchPtr)fields.get("Item", new Integer(i));
                System.out.println(
                    item.get("Name") + ": " + item.get("Value"));
            }
            System.out.println();
            results.invoke("MoveNext");
        }
        System.out.println("\nCount:" + count);
    } catch (COMException e) {
        e.printStackTrace();
    } finally {
        try {
            results.invoke("Close");
        } catch (COMException e) {
            e.printStackTrace();
        }
        try {
            connection.invoke("Close");
        } catch (COMException e) {
            e.printStackTrace();
        }
        try {
            Ole32.CoUninitialize();
        } catch (COMException e) {
            e.printStackTrace();
        }
    }
}

Um dies zu kompilieren, müssen Sie sicherstellen, dass die JAWIN JAR in Ihrem Classpath ist, und dass jawin.dll ist in Ihrer Pfad (oder java.library.path Systemeigenschaft). Dieser Code öffnet einfach eine ADO-Verbindung zum lokalen Windows-Desktop Search-Index, Abfragen für Dokumente mit dem Stichwort „Foo“ und ein paar wichtigen Eigenschaften auf den resultierenden Dokumenten ausdrucken.

Lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben, oder müssen mir etwas klären.

Update 2009.04.27: Ich habe versucht, die gleiche Sache in JACOB Umsetzung als auch, und wird einige Benchmarks tun Performance-Unterschiede zwischen den beiden zu vergleichen. Ich kann etwas tun, ist falsch in JACOB sein, aber es scheint konsequent zu 10x mehr Speicher. Ich werde auch auf einer JCOM und com4j Implementierung arbeiten, wenn ich etwas Zeit habe, und versuche, ein paar Macken, um herauszufinden, dass ich irgendwo auf den Mangel an Thread-Sicherheit ist aufgrund glauben. Ich kann sogar eine JNI basierte Lösung versuchen. Ich erwarte, dass in 6-8 Wochen mit allem, was getan wird.

Update 2009.04.28: Dies ist nur ein Update für diejenigen, die folgenden und neugierig habe. Stellt sich heraus, es gibt keine Threadingprobleme, sind ich nur meine Datenbankressourcen schließen musste explizit, werden vermutlich gepoolt die OLE DB-Verbindungen, da auf OS-Ebene (ich wahrscheinlich die Anschlüsse haben sollte sowieso geschlossen ...). Ich glaube nicht, dass ich kein weiteres Updates zu dieser sein. Lassen Sie mich wissen, ob jemand in irgendwelche Probleme mit dieser ausgeführt wird.

Update 05.01.2009: Hinzugefügt JACOB Beispiel pro Oscar Anfrage erhältlich. Dies geht durch die exakt gleiche Abfolge von Anrufen von einer COM-Perspektive, mit JACOB nur. Es stimmt zwar JACOB ist viel mehr aktiv in der letzten Zeit gearbeitet hat, merke ich auch, dass es ein ziemlich Speicher Schwein (10x so viel Speicher wie die Jawin Version verwendet)

public static void main(String[] args) {
    Dispatch connection = null;
    Dispatch results = null;

    try {
        connection = new Dispatch("ADODB.Connection");
        Dispatch.call(connection, "Open",
            "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';");
        results = Dispatch.call(connection, "Execute",
            "select System.Title, System.Comment, System.ItemName, System.ItemUrl, System.FileExtension, System.ItemDate, System.MimeType " +
            "from SystemIndex " +
            "where contains('Foo')").toDispatch();
        int count = 0;
        while(!Dispatch.get(results, "EOF").getBoolean()) {
            ++ count;
            Dispatch fields = Dispatch.get(results, "Fields").toDispatch();
            int numFields = Dispatch.get(fields, "Count").getInt();

            for (int i = 0; i < numFields; ++ i) {
                Dispatch item =
                    Dispatch.call(fields, "Item", new Integer(i)).
                    toDispatch();
                System.out.println(
                    Dispatch.get(item, "Name") + ": " +
                    Dispatch.get(item, "Value"));
            }
            System.out.println();
            Dispatch.call(results, "MoveNext");
        }
    } finally {
        try {
            Dispatch.call(results, "Close");
        } catch (JacobException e) {
            e.printStackTrace();
        }
        try {
            Dispatch.call(connection, "Close");
        } catch (JacobException e) {
            e.printStackTrace();
        }
    }
}

Andere Tipps

Wie einig Beiträge hier vorschlagen, können Sie zwischen Java überbrücken und .NET oder COM mit kommerziellem oder freien Frameworks wie JACOB, JNBridge, J-Integra etc .. Eigentlich hatte ich eine Erfahrung mit einem dieser Dritten (ein teures :-)) und ich muss sagen, ich werde mein Bestes tun Wiederholung dieser Fehler in Zukunft zu vermeiden. Der Grund dafür ist, dass es viele „Voodoo“ Sachen beinhaltet kann man nicht wirklich debuggen, ist es sehr kompliziert ist, zu verstehen, was das Problem ist, wenn etwas schief geht.

Die Lösung würde ich vorschlagen, Sie zu implementieren, ist eine einfache .NET-Anwendung zu erstellen, die die tatsächlichen Anrufe an die Windows Search API macht. Nach dem Handeln Sie so, benötigen Sie einen Kommunikationskanal zwischen dieser Komponente und Java-Code zu etablieren. Dies kann auf verschiedene Weise erfolgen, beispielsweise durch Messaging zu einem kleinen DB, die Ihre Anwendung in regelmäßigen Abständen ziehen wird. Oder registrieren Sie diese Komponente auf dem Rechner IIS (falls vorhanden) und setzt einfach WS-API, mit ihm zu kommunizieren.

Ich weiß, dass es umständlich klingen, aber die klaren Vorteile sind: a) kommunizieren Sie mit der Windows-Suche API mit der Sprache, die es versteht (.NET oder COM), b) Sie alle Anwendungspfade steuern

.

Gibt es Gründe, warum Sie nicht nur Runtime.exec() nutzen könnten über search-ms abzufragen und die BufferedReader mit dem Ergebnis des Befehls lesen? Zum Beispiel:

public class ExecTest {
    public static void main(String[] args) throws IOException {
        Process result = Runtime.getRuntime().exec("search-ms:query=microsoft&");

        BufferedReader output = new BufferedReader(new InputStreamReader(result.getInputStream()));
        StringBuffer outputSB = new StringBuffer(40000);
        String s = null;

        while ((s = output.readLine()) != null) {
            outputSB.append(s + "\n");
            System.out.println(s);
        }

        String result = output.toString();
    }
}

Es gibt mehrere Bibliotheken gibt für COM-Objekte aus Java aufrufen, sind einige Open-Source (aber ihre Lernkurve ist höher) einige sind Closed-Source und haben eine schnellere Lernkurve. Eine geschlossene Quell Beispiel ist EZCom . Die kommerziell diejenigen neigen dazu, auf Aufruf java von Fenstern zu konzentrieren als auch, was ich nie in Open-Source gesehen habe.

In Ihrem Fall, was ich würde Ihnen vorschlagen zu tun ist vorne der Anruf in Ihrer eigenen .NET-Klasse (ich verwende C # erraten, wie die am nächsten Java ist in den umstrittenen J #, ohne sich), und konzentrieren sich darauf, die Interoperabilität mit der .NET-dLL. Auf diese Weise der Windows-Programmierung wird einfacher, und die Schnittstelle zwischen Windows und Java ist einfacher.

Wenn Sie suchen, wie eine Java-com-Bibliothek verwendet, ist die MSDN die falsche Stelle. Aber die MSDN wird Ihnen helfen, schreiben, was Sie aus .NET benötigen, und dann Blick auf die COM-Bibliothek Tutorials über die ein oder zwei Methoden aufrufen Sie von Ihrer .NET-Objekte benötigen.

EDIT:

die Diskussion in den Antworten gegeben über einen Web-Service verwenden, können Sie (und wahrscheinlich mehr Glück haben) eine kleine .NET App erstellen, die eher einen eingebetteten Java-Web-Server aufruft, als versuchen .NET den eingebetteten Web-Service zu machen und haben java die Verbraucher des Anrufs sein. Für einen integrierten Webserver, meine Forschung zeigte Winstone gut sein. Nicht das kleinste, aber ist viel flexibler.

Die Art und Weise, dass an der Arbeit zu bekommen, ist den .NET-App von Java zu starten, und hat den .NET-App den Webdienst auf einem Timer Anruf oder eine Schleife, um zu sehen, ob es eine Anforderung ist, und wenn es, Verfahren sie und die Antwort senden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top