【问题标题】:Trouble using PubNub's herenow (java object)现在使用 PubNub 的麻烦(java 对象)
【发布时间】:2016-06-06 14:41:24
【问题描述】:

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

我正在尝试将“HERE NOW”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”方法的方式不正确,或者我尝试显示结果的方式不正确。

任何人都可以在这方面提供任何帮助吗? 谢谢

【问题讨论】:

  • 我不确定 hereNow 是否在您的 Java 代码中工作(假设是)。 PubNub ColdFusion SDK 很久没有更新了,估计也不会更新了(无需求)。您没有收到任何错误,但您在回复中是否收到任何信息,例如 0 Occupancy?如果是这样,那么您只需在 PubNub Admin Dashboard 帐户中的密钥上启用 Presence。
  • 我不知道有ColdFusion wrapper。 @Steve - 你只问 java sdk 吗?
  • 是的,我只询问 java SDK。我没有收到任何错误,也没有收到任何回复。

标签: java coldfusion pubnub


【解决方案1】:

看起来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 都是abstract。 (我不知道为什么。没有一个回调类包含实现,所以它们的功能更像interface。)遗憾的是,CF 中没有 abstract 类的等价物。

抽象类不能被实例化,也不能与 CF10+ 中酷炫的Dynamic Proxy Feature 一起使用。动态代理是一个巧妙的功能,它允许您将 CFC 替换为自定义 java 类。但是,它仅支持interfaces。因为PNCallback 不是一个接口,所以真的没有办法避免编写一个扩展PNCallback 的自定义java 类。

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

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

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

【讨论】:

  • 编写我自己的自定义 java 类不是我正在寻找的解决方案,但听起来你可能是正确的。我将尝试将此作为解决方案。感谢您对此的想法。
  • 是的,不幸的是,CF 中没有与该 java 代码等效的代码。我真的不确定他们为什么要进行回调abstract... 因为它们都没有任何代码实现,它们的功能确实像接口。如果它们实际上接口,您可以简单地使用动态代理。但是,除非有一个 concrete 类可以满足您的需要(或其他一些不需要抽象回调的方法),否则您确实无法避免自定义 java 类。出于好奇,您是否尝试过 CF Rest 包装器?不确定它是否仍然适用于最新版本,但值得一试。
  • 那么你最后做了什么?只是好奇你是否找到任何替代品。
  • Pubnub 为此提供了 REST API 调用。 s3.amazonaws.com/pubnub/sdk/RESTful+Documentation/…
  • 好的,在这种情况下肯定更好。你应该发布它和一个简短的代码 sn-p(如果你有的话),作为答案,这样它就更明显了。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多