ecwid-mailchimp 库线程安全吗?

Is ecwid-mailchimp library thread safe?

我正在使用此 library

将基于 Spring 的 Web 应用程序与 MailChimp 集成

其 wiki 主页上显示的示例代码中的评论说:

// reuse the same MailChimpClient object whenever possible

根据这个建议,我使用 MailChimpClient 对象作为 class 中的一个实例变量,用@Service 注释,但是,这会导致服务器日志中出现异常,这让我觉得这 class 可能不是线程安全的。谁能确认一下?

异常堆栈跟踪

java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated.
Make sure to release the connection before allocating another one.
at org.apache.http.impl.conn.BasicClientConnectionManager.getConnection(BasicClientConnectionManager.java:162) ~[httpclient-4.2.3.jar:4.2.3]
at org.apache.http.impl.conn.BasicClientConnectionManager.getConnection(BasicClientConnectionManager.java:139) ~[httpclient-4.2.3.jar:4.2.3]
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:456) ~[httpclient-4.2.3.jar:4.2.3]
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906) ~[httpclient-4.2.3.jar:4.2.3]
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805) ~[httpclient-4.2.3.jar:4.2.3]
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784) ~[httpclient-4.2.3.jar:4.2.3]
at com.ecwid.mailchimp.connection.HttpClientConnectionManager.post(HttpClientConnectionManager.java:63) ~[ecwid-mailchimp-2.0.1.0.jar:na]
at com.ecwid.mailchimp.MailChimpClient.execute(MailChimpClient.java:74) ~[ecwid-mailchimp-2.0.1.0.jar:na]
at com.ecwid.mailchimp.MailChimpClient.execute(MailChimpClient.java:83) ~[ecwid-mailchimp-2.0.1.0.jar:na]
at com.ecwid.mailchimp.MailChimpClient.execute(MailChimpClient.java:95) ~[ecwid-mailchimp-2.0.1.0.jar:na]

简短的回答是:MailChimpClient 的实例不是线程安全的,因此不应在线程之间共享。

长答案:这取决于传递给构造函数的 MailChimpConnectionManager 的实现。如果该实现是线程安全的,那么 MailChimpClient 实例也是线程安全的。但是,现有的实现(HttpClientConnectionManager、JavaNetURLConnectionManager)不是线程安全的。

因此,如果您确实需要在线程之间共享 MailChimpClient,您可以编写自己的(线程安全的)MailChimpConnectionManager 实现并将其传递给构造函数。