---
title: JDK 1.7 之后的 APNS 收不到问题
date: '2013-04-22 15:20:06'
draft: false
summary: 当推送服务在升级 JDK 后出现“发送正常但客户端收不到”的问题时，真正要优先怀疑的往往不是业务逻辑，而是 SSL 协议栈这类底层依赖变化。
slug: jdk7-javapns-push-issue
syndication:
- platform: Weibo
  url: https://weibo.com/1648815335/ztkys0OAS
tags:
- java
- jdk
- apns
- ssl
topics:
- software-engineering
type: post
---

那次把 `JDK` 升到 `1.7` 之后，遇到一个很烦的问题：`Apple Push` 发送端看起来是正常的，但客户端就是收不到消息。

这类问题最麻烦的地方在于，表面现象非常像“业务逻辑有 bug”，但一路排查下来，系统和网络都没有明显异常，发送接口本身也没有直接报错。

最后我开始怀疑是不是 `JDK` 本身带来的变化，降级之后果然恢复正常。

当时使用的是 `javapns` 客户端，所以我初步的判断是：新版本 `JDK` 对 `SSL` 协议栈或相关实现做了调整，导致原有客户端库在兼容性上踩了坑。

这种排障过程对我最大的提醒是：一旦出现“发送成功但结果异常”的问题，不能只盯着业务层看。运行时升级、协议栈变化、第三方客户端库的兼容性，很多时候才是真正的根因入口。

后来我也把问题提给了 `javapns` 项目。像这种问题，本质上往往是三层耦合在一起：平台协议、运行时实现、客户端库封装。只看最上层现象，很容易误判。
