notnoop / java-apns

Java Apple Push Notification Service Provider
notnoop.github.com/java-apns
BSD 3-Clause "New" or "Revised" License
1.8k stars 658 forks source link

Stack maybe over follow when sending lots of messages. #127

Open duetocode opened 10 years ago

duetocode commented 10 years ago

When use a single thread to sending about 10K~10K message, and randomly encounter StackOverFollowError.

We are using pooled connection:

ApnsServiceBuilder serviceBuilder = APNS.newService()
                .asPool(1)
                .withReconnectPolicy(ReconnectPolicy.Provided.EVERY_HALF_HOUR)
                .withCert(certificate, password);

And here are the stacktrace:

java.lang.StackOverflowError
    at sun.nio.cs.UTF_8$Decoder.decodeLoop(UTF_8.java:305)
    at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:544)
    at java.lang.StringCoding$StringDecoder.decode(StringCoding.java:140)
    at java.lang.StringCoding.decode(StringCoding.java:173)
    at java.lang.String.<init>(String.java:443)
    at java.lang.String.<init>(String.java:515)
    at com.notnoop.apns.EnhancedApnsNotification.toString(EnhancedApnsNotification.java:173)
    at org.slf4j.helpers.MessageFormatter.safeObjectAppend(MessageFormatter.java:304)
    at org.slf4j.helpers.MessageFormatter.deeplyAppendParameter(MessageFormatter.java:276)
    at org.slf4j.helpers.MessageFormatter.arrayFormat(MessageFormatter.java:230)
    at ch.qos.logback.classic.spi.LoggingEvent.<init>(LoggingEvent.java:112)
    at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:471)
    at ch.qos.logback.classic.Logger.filterAndLog_1(Logger.java:445)
    at ch.qos.logback.classic.Logger.debug(Logger.java:538)
    at com.notnoop.apns.internal.ApnsConnectionImpl.sendMessage(ApnsConnectionImpl.java:246)
    at com.notnoop.apns.internal.ApnsConnectionImpl.drainBuffer(ApnsConnectionImpl.java:273)
    at com.notnoop.apns.internal.ApnsConnectionImpl.sendMessage(ApnsConnectionImpl.java:249)
    at com.notnoop.apns.internal.ApnsConnectionImpl.drainBuffer(ApnsConnectionImpl.java:273)

... sendMessage And drainBuffer repeated about 5540 times.

    at com.notnoop.apns.internal.ApnsConnectionImpl.drainBuffer(ApnsConnectionImpl.java:273)
    at com.notnoop.apns.internal.ApnsConnectionImpl.sendMessage(ApnsConnectionImpl.java:249)
    at com.notnoop.apns.internal.ApnsConnectionImpl.sendMessage(ApnsConnectionImpl.java:230)
    at com.notnoop.apns.internal.ApnsServiceImpl.push(ApnsServiceImpl.java:46)
    at com.notnoop.apns.internal.AbstractApnsService.push(AbstractApnsService.java:56)
    at com.notnoop.apns.internal.ApnsServiceImpl.push(ApnsServiceImpl.java:36)
    at com.notnoop.apns.internal.AbstractApnsService.push(AbstractApnsService.java:45)

... our staffs
duetocode commented 10 years ago

Sorry for misktake.

froh42 commented 10 years ago

Caused by the drainbuffer/sendmessage recursion in ApnsConnectionImpl. This should have been an interation, java is no lisp.

froh42 commented 10 years ago

See Dante-Edge/java-apns@698f8fabc56e26f5cb471abcaced9d13df478b02