2012-08-09 71 views
1

我已經在客戶端的服務器&上成功部署了GCM示例應用程序。我能夠成功註冊設備。但是,當我試圖將消息發送到設備,正在顯示以下異常在服務器日誌:實施Google雲消息傳遞時在Web服務器上的例外情況

Exception in thread "pool-1-thread-1" java.lang.IllegalArgumentException: argume 
nt cannot be null 
     at com.google.android.gcm.server.Sender.nonNull(Sender.java:553) 
     at com.google.android.gcm.server.Sender.getString(Sender.java:534) 
     at com.google.android.gcm.server.Sender.sendNoRetry(Sender.java:365) 
     at com.google.android.gcm.server.Sender.send(Sender.java:261) 
     at com.google.android.gcm.demo.server.SendAllMessagesServlet$1.run(SendA 
llMessagesServlet.java:119) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExec 
utor.java:886) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor 
.java:908) 
     at java.lang.Thread.run(Thread.java:662) 
Exception in thread "pool-1-thread-2" java.lang.IllegalArgumentException: argume 
nt cannot be null 
     at com.google.android.gcm.server.Sender.nonNull(Sender.java:553) 
     at com.google.android.gcm.server.Sender.getString(Sender.java:534) 
     at com.google.android.gcm.server.Sender.sendNoRetry(Sender.java:365) 
     at com.google.android.gcm.server.Sender.send(Sender.java:261) 
     at com.google.android.gcm.demo.server.SendAllMessagesServlet$1.run(SendA 
llMessagesServlet.java:119) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExec 
utor.java:886) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor 
.java:908) 
     at java.lang.Thread.run(Thread.java:662) 

在瀏覽器中,

下面的消息顯示,但設備亙古不接收任何消息由於例外。

異步發送1個播報文到2個設備

任何提示/建議將是有益的。

回答

3

我得到了完全相同的錯誤。查看Sender.java的源代碼,當發送者試圖通過HttpURLConnection.getErrorStream()來找出錯誤的性質時,這看起來就會發生。

if (status != 200) { 
    // Exception on the line below due to getErrorStream() returning null 
    responseBody = getString(conn.getErrorStream()); 
    logger.finest("JSON error response: " + responseBody); 
    throw new InvalidRequestException(status, responseBody); 
} 

在我的情況下,錯誤是越來越觸發由於GCM服務器返回401(我已經忘記了我是VPNed的工作,並沒有白列出的IP在我的谷歌API帳戶)。

您可能會從服務器獲得非200狀態。嘗試看看是什麼問題通過:

$ curl -D headers.txt --header "Authorization: key=$api_key" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send -d "{\"registration_ids\":[\"$registrationID\"]}" && cat headers.txt 

其中$ api_key是您的apiKey和$ registrationID是目標註冊ID。

發件人沒有正確處理這個事實是一個不同的問題,但我不確定它是否與gcm庫嘗試讀取錯誤的方式有關,或者它與jdk有關。 (1.6這裏)。這是非常奇怪的,因爲GCM文檔mention this scenario明確地被拋出。

根據該文檔,getErrorStream()將返回null:

如果沒有出現過錯誤,連接未連接或 服務器發送無用的數據。

  • 我們知道有一個錯誤
  • 我們知道有一個連接(401在我的情況被退回)
  • 我們知道服務器發送有用的數據(狀態碼= 200檢查!):

從未經授權的IP:

[[email protected] ~]$ curl -D headers.txt --header "Authorization: key=$api_key" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send -d "{\"registration_ids\":[\"$registrationID\"]}" && cat headers.txt 

<HTML> 
<HEAD> 
<TITLE>Unauthorized</TITLE> 
</HEAD> 
<BODY BGCOLOR="#FFFFFF" TEXT="#000000"> 
<H1>Unauthorized</H1> 
<H2>Error 401</H2> 
</BODY> 
</HTML> 
HTTP/1.1 401 Unauthorized 
Content-Type: text/html; charset=UTF-8 
Date: Tue, 14 Aug 2012 00:30:47 GMT 
Expires: Tue, 14 Aug 2012 00:30:47 GMT 
Cache-Control: private, max-age=0 
X-Content-Type-Options: nosniff 
X-Frame-Options: SAMEORIGIN 
X-XSS-Protection: 1; mode=block 
Server: GSE 
Transfer-Encoding: chunked 

編輯: 這現在已經進入了作爲一個問題來這裏的GCM項目:http://code.google.com/p/gcm/issues/detail?id=7

編輯: 的問題已解決,並應可在gcm.jar輔助類的下一個版本。

0

對發件人的參數不能爲空。如果您將空作爲參數傳遞給發件人,請檢入日誌。 例如,如果您有類似:

Sender sender = new Sender(businessLayer.Helper.getAndroidAPIkey()); 

如果由於某種原因businessLayer.Helper.getAndroidAPIkey()爲空,你會得到這個例外。

+0

如果您查看堆棧跟蹤,執行會一直髮送到sendNoRetry(),它在構造發件人之後調用(在調用send()之後調用)。如果您查看Sender.java,則「null」值將來自調用getErrorStream()而不是傳遞給發件人的參數。 – 2012-08-14 16:37:36