现在使用 PubNub 时遇到问题(java 对象)

Trouble using PubNub's herenow (java object)

我已将 Pubnub-4.0.0.jar 文件包含到我的 webroot 中。 (Pubnub-4.0.0.jar可以在这里下载:https://www.pubnub.com/docs/java/pubnub-java-sdk-v4

我正在尝试将“现在这里”java 代码添加到我的 coldfusion 项目中,但在这样做时遇到了一些麻烦。

java代码如下:

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) {

        }
});

我对应的Coldfusion代码如下:

<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#" >

我没有收到任何返回的错误。 我觉得我调用“hereNow”方法的方式不正确,或者我尝试显示结果的方式不正确。

任何人都可以就此提供任何帮助吗? 谢谢

看起来channels是方法名,不是结构体。 includeStateincludeUUIDs 也是如此。将它们作为链式方法调用,并传入预期的参数。

  • channels() 需要一个 CF 数组(即 java.util.List 对象)。
  • includeStateincludeUUIDs 需要一个简单的布尔值。

像这样的东西应该适用于前三 (3) 种方法:

<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>

.async() 方法有点不同,因为它需要某种类型的回调对象。不幸的是,它看起来像所有 callback classes are abstract. (I am not sure why. None of the callback classes contain an implementation, so they function more like an interface。)可悲的是,CF 中没有 abstract classes 的等价物。

抽象classes不能实例化,也不能与酷Dynamic Proxy Feature in CF10+. The dynamic proxy is a slick feature which allows you to substitute a CFC, for a custom java class. However, it is only supported for interfaces一起使用。由于 PNCallback 不是接口,因此确实无法避免编写扩展 PNCallback 的自定义 java class。

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
    }
}

编译后,将其添加到CFclass路径。然后您可以在 CF 中创建自定义 class 的实例并将其传递给 asynch() 方法:

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

Pubnub 为此提供了一个 REST API 调用。 https://s3.amazonaws.com/pubnub/sdk/RESTful+Documentation/index.html#presence-here-now-get 谢谢 Pubnub。