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

  |   2 评论   |   1,272 浏览

背景

在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,非常的开心,终于可以继续和社区的小伙伴互动了。

评论

发表评论

validate