Closed GoogleCodeExporter closed 9 years ago
The debugging message 'Notification sent' indicates.... the notification was
successfully sent.
Check your iPhone code.
Original comment by idb...@pugetworks.com
on 21 Jun 2011 at 9:12
[deleted comment]
Hi, I am having the same issue. Good Google (as I write, this thread is only 42
hours old). I give you some additional information and clarify the problem
(notification does not arrive, but even worse: server is stuck in
sendNotification
The Code looks something like that (actually almost the example):
String absCertName = getServletContext().getRealPath(relativeCertificateName);
log.debug("doPost():initializeConnection:" + appleHost + " " + applePort + " "
+ absCertName + " " + certificatePassword);
pushManager.initializeConnection(appleHost, applePort, absCertName,
certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);
log.debug("Connection initialized...");
pushManager.sendNotification(client, aPayLoad);
log.info("doPost(): message send with no of attempts: " +
pushManager.getRetryAttempts());
pushManager.stopConnection();
resp.getOutputStream().println(.....);
The log-output shows the following:
[23.06.2011 10:22:28] DEBUG de.me.pushserver.web.SendNotificationServlet -
doPost():initializeConnection:gateway.sandbox.push.apple.com 2195
/Volumes/projects/....../devPush.p12
[23.06.2011 10:22:28] DEBUG javapns.back.PushNotificationManager - Initializing
Connection to Host: [gateway.sandbox.push.apple.com] Port: [2195] with
KeyStorePath [/Volumes/projects/...../devPush.p12]/[PKCS12]
[23.06.2011 10:22:28] DEBUG javapns.back.SSLConnectionHelper - Instantiate
SSLConnectionHelper with Path to Keystore
[23.06.2011 10:22:28] DEBUG javapns.back.SSLConnectionHelper - Creating
SSLSocketFactory
[23.06.2011 10:22:28] DEBUG javapns.back.SSLConnectionHelper - Returning Push
SSLSocketFactory
[23.06.2011 10:22:28] DEBUG javapns.back.SSLConnectionHelper - Returning Push
SSLSocket
[23.06.2011 10:22:29] DEBUG de.me.pushserver.web.SendNotificationServlet -
Connection initialized...
[23.06.2011 10:22:29] DEBUG javapns.back.PushNotificationManager - Building Raw
message from deviceToken and payload
[23.06.2011 10:22:29] DEBUG javapns.back.PushNotificationManager - Attempting
to send Notification [{"aps":{"alert":"helo","badge":66}}]
[23.06.2011 10:22:29] DEBUG javapns.back.PushNotificationManager - Building Raw
message from deviceToken and payload
[23.06.2011 10:22:29] DEBUG javapns.back.PushNotificationManager - Flushing
[23.06.2011 10:22:29] DEBUG javapns.back.PushNotificationManager - Notification
sent
So I never see the the log-output
log.info("doPost(): message send with no of attempts: " +
pushManager.getRetryAttempts());
and I guess that the message
pushManager.sendNotification(client, aPayLoad);
does not return. I do not get the message on the phone either (but that is
follow-up problem). The server hangs in the message sendNotification
What version of the product are you using? On what operating system?
Lets see, some facts: I am on OSX 10.6.7, JDK 1.6.0_24 running within a
Glassfish 3 out of NetBeans 6.9.1
Libraries are exactly like stated in the wiki (added commons-logging for me):
WEB-INF/lib sb$ ls -1
bcprov-jdk16-1.45.jar
commons-io-1.4.jar
commons-lang-2.4.jar
commons-logging-1.1.jar
javapns-jdk16-168.jar
log4j-1.2.15.jar
Running the exact same code on Tomcat 6.0.18 and jdk1.6.0_24 and a new
OpenSolaris version, it crashes:
[23.06.2011 02:10:21] DEBUG de.me.pushserver.web.SendNotificationServlet -
doPost():initializeConnection:gateway.sandbox.push.apple.com 2195
/home/...../devPush.p12
[23.06.2011 02:10:21] DEBUG javapns.back.PushNotificationManager - Initializing
Connection to Host: [gateway.sandbox.push.apple.com] Port: [2195] with
KeyStorePath [/home...../devPush.p12]/[PKCS12]
[23.06.2011 02:10:21] DEBUG javapns.back.SSLConnectionHelper - Instantiate
SSLConnectionHelper with Path to Keystore
[23.06.2011 02:10:21] DEBUG javapns.back.SSLConnectionHelper - Creating
SSLSocketFactory
[23.06.2011 02:10:21] DEBUG javapns.back.SSLConnectionHelper - Returning Push
SSLSocketFactory
[23.06.2011 02:10:21] DEBUG javapns.back.SSLConnectionHelper - Returning Push
SSLSocket
[23.06.2011 02:10:21] WARN de.me.pushserver.web.SendNotificationServlet -
doPost(): got Throwable: java.net.ConnectException with message: Connection
refused
java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:529)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:559)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.<init>(SSLSocketImpl.java:360)
at com.sun.net.ssl.internal.ssl.SSLSocketFactoryImpl.createSocket(SSLSocketFactoryImpl.java:71)
at javapns.back.SSLConnectionHelper.getSSLSocket(Unknown Source)
at javapns.back.PushNotificationManager.initializeConnection(Unknown Source)
at de.me.pushserver.web.SendNotificationServlet.doPost(SendNotificationServlet.java:103)
Original comment by sebastia...@gmail.com
on 23 Jun 2011 at 9:19
I just want to be sure that it is not a classloader issue. Therefore I have
extracted the code into a simple CLI program for testing and I get the same
behavior on both systems. Furthermore, I have tried another framework to be
sure that the apple certificates are correct (java-apns) and it runs on the
OSX, but not on the Solaris Server.
I am going to invest a little more how the connections are opened to get a
better understanding.
Original comment by sebastia...@gmail.com
on 24 Jun 2011 at 9:01
I'm having the same issue with the working example CLI example in the wiki. It
hangs on sendNotification and the log says DEBUG
javapns.back.PushNotificationManager - Notification sent but the device
receives no notification.
How did you generate your key? javapns seens to require the .p12 key, whereas
other implementations (ex: one I found in PHP) wants a .pem.
Original comment by ben%unfi...@gtempaccount.com
on 24 Jun 2011 at 2:18
The key was generated the way stated in
http://code.google.com/p/javapns/wiki/GetAPNSCertificate
But I am sure that the .p12 is correct (works with other framework (at least on
OSX)
Original comment by sebastia...@gmail.com
on 24 Jun 2011 at 2:48
That's also the way I generated mine.
I did a quick test with a simple PHP script by following
http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part
-12 and generated a .pem from my certificate and key and I'm able to send push
notifications. I can also send them from a Ruby script with the same .pem.
Therefore, I assume my cert is ok and my ports are all open. I'm have no idea
why it hangs on sendNotification.
Original comment by ben%unfi...@gtempaccount.com
on 24 Jun 2011 at 2:55
I tested on another opensolaris vm (may be a little older but with same jdk
version. there, it works. I'm going to both truss outputs and try to compare....
Original comment by sebastia...@gmail.com
on 24 Jun 2011 at 4:30
same issue here, but in the ios debugger console, i saw the
didReceiveRemoteNotification was triggered, but the information inside were as
below
key: aps, value : {}
Original comment by jinmiss...@gmail.com
on 27 Jun 2011 at 10:53
tested on 16.161 with the same code was working...
Original comment by jinmiss...@gmail.com
on 28 Jun 2011 at 2:07
Same problem for me with release 16.168
Works with 16.161
Original comment by francois...@gmail.com
on 29 Jun 2011 at 9:44
Hi,
I invested a little more in the CLI. Here is a stacktrace while the program
hangs:
Full thread dump Java HotSpot(TM) 64-Bit Server VM (19.1-b02-334 mixed mode):
"Poller SunPKCS11-Darwin" daemon prio=1 tid=102a7f800 nid=0x10a50c000 waiting
on condition [10a50b000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at sun.security.pkcs11.SunPKCS11$TokenPoller.run(SunPKCS11.java:692)
at java.lang.Thread.run(Thread.java:680)
"Low Memory Detector" daemon prio=5 tid=1018a7800 nid=0x109f13000 runnable
[00000000]
java.lang.Thread.State: RUNNABLE
"CompilerThread1" daemon prio=9 tid=1018a7000 nid=0x109e10000 waiting on
condition [00000000]
java.lang.Thread.State: RUNNABLE
"CompilerThread0" daemon prio=9 tid=1018a6000 nid=0x109d0d000 waiting on
condition [00000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" daemon prio=9 tid=1018a5800 nid=0x109c0a000 waiting on
condition [00000000]
java.lang.Thread.State: RUNNABLE
"Surrogate Locker Thread (CMS)" daemon prio=5 tid=1018a4800 nid=0x109b07000
waiting on condition [00000000]
java.lang.Thread.State: RUNNABLE
"Finalizer" daemon prio=8 tid=10189c000 nid=0x1097fc000 in Object.wait()
[1097fb000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <7f44e0860> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
- locked <7f44e0860> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
"Reference Handler" daemon prio=10 tid=10189b000 nid=0x1096f9000 in
Object.wait() [1096f8000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <7f44e0878> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:485)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
- locked <7f44e0878> (a java.lang.ref.Reference$Lock)
"main" prio=5 tid=101801000 nid=0x100501000 runnable [100500000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:293)
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:331)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:798)
- locked <7f458cca0> (a java.lang.Object)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:755)
at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:75)
- locked <7f40b9128> (a com.sun.net.ssl.internal.ssl.AppInputStream)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
- locked <7f40b9110> (a java.io.InputStreamReader)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
- locked <7f40b9110> (a java.io.InputStreamReader)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at javapns.back.PushNotificationManager.sendNotification(Unknown Source)
at PushTest.main(PushTest.java:61)
"VM Thread" prio=9 tid=101896800 nid=0x1095f6000 runnable
"Gang worker#0 (Parallel GC Threads)" prio=9 tid=101802800 nid=0x102201000
runnable
"Gang worker#1 (Parallel GC Threads)" prio=9 tid=101803000 nid=0x102304000
runnable
"Concurrent Mark-Sweep GC Thread" prio=9 tid=10184d800 nid=0x109302000 runnable
"VM Periodic Task Thread" prio=10 tid=1018b9800 nid=0x10a016000 waiting on
condition
"Exception Catcher Thread" prio=10 tid=101801800 nid=0x10176a000 runnable
JNI global references: 1472
Heap
par new generation total 19136K, used 4576K [7f3000000, 7f44c0000, 7f44c0000)
eden space 17024K, 22% used [7f3000000, 7f33ab588, 7f40a0000)
from space 2112K, 38% used [7f40a0000, 7f416ce08, 7f42b0000)
to space 2112K, 0% used [7f42b0000, 7f42b0000, 7f44c0000)
concurrent mark-sweep generation total 63872K, used 4381K [7f44c0000, 7f8320000, 7fae00000)
concurrent-mark-sweep perm gen total 21248K, used 8646K [7fae00000, 7fc2c0000, 800000000)
I believe the most important lines are these:
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at javapns.back.PushNotificationManager.sendNotification(Unknown Source)
Therefore I enabled logging
[29.06.2011 17:44:38] DEBUG javapns.back.DeviceFactory - Adding badge [66]
[29.06.2011 17:44:38] DEBUG javapns.back.PushNotificationManager - Adding Token
[xxx] to Device [iPhone]
[29.06.2011 17:44:38] DEBUG javapns.back.DeviceFactory - Get DeviceFactory
Instance
[29.06.2011 17:44:38] DEBUG javapns.back.DeviceFactory - Adding Token [xxx] to
Device [iPhone]
[29.06.2011 17:44:38] DEBUG javapns.back.PushNotificationManager - Getting
Token from Device [iPhone]
[29.06.2011 17:44:38] DEBUG javapns.back.DeviceFactory - Get DeviceFactory
Instance
[29.06.2011 17:44:38] DEBUG javapns.back.DeviceFactory - Getting Token from
Device [iPhone]
[29.06.2011 17:44:38] DEBUG javapns.back.PushNotificationManager - Getting
Token from Device [iPhone]
[29.06.2011 17:44:38] DEBUG javapns.back.DeviceFactory - Get DeviceFactory
Instance
[29.06.2011 17:44:38] DEBUG javapns.back.DeviceFactory - Getting Token from
Device [iPhone]
[29.06.2011 17:44:38] DEBUG javapns.back.PushNotificationManager - Initializing
Connection to Host: [gateway.sandbox.push.apple.com] Port: [2195] with
KeyStorePath [xxx.p12]/[PKCS12]
[29.06.2011 17:44:38] DEBUG javapns.back.SSLConnectionHelper - Instantiate
SSLConnectionHelper with Path to Keystore
[29.06.2011 17:44:38] DEBUG javapns.back.SSLConnectionHelper - Creating
SSLSocketFactory
[29.06.2011 17:44:38] DEBUG javapns.back.SSLConnectionHelper - Returning Push
SSLSocketFactory
[29.06.2011 17:44:38] DEBUG javapns.back.SSLConnectionHelper - Returning Push
SSLSocket
[29.06.2011 17:44:39] DEBUG javapns.back.PushNotificationManager - Building Raw
message from deviceToken and payload
[29.06.2011 17:44:39] DEBUG javapns.back.PushNotificationManager - Attempting
to send Notification [{"aps":{"badge":66}}]
[29.06.2011 17:44:39] DEBUG javapns.back.PushNotificationManager - Building Raw
message from deviceToken and payload
[29.06.2011 17:44:40] DEBUG javapns.back.PushNotificationManager - Flushing
[29.06.2011 17:44:40] DEBUG javapns.back.PushNotificationManager - Notification
sent
As we see, the last log-entry is "Notification sent".
Therefore, I have looked at the code (with diff):
http://code.google.com/p/javapns/source/diff?spec=svn158&old=110&r=153&format=si
de&path=%2Ftrunk%2Fsrc%2Fjavapns%2Fback%2FPushNotificationManager.java
It hangs in line
161: logger.debug( "In: [" + in.readLine() + "]" );
The BufferedReader has just been introduced. I believe mainly to read the
response for better error detection. I still don't know why it hangs. I could
imagine the following:
- the response data does not contain a newline (carriage return), therefore
(maybe only on some plattforms (or plattform versions) th readLine()-Method on
a socket might not return (How should the response look like?)
- different behavior on different OS for Socket (or SSLSocket)
I guess it would be a good idea, to simple use read()-Method since the response
is only used for informational output (btw: the use of System.out.println is
not really good for any productive usage because you write lots of data to a
file which can not be rotated and the JVM needs to be restarted (once in a
while before your filesystem runs out of space) which means a downtime....)
I know, I should fix that myself instead of crying, but I don't want to get
into that topic.
Original comment by sebastia...@gmail.com
on 29 Jun 2011 at 4:14
Hi, I just started working with this project yesterday and ran into the same
issue. sebastia, you right, i checked the apple documentation, if the request
was successful, no output is sent back. Furthermore the connection is not
severed as apple expects providers to re-use these connection. It would
actually be much better if they returned anything on success, the code would
simpler to always expect something, but Apple clearly designed this for very
high volume and throughput (i can only imagine how many message someone like
ESPN sends at the end of a big game)
The code probably needs to be re-factored to operate in a more asynchronous
manner, a run loop that alternates sending messages from a local queue (like a
synchronized linked list) and checking if data is available to be read from
apple (and call back an error handler). The binary format has a unique
identifier (which is hard coded right now to "ap") to correlate failures which
indicates that the response may not be immediate.
Original comment by digital...@gmail.com
on 1 Jul 2011 at 2:23
Same here.
Just started using the library and facing such an issue.
Anyway, before the code starts waiting for anything to read in the input
socket, it should have sent the notification, right?
Therefore, even if the library needs to be refactored and is not usable at all
at the moment, do you receive any notification on your device? I don't :(
Thanks,
Luca
Original comment by dnt.l...@gmail.com
on 6 Jul 2011 at 11:16
Luca, I'm using 16.161 which is working fine for me right now. Its not
checking for failures, but I don't really need that functionality right now
Original comment by dan.cunn...@gmail.com
on 12 Jul 2011 at 4:54
same here, program hangs at sendNotification(client, payload) when using 16.168
switched to 16.161 and got the notifications
thank you guys!
Original comment by alan...@gmail.com
on 14 Jul 2011 at 2:34
Has this issue been resolved for 16.168 becasue its happening to me as well.
Original comment by sguerr...@gmail.com
on 24 Jul 2011 at 7:26
The issue stems from the following funtion:
public void sendNotification(Device device, PayLoad payload)
It seems that the bufferedreader has NULL
BufferedReader in = new BufferedReader( new InputStreamReader(
this.socket.getInputStream() ) );
So when this portion of the code gets hit it just hangs there in endless loop
logger.debug( "In: [" + in.readLine() + "]" );
This output is [null]
So then right after then the loops get executed:
while ( ! this.socket.isInputShutdown() ) {
while( in.ready() ) {
logger.debug("ready now");
logger.debug(in.readLine());
System.out.println( this.socket.getInputStream().read() );
}
}
The code enters the first while loop and waits for the BufferedReader in to be
ready
and just keeps waiting..... ad that is your hanging
Original comment by sguerr...@gmail.com
on 24 Jul 2011 at 8:58
I removed the in.readLine debugging and most of the println(s).. some were
converted to logger statements.
Thank you for pointing this out.
Original comment by idbill.p...@gmail.com
on 25 Jul 2011 at 9:44
Question: I get the desires output
Setting up Push notification
Payload setup successfull.
{"aps":{"badge":66}}
iPhone UDID taken.
Token: 2ed202ac08ea9033665e853a3dc8bc4c5e78f7a6cf8d55910df230567037dcc4
Client setup successfull.
Connection initialized...
Message sent!
# of attempts: 3
done
But I never get a notification on the actual device! Does anyone have a
solution for this?
Sergio
Original comment by sguerr...@gmail.com
on 26 Jul 2011 at 3:43
I was using 16-169 version and had exactly same prob,
after looking all the comments above I tried 16-165 version
It worked and no stucking at all
got normal output as below and notification on device!!
Client setup successfull.
Connection initialized...
Message sent!
# of attempts: 3
done
What's new in 16-169 which is not in 16-165??
Original comment by nadeem.k...@gmail.com
on 9 Aug 2011 at 7:36
Yes, me too.
I encountered the problem sometimes, by 16-165.
And I upgraded to 16-169, the problem become more frequent.
So, I just fallback to 16-165 now.
But the problem still exists.
Original comment by janchan...@gmail.com
on 10 Aug 2011 at 12:13
Regarding the issue in 16-169 with notifications that appear to be sent but
never actually make it to the device, revision r153 introduced a bug in the
PushNotificationManager's sendNotification method which causes the library to
ignore actual Payloads it is given and instead try to push a blank payload (the
sendNotification method actually creates a new Payload() object and pushes that
one). I'm guessing that some temporary test code was committed indadvertedly.
A fix has been applied to the 2.0 branch. Since I'm only working in that
branch, I will let other developers fix this in the trunk...
As for the issue with the library getting stuck in the sendNotification()
method, I have disabled (in 2.0) the code that attempts to drain data from the
socket immediately after the notification has actually been sent, and now
everything seems to be pushing fine. Again, I'll let other developers fix this
in the trunk... but if you need it fast, the fix is in the "javapns2" branch.
Original comment by sype...@gmail.com
on 31 Aug 2011 at 10:04
Java Exception: java.net.ConnectException: Connection refused: connect: during
call of javapns.back.PushNotificationManager.initializeConnection. (2,763)
IP_JAVA_TEST.MAIN.GBL.default.1900-01-01.Step01.OnExecute PCPC:1315
Statement:10
I am getting this error, I am inovking the java code from peoplecode,
Peoplecode has native language support to java. Certificate is *.p12 file and
it is correct with proper password. Port on the system is opened correctly for
connection.
Please help to solve this issues
Original comment by ganesh....@gmail.com
on 7 Sep 2011 at 10:59
As per comment c23, I am closing the issue as Fixed in 2.0.
ganesh.mvj, you seem to be reporting a different issue.... please create a new
issue if that is the case. Thanks!
Original comment by sype...@gmail.com
on 7 Sep 2011 at 4:22
Original issue reported on code.google.com by
ankurchh...@gmail.com
on 21 Jun 2011 at 1:38