2016-06-06 10 views
1

Ich habe die Pubnub-4.0.0.jar-Datei in meine Webroot enthalten. (Pubnub-4.0.0.jar kann hier heruntergeladen werden: https://www.pubnub.com/docs/java/pubnub-java-sdk-v4)Probleme mit PubNub's herenow (Java-Objekt)

Ich versuche, die „HIER“ Java-Code in mein Projekt Coldfusion zu bekommen und ein paar Probleme habe dabei.

Der Java-Code ist wie folgt:

PNConfiguration pnConfiguration = new PNConfiguration(); 
pnConfiguration.setSubscribeKey("SubscribeKey") 
PubNub pubnub = new PubNub(pnConfiguration); 
pubNub.hereNow() 
    .channels(Arrays.asList("ch1", "ch2", "ch3")) // who is present on those channels? 
    .includeState(true) // include state with request (false by default) 
    .includeUUIDs(true) // if false, only shows occupancy count 
    .async(new PNCallback<PNHereNowResult>() { 
     @Override 
     public void onResponse(PNHereNowResult result, PNStatus status) { 

     } 
}); 

Mein entsprechenden Coldfusion-Code lautet wie folgt:

<cfobject type="java" class="com.pubnub.api.PNConfiguration" name="objPNConfiguration" > 
<cfset PNConfiguration = objPNConfiguration.init() > 
<cfset PNConfiguration.setSubscribeKey("SubscribeKey") > 
<cfobject type="java" class="com.pubnub.api.PubNub" name="objPubNub" > 
<cfset pubnub = objPubNub.init(PNConfiguration) > 
<cfset tmp = pubnub.hereNow({channels: "5A4B3B59-FA6A-F22A-404F18EFA8112508"}) > 
<cfdump var="#tmp#" > 

Ich erhalte keine Fehler zurückgegeben. Ich fühle, dass die Art und Weise, wie ich die "hereNow" -Methode anrufe, falsch ist oder die Art, in der ich versuche, die Ergebnisse anzuzeigen, falsch ist.

Kann jemand Hilfe in dieser Hinsicht geben? Danke

+0

Ich bin nicht sicher durch Ihre Frage, ob 'hereNow' in Ihrem Java-Code funktioniert (vorausgesetzt, es ist). Das PubNub ColdFusion SDK wurde seit langer Zeit nicht mehr aktualisiert und wird wahrscheinlich nicht aktualisiert (keine Nachfrage). Sie erhalten keine Fehler, aber bekommen Sie etwas in Ihrer Antwort, wie 0 Belegung?Wenn dies der Fall ist, müssen Sie nur die Anwesenheit Ihrer Schlüssel in Ihrem PubNub Admin Dashboard-Konto aktivieren. –

+0

Ich wusste nicht, dass es einen [ColdFusion-Wrapper] (https://github.com/pubnub/pubnub-api/tree/master/coldfusion) gab. @Steve - fragst du nur nach dem Java SDK? – Leigh

+0

Ja, ich frage nur nach dem Java SDK. Ich bekomme keine Fehler und bekomme auch keine Antwort. – Steve

Antwort

0

Es sieht aus wie channels ist ein Methodenname, keine Struktur. Das gleiche gilt für includeState und includeUUIDs. Nennen Sie sie als verkettete Methoden und übergeben Sie die erwarteten Parameter.

  • channels() erwartet einen CF-Array (dh java.util.List Objekt).
  • includeState und includeUUIDs erwarten einen einfachen booleschen Wert.

So etwas sollte für die ersten drei (3) Verfahren arbeiten:

<cfscript> 
config = createObject("java", "com.pubnub.api.PNConfiguration").init(); 
config.setSubscribeKey("SubscribeKey"); 
pubNub = createObject("java", "com.pubnub.api.PubNub").init(config); 

pubNub.hereNow() 
    .channels(["ch1", "ch2", "ch3"]) 
    .includeState(true) 
    .includeUUIDs(true) 
    .asynch(
     .... 
    ) ; 
</cfscript> 

Die .async() Methode ein wenig anders ist, dass sie irgendeine Art von Rückrufobjekt erwartet. Leider sieht es so aus, als wären alle callback classesabstract. (Ich bin nicht sicher, warum. Keine der Callback-Klassen enthalten eine Implementierung, so dass sie eher wie ein interface funktionieren.) Leider gibt es keine Entsprechung für abstract Klassen in CF.

Abstrakte Klassen können nicht instanziiert werden, noch können sie mit dem coolen Dynamic Proxy Feature in CF10 + verwendet werden. Der dynamische Proxy ist eine raffinierte Funktion, mit der Sie einen CFC für eine benutzerdefinierte Java-Klasse ersetzen können. Es wird jedoch nur für interfaces unterstützt. Da PNCallback keine Schnittstelle ist, gibt es wirklich keine Möglichkeit zu vermeiden, eine benutzerdefinierte Java-Klasse zu schreiben, die PNCallback erweitert.

package your.package.name; 

import com.pubnub.api.models.consumer.PNStatus; 
import com.pubnub.api.models.consumer.presence.PNHereNowResult ; 

public class YourCallbackClass extends PNCallback<PNHereNowResult> { 
    public void onResponse(PNHereNowResult result, PNStatus status) { 
     // do something with the result and status here 
    } 
} 

Nachdem Sie es kompiliert haben, fügen Sie es dem CF-Klassenpfad hinzu. Dann können Sie eine Instanz der benutzerdefinierten Klasse in CF erstellen und in die asynch() Methode übergeben:

</cfscript> 
// ..... 
yourCallback = createObject("java", "your.package.name.YourCallbackClass").init(); 
pubNub.hereNow() 
    .channels(["ch1", "ch2", "ch3"]) 
    .includeState(true) 
    .includeUUIDs(true) 
    .asynch(yourCallback); 
</cfscript> 
+0

Das Schreiben meiner eigenen Java-Klasse war nicht die Lösung, nach der ich gesucht habe, aber es klingt, als ob Sie richtig liegen könnten. Ich werde versuchen, dies als Lösung zu betrachten. Danke für deine Gedanken dazu. – Steve

+0

Ja, leider gibt es keine Entsprechung zu diesem Java-Code in CF. Ich bin wirklich nicht sicher, warum sie die Rückrufe "abstrakt" gemacht haben ... Da keine von ihnen irgendeine Code-Implementierung haben, funktionieren sie wirklich wie Schnittstellen. Wenn sie eigentlich * Schnittstellen wären, könnten Sie einfach den Dynamischen Proxy verwenden. Wenn es jedoch keine * concrete * -Klasse gibt, die das tut, was Sie benötigen (oder eine andere Methode, die keinen abstrakten Callback erfordert), können Sie eine benutzerdefinierte Java-Klasse wirklich nicht vermeiden. Haben Sie aus Neugierde den CF Rest Wrapper probiert? Nicht sicher, es funktioniert immer noch mit der neuesten Version, aber es ist einen Versuch wert. – Leigh

+0

Was hast du am Ende gemacht? Nur neugierig, wenn Sie irgendwelche Alternativen gefunden haben. – Leigh