当前位置: 首页 > 知识库问答 >
问题:

如何使用工厂方法在Spring中创建SocketConfig类?

隆选
2023-03-14

我正在使用ApacheCommonsHttpClient 4.3。x和spring3。我正在尝试将connectionpool与其关联的socketconfig实例连接起来。

http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/conn/PoolingHttpClientConnectionManager.html

http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/config/SocketConfig.html?is-external=true

我的代码如下所示:

<bean id="socketConfig" class="org.apache.http.config.SocketConfig" factory-method="custom" init-method="build">
        <property name="soTimeout" value="60000"/>
        <property name="soLinger" value="5" />
</bean>

<bean name="poolingHttpConnectionManager" class="org.apache.http.impl.conn.PoolingHttpClientConnectionManager" depends-on="socketConfig">
        <property name="maxTotal" value="20" />
        <property name="defaultMaxPerRoute" value="20" />
        <property name="defaultSocketConfig" ref="socketConfig" />
</bean>

然而,这是行不通的。用于在PoolghttpClientConnectionManager上设置DefaultSocketConfig()的实例类型为SocketConfig类型。生成器而不是SocketConfig。

我希望发生的事情如下:

SocketConfig config = SocketConfig.custom()
 .setSoTimeout(60000)
 .setSoLinger(5)
 .build()

因此,我希望socketConfig bean类型应该是socketConfig实例,而不是socketConfig。生成器实例。

根据spring文档,我认为这应该有效。

http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#beans-工厂类静态工厂方法

我做错什么了吗?或者这在Spring是不受支持的?

共有2个答案

段哲圣
2023-03-14

我能够通过在Spring做下一个配置来实现它:

<bean id="socketConfig" class="org.apache.http.config.SocketConfig" factory-method="custom">
    <property name="soTimeout" value="1000" />
    <property name="soLinger" value="5" />
</bean>

<bean name="poolingHttpConnectionManager" class="org.apache.http.impl.conn.PoolingHttpClientConnectionManager">
    <property name="maxTotal" value="20" />
    <property name="defaultMaxPerRoute" value="20" />
    <property name="defaultSocketConfig">
        <bean factory-bean="socketConfig" factory-method="build" />
    </property>
</bean>
公良俊楚
2023-03-14

事实证明,socketconfig构建器实例的设计并不能很好地与spring配合使用。

我必须使用一个Spring beanFactory实现来创建实例。

bean类:

import org.apache.http.config.SocketConfig;
import org.springframework.beans.factory.FactoryBean;

public class SocketConfigFactoryBean implements FactoryBean<SocketConfig> {
    int soLinger;
    int soTimeout;

    public SocketConfig getObject() throws Exception {
        return SocketConfig.custom()
                .setSoLinger(soLinger)
                .setSoTimeout(soTimeout)
                .build();
    }

    public Class<?> getObjectType() {
        return SocketConfig.class;
    }

    public boolean isSingleton() {
        return true;
    }

    public int getSoLinger() {
        return soLinger;
    }

    public void setSoLinger(int soLinger) {
        this.soLinger = soLinger;
    }

    public int getSoTimeout() {
        return soTimeout;
    }

    public void setSoTimeout(int soTimeout) {
        this.soTimeout = soTimeout;
    }
}

bean定义

<bean name="poolingHttpConnectionManager" class="org.apache.http.impl.conn.PoolingHttpClientConnectionManager">
    <property name="maxTotal" value="20" />
    <property name="defaultMaxPerRoute" value="20" />
    <property name="defaultSocketConfig">
        <bean class="org.apache.http.config.SocketConfig" factory-method="custom" init-method="build">
        <bean class="com.ex.spring.beans.factory.SocketConfigFactoryBean">
            <property name="soTimeout" value="60000"/>
            <property name="soLinger" value="5" />
        </bean>
    </property>
</bean>
 类似资料:
  • 我有以下代码: 我将添加更多类似的类。与其单独拼出所有这些类,我想学习如何创建一个可以从简单的数据结构创建这些类的工厂。 我该怎么做?我阅读了Metaobject协议文档,但根据文档页面顶部和中间的示例,我不知道如何动态地为我的类指定不同的名称。 我试过: 但最后一行只是抛出了一个错误:

  • 10.2.1 结构体工厂 Go 语言不支持面向对象编程语言中那样的构造子方法,但是可以很容易的在 Go 中实现 “构造子工厂”方法。为了方便通常会为类型定义一个工厂,按惯例,工厂的名字以 new 或 New 开头。假设定义了如下的 File 结构体类型: type File struct { fd int // 文件描述符 name string // 文

  • 问题内容: 在我遵循的方法: 我可以从HTML调用它,例如: 如您所见,如果我得到回报 这是实用程序,因此我想将其定义为 没有例外 当我尝试这样称呼它时: 没发生什么事。 **我已添加到控制器。 如何从HTML调用工厂方法? (*如果不清楚,欢迎您更改/编辑我的问题) 谢谢, 问题答案: 好吧,您实际上不应该这样做…但是您 可以 做的是将服务对象放在$ scope的一个属性中,然后从那里调用它。

  • 问题内容: 目前,我有一种方法可以根据给定的String充当工厂。例如: 我要做的是避免在类列表增加时出现整个if-else问题。我想我需要有两种方法,一种将Strings注册到类中,另一种基于操作的String返回类。 用Java做到这一点的一种好方法是什么? 问题答案: 在打开字符串之前,您所做的可能是最好的方法。( 编辑2019: 可以打开字符串-使用它。) 您可以创建工厂对象以及从字符串到

  • 错误:org.mockito.exceptions.misusing.missingMethodInvocationException:when()需要一个参数,该参数必须是“mock上的方法调用”。例如:when(mock.getArticles()).thenreturn(articles); 此外,此错误可能会出现,因为:1。您可以存根:finall/private/equals()/has

  • 我使用WebFlux反应式模块、H2内存数据库和R2DBC反应式驱动程序创建了一个JavaSpring Boot服务。 当我运行该服务时,它失败并显示“无法创建连接工厂”错误: 这是一个嵌套的异常,似乎从存储库开始,然后通过服务传播回控制器。 在仔细阅读了生成的堆栈跟踪并没有发现任何问题的迹象后,我能找到的唯一线索是,我的类中的“连接工厂”输入参数(请参见下文)正在用红色曲线突出显示(“无法自动装