Solo 的文章无法同步到社区的解决

本贴最后更新于 2400 天前,其中的信息可能已经沧海桑田

背景

在 2018-03-12 升级了 Solo 版本之后,新发表的文章就无法同步到社区上去了。

闲来无事,来翻翻源代码,看看是哪里的问题。

打开日志

粗略浏览代码,可以看到使用的日志框架是 log4j,配置文件为 log4j.properties

先降低下日志级别,多输出点日志,初步了解下运行的过程。

修改 log4j.properties,将 log4j.logger.org.b3log.solo=INFO 改为 DEBUG

从日志中可以跟踪到,文章同步相关的类为:org.b3log.solo.event.rhythm.ArticleSenderorg.b3log.solo.event.rhythm.ArticleUpdater

因此再修改 log4j.properties,增加一行

log4j.logger.org.b3log.solo.event.rhythm=TRACE

只输出此类下的日志,级别为 TRACE。

rhythm 日志

改了配置文件,重启了一下服务,可以看到成功的打印了日志。部分日志如下:

[DEBUG]-[2018-05-28 13:00:16]-[org.b3log.solo.event.rhythm.ArticleUpdater:90]: Ignores post article[title=Solo的文章无法同步到社区的解决] to Rhythm
[DEBUG]-[2018-05-28 13:01:16]-[org.b3log.solo.event.rhythm.ArticleUpdater:90]: Ignores post article[title=Solo的文章无法同步到社区的解决] to Rhythm
[DEBUG]-[2018-05-28 13:02:16]-[org.b3log.solo.event.rhythm.ArticleUpdater:90]: Ignores post article[title=Solo的文章无法同步到社区的解决] to Rhythm

通过日志可以看到,Solo 会定时提交文章到 Rhythm。

保存文章后,可以看到日志,表明发送成功:

[DEBUG]-[2018-05-28 13:06:00]-[org.b3log.solo.event.rhythm.ArticleUpdater:148]: Sent an article to Rhythm

但是事实上虽然有 Sent an article to Rhythm 日志,但是在社区中是看不到此文章的。为什么呢?

查看代码 ArticleSenderArticleUpdater 类,可见实际上是异步提交的

        try{
            ……
            urlFetchService.fetchAsync(httpRequest);
        } catch (final Exception e) {
            LOGGER.log(Level.ERROR, "Sends an article to Rhythm error: {0}", e.getMessage());
        }

        LOGGER.log(Level.DEBUG, "Sent an article to Rhythm");

这里的 fetchAsync 方法会返回一个 Future 对象,里面包含有 HTTPResponse 对象。

可惜返回的结果被丢弃了,无法看到真实的返回状态。

怎么办呢?

准备重写一下相关的类,把 response 给打印出来。

结果发现这个类是 final 的,而且在三方类包,修改起来非常的复杂。

那好吧,就直接抓包吧。

抓包

准备好抓包工具 tcpflow,具体见之前的博文 tcpflow 备忘

开始抓包:

[abeffect@note flow]# tcpflow -i eth0 port 80
tcpflow[7533]: listening on eth0

结果发现,向 rhythm 的请求被 301 重定向了,然后框架没有 follow 到这个重定向。

HTTP/1.1 301 Moved Permanently
Server: nginx/1.13.12
Date: Mon, 28 May 2018 05:56:51 GMT
Content-Type: text/html
Content-Length: 186
Connection: keep-alive
Location: https://rhythm.b3log.org/article

更改配置文件

rhythm 的配置中保存在配置文件 solo.properties 中的,将其改为 443 的地址

rhythm.servePath=https://rhythm.b3log.org:443

测试后,发现 https 的数据包抓下来之后,不能直接解包了。。。好吧。

发文测试

再之后,发了一篇水博科大龙明康访谈学习,发现可以同步到社区上了。

OK,非常的开心,终于可以继续和社区的小伙伴互动了。

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...