第二条消息未发布到Discourse服务器

我正在尝试使用此 API 向我的 Discourse 论坛服务器发送多条消息:

我的 Java 代码:

public void test()
		throws UnirestException, JsonMappingException, JsonProcessingException, InterruptedException {

	Unirest.config().cookieSpec(CookieSpecs.IGNORE_COOKIES);

	Map<String, String> header = new HashMap<>();
	header.put("Content-Type", "application/json");
	header.put("Api-Key", [redacted]);
	header.put("Api-Username", [redacted]);
    header.put("Accept", "application/json");


	Unirest.post(URL + "/posts.json")
			.headers(header)
			.queryString("title","1st Msg")
			.queryString("raw", "Message 1")
			.queryString("target_recipients", "Kenny")
			.queryString("archetype", "private_message")
			.asJson();


   // TimeUnit.SECONDS.sleep(20);


	Unirest.post(URL + "/posts.json")
			.headers(header)
			.queryString("title","2nd Msg")
			.queryString("raw", "Message 2")
			.queryString("target_recipients", "Kenny")
			.queryString("archetype", "private_message")
			.asJson();
}

在上面的测试中,两条消息都已成功发送(没有发生任何异常)。问题是登录 Discourse 帐户后,我只看到收到了第一条消息,但第二条消息丢失了。

后来,我发现如果在它们之间设置 20 秒的延迟(即在注释中),那么服务器才能同时收到两条消息。

有什么问题?

我的版本:

  • Discourse 3.1.0.beta2
  • Java 11
  • unirest-java 3.14.2

您好 @lenny1 – 我已删除您帖子中的部分内容,因为其中包含敏感信息。请不要公开帖子中的 API 密钥或密码等信息。

2 个赞

您可能遇到了速率限制。如果这是原因,Discourse 应该会返回一个 429 响应。您的 Discourse 错误日志中可能会有关于此的信息。它们位于 管理员 / 日志 / 错误日志。

如果您在那里没有看到任何错误,请尝试记录 Discourse 发送到运行您 Java 代码的服务器的响应。这可能会提供一些有用的信息。

3 个赞

根据您用于发布消息的帐户,您可能会遇到“rate limit create topic”(创建主题的速率限制)或“rate limit create post”(创建帖子的速率限制)。

我正在编写一个脚本,该脚本连续发送 11 个帖子(大约在一秒钟内),目前运行正常,但这些帖子是由系统帐户发送的,该帐户可能没有应用速率限制。

3 个赞

感谢您的回复。
是的,我收到了 Discourse 的回复,如下所示:
“您创建主题的速度太快了。请等待 15 秒后再试。”
我通过在管理页面更改速率限制解决了这个问题,将帖子和主题创建设置为 0。
现在我的问题是是否可以仅为特定帐户设置速率限制?

不可以,速率限制不能为特定帐户设置。但是,“速率限制创建主题”和“速率限制创建帖子”设置不适用于员工帐户。这也许能帮助你解决你的用例。

2 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.