簡體   English   中英

Pubnub無法在Google App Engine(GAE)上使用

[英]Pubnub Not Working On Google App Engine (GAE)

我正在Google App Engine上創建一個Web應用程序,該應用程序使我可以訂閱Pubnub頻道,接收消息並將這些消息存儲到數據庫中。 我已將代碼上傳到Google App Engine,但在我查看GAE日志時似乎無法正常工作,它沒有更新。 我在Pubnub網站上的調試控制台上嘗試后,數據庫也未更新。 我很確定我的頻道名稱,訂閱和發布密鑰正確。 我從Pubnub Github Example獲取代碼。 希望這里的所有用戶都能幫助我找到並指出問題。 我對Pubnub還是陌生的,隨時可以提出建議。 非常感謝你。

我的代碼:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

import org.json.JSONArray;
import org.json.JSONObject;

import com.pubnub.api.Callback;
import com.pubnub.api.Pubnub;
import com.pubnub.api.PubnubException;
import com.yihwei95.model.appdata.AppData;

class Receiver implements Callback {
    public boolean successCallback(String channel, Object message) {
        final String JDBC_DRIVER = "com.mysql.jdbc.GoogleDriver";
        final String DB_URL = "jdbc:google:mysql"
                                    + "://****"
                                    + ":asia-northeast1"
                                    + ":****/****?user=****";   

        Connection conn = null;
        PreparedStatement prst = null;

        try {
            if (message instanceof JSONObject) {
                JSONObject obj = (JSONObject) message;
                AppData ad = new AppData();
                String email = obj.getString("email");
                ad.setEmail(email);
                String password = obj.getString("password");
                ad.setPassword(password);
                String token = obj.getString("token");
                ad.setToken(token);

                Class.forName(JDBC_DRIVER);
                conn = DriverManager.getConnection(DB_URL);
                String SQL = "INSERT INTO ****"
                            + "(email, password, token)"
                            + "VALUES(?, ? ,?)";
                prst = conn.prepareStatement(SQL);
                prst.setString(1, ad.getEmail());
                prst.setString(2, ad.getPassword());
                prst.setString(3, ad.getToken());
                prst.executeUpdate();
                prst.close();
                conn.close();
                //@SuppressWarnings("rawtypes")
                //Iterator keys = obj.keys();
                //while (keys.hasNext()) {
                    //System.out.print(obj.get(keys.next().toString())
                            //+ " ");
                //}
                //System.out.println();
            } 
            else if (message instanceof String) {
                String obj = (String) message;
                //System.out.print(obj + " ");
                //System.out.println();
            } 
            else if (message instanceof JSONArray) {
                JSONArray obj = (JSONArray) message;
                //System.out.print(obj.toString() + " ");
                //System.out.println();
            }
        } 
        catch (Exception e) {
            e.printStackTrace();
        }
        // Continue Listening?
        return true;
    }

    public void errorCallback(String channel, Object message) {
        //System.err.println("Channel:" + channel + "-"
                //+ message.toString());

    }

    public void connectCallback(String channel) {
        //System.out.println("Connected to channel :" + channel);
        //System.out.println("Waiting for message ...");
    }

    public void reconnectCallback(String channel) {
        //System.out.println("Reconnected to channel :" + channel);
    }

    public void disconnectCallback(String channel) {
        //System.out.println("Disconnected to channel :" + channel);
    }
}

public class Testing{
    static String subscribeKey = "****";
    static String publishKey = "****";
    static String channel = "****";
    static Pubnub pubnub = null;

    public Testing(){
        pubnub = new Pubnub(publishKey, subscribeKey);
        postAppData();
    }

    private static void postAppData(){
        try{
            pubnub.subscribe(channel, new Receiver());
        }
        catch(PubnubException pubnube){
            pubnube.printStackTrace();
            return;
        }   
    }
}

二手JAR

二手JAR

還是應該修改Web.XML文件?

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
    <servlet>
        <servlet-name>TestingGCP</servlet-name>
        <servlet-class>com.yihwei95.TestingGCPServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestingGCP</servlet-name>
        <url-pattern>/testinggcp</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

GAE和長期運行的操作/連接

GAE不允許您訂閱,因為它是長期運行的連接。 並且PubNub Java SDK v3已停產,因此建議您使用v4 SDK(仍然無法解決GAE /訂閱問題)。 應該在其他應用程序主機(如Heroku等)上運行。

不熟悉beantalk的細節,但只要它可以使您的連接保持打開狀態,它就可以正常工作。 我確實閱讀了有關使用beantalk部署Web應用程序的快速摘要,但是您不會在Web請求的上下文中使用PubNub訂閱,因為Web請求是短暫的。 您可以在Web請求中進行發布,但不進行訂閱。 訂閱可能會在您的客戶端應用程序(瀏覽器-使用JavaScript SDK)上執行。

UPDATE

在GAE中使用PubNub Java v4 SDK時 ,請確保在PNConfiguration實例中啟用它。 Java SDK是否可以在Google App Engine上運行嗎? KB文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM