我使用此library
将基于Spring的Web应用程序与MailChimp集成其wiki主页上显示的示例代码中的注释表示:
//尽可能重用相同的MailChimpClient对象
根据这个建议,我使用MailChimpClient对象作为使用@Service注释的类中的实例变量,但是,这会导致服务器日志中出现异常,这使我觉得这个类可能不是线程 - 安全。任何人都可以确认吗?
异常堆栈跟踪
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$1.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]
答案 0 :(得分:1)
简短回答是否:MailChimpClient的实例不是线程安全的,因此不应在线程之间共享。
答案很长:它取决于传递给构造函数的MailChimpConnectionManager的实现。如果该实现是线程安全的,那么MailChimpClient实例也是线程安全的。但是,现有的实现(HttpClientConnectionManager,JavaNetURLConnectionManager)不线程安全。
因此,如果您确实需要在线程之间共享MailChimpClient,您可以编写自己的(线程安全的)MailChimpConnectionManager实现并将其传递给构造函数。