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 使用 SPDY 运行 Jetty?

如何通过 ALPN 在 Jetty SPDY 上使用客户端证书?

Jetty:可以使用 SPDY/3.1 吗?

第515期HTTPS, SPDY和 HTTP/2性能的简单对比

HTTPS, SPDY和 HTTP/2性能的简单对比

HTTP/2 Java 8、码头和 ALPN