ALPN 回调被丢弃:SPDY 和 HTTP/2 被禁用。 alpn-boot 在引导类路径上吗?
Posted
技术标签:
【中文标题】ALPN 回调被丢弃:SPDY 和 HTTP/2 被禁用。 alpn-boot 在引导类路径上吗?【英文标题】:ALPN callback dropped: SPDY and HTTP/2 are disabled. Is alpn-boot on the boot class path? 【发布时间】:2019-09-10 07:20:17 【问题描述】:尝试让 Apple 推送通知与我的 Spring Boot 项目一起使用。
我正在使用这个apns-http2
发送推送通知。从他们的 GitGub 页面:
注意:确保你有 Jetty 的 ALPN JAR(OkHttp 需要它) 你的引导类路径。浏览此处获取更多信息。这是必需的 直到 Java 9 发布,因为 Java 8 没有原生支持 HTTP/2。
所以我添加了 vm 选项
Xbootclasspath/p:/Users/sarath/.m2/repository/org/mortbay/jetty/alpn/alpn-boot/8.1.9.v20160720//alpn-boot-8.1.9.v20160720.jar
在 Intellij 中运行配置,一切正常。我正在收到推送通知。
但是当我将战争部署到 tomcat 并尝试发送推送通知时,我收到了错误:
20-Apr-2019 13:08:33.400 INFO [OkHttp https://api.development.push.apple.com/3/device/A704797F6E1E284FB081630184A26755B59593715E1CD543483C2136CE24D4FD] okhttp3.internal.Platform$JdkWithJettyBootPlatform.getSelectedProtocol ALPN callback dropped: SPDY and HTTP/2 are disabled. Is alpn-boot on the boot class path?
20-Apr-2019 13:08:34.935 INFO [OkHttp https://api.development.push.apple.com/3/device/A704797F6E1E284FB081630184A26755B59593715E1CD543483C2136CE24D4FD] okhttp3.internal.Platform$JdkWithJettyBootPlatform.getSelectedProtocol ALPN callback dropped: SPDY and HTTP/2 are disabled. Is alpn-boot on the boot class path?
20-Apr-2019 13:08:36.588 INFO [OkHttp https://api.development.push.apple.com/3/device/A704797F6E1E284FB081630184A26755B59593715E1CD543483C2136CE24D4FD] okhttp3.internal.Platform$JdkWithJettyBootPlatform.getSelectedProtocol ALPN callback dropped: SPDY and HTTP/2 are disabled. Is alpn-boot on the boot class path?
20-Apr-2019 13:08:38.109 INFO [OkHttp https://api.development.push.apple.com/3/device/A704797F6E1E284FB081630184A26755B59593715E1CD543483C2136CE24D4FD] okhttp3.internal.Platform$JdkWithJettyBootPlatform.getSelectedProtocol ALPN callback dropped: SPDY and HTTP/2 are disabled. Is alpn-boot on the boot class path?
failure: NotificationResponseerror=null, httpStatusCode=-1, responseBody='null', cause=java.io.IOException: unexpected end of stream on okhttp3.Address@d60ab6f0
我不确定如何在引导类路径上设置 alpn-boot。我尝试执行
java -Xbootclasspath/p:/Users/sarath/.m2/repository/org/mortbay/jetty/alpn/alpn-boot/8.1.9.v20160720/alpn-boot-8.1.9.v20160720.jar
从命令提示符。但这仅显示一些 Java 帮助命令。不知道jar是否真的添加到了引导类路径中。
我也尝试使用 maven-surefire-plugin,就像它说的 here。但仍然出现同样的错误。
这是我的 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.cinch</groupId>
<artifactId>gch</artifactId>
<version>2.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.cinch.gch</groupId>
<artifactId>apn</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>
<name>apn</name>
<description>Contains push notification services</description>
<properties>
<java.version>1.8</java.version>
<alpn-boot-version>8.1.9.v20160720</alpn-boot-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>com.cinch.gch</groupId>
<artifactId>core</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.cinch</groupId>
<artifactId>gch-cache</artifactId>
</dependency>
<dependency>
<groupId>org.mortbay.jetty.alpn</groupId>
<artifactId>alpn-boot</artifactId>
<version>$alpn-boot-version</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.clevertap.apns</groupId>
<artifactId>apns-http2</artifactId>
<version>1.0.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>
-Xbootclasspath/p:/Users/sarath/.m2/repository/org/mortbay/jetty/alpn/alpn-boot/$alpn-boot-version/alpn-boot-$alpn-boot-version.jar
</argLine>
</configuration>
</plugin>
</plugins>
<finalName>gch-apn</finalName>
</build>
</project>
我尝试了很多其他方法,但似乎没有任何效果。
【问题讨论】:
您可以将 alpn-boot 添加到 Tomcat 的 lib 文件夹或修改catalina.properties
文件以包含 jar 文件。在 tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html 上查看其类加载器层次结构中的 Tomcats 文档
只是好奇——如果您使用的是SpringBoot
,那么为什么要构建war
并部署到Tomcat
? SpringBoot 允许将所有内容捆绑到 fat jar 中(即 Tomcat 将被捆绑)并运行 java -jar your_fat.jar
@ug_ 我已经尝试过了。不工作。它显示了相同的流消息意外结束
@AlexanderPavlov 我们已经在生产环境中部署了 tomcat 服务器,所有应用程序都部署在那里。
如果它必须在引导路径上,那么你必须把它放在某个地方,并在 catalina.bat/.sh
的 java 命令行参数中添加 -Xbootclasspath
选项
【参考方案1】:
正如 AlexanderPavlov 在 cmets 中指出的那样。
如果它必须在引导路径上,那么你必须把它放在某个地方并添加 catalina.bat/.sh 中 java 命令行参数的 -Xbootclasspath 选项
我在 Tomcat_Home/bin/ 中创建了一个名为 setenv.sh 的文件
setenv.sh
export CATALINA_OPTS="-Xbootclasspath/p:/Users/sarath/.m2/repository/org/mortbay/jetty/alpn/alpn-boot/8.1.9.v20160720//alpn-boot-8.1.9.v20160720.jar"
catalina.bat/.sh 会自动读取 setenv.sh(如果存在)。
【讨论】:
以上是关于ALPN 回调被丢弃:SPDY 和 HTTP/2 被禁用。 alpn-boot 在引导类路径上吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 ALPN 在 Jetty SPDY 上使用客户端证书?