Spring bean如何只访问一次服务器资源?

时间:2017-05-15 02:46:53

标签: spring ioc-container

我有一个Spring bean,它引用连接工厂来访问J2C资源。此代码部署在2个jvms负载均衡的webSphere服务器中。我在bean xml中将readAuth方法作为init方法,但在负载测试期间多次调用它。由于Spring单例是每个容器的每个bean,我假设有多个容器导致它多次加载。所以我删除了init-method并将用户名和密码更改为static,并在get方法中添加了null check。但是现在,readAuth方法被多次调用。我想确保每个jvm只调用一次此方法,因为此方法访问服务器资源和连接在负载测试期间超时。 请建议如何写这门课的最佳方法。提前谢谢。

    <bean id="J2CUtils"
        class="test.J2CUtils">
        <property name="connectionFactory" ref="connectionFactory" />
    </bean>
    <jee:jndi-lookup id="connectionFactory" jndi-name="eis/J2CAuth" />

public class J2Ctils {
    private ConnectionFactory connectionFactory;
    private static String userName;
    private static String password;

    private void readAuth() throws ResourceException {
        System.out.println("Auth loaded");
            Connection conn = connectionFactory.getConnection();
            Interaction interaction = (Interaction) conn.createInteraction();
            Config config = interaction.getConfig();
            userName = config.getUserName();
            password = config.getPassword();
    }
    public String getUserName() {
        if(null == userName) {
            readAuth();
        }
        return userName;
    }
    public String getPassword() {
        if(null == password) {
            readAuth();
        }
        return password;
    }
    public void setConnectionFactory(ConnectionFactory connectionFactory) {
        this.connectionFactory = connectionFactory;
    }
}

1 个答案:

答案 0 :(得分:0)

如果您想要一次访问资源,单身人士或静态方法无法提供帮助,因为群集的每个成员都拥有自己的类实例。

请记住,Spring specification的Java EE规范都没有定义任何类型的集群行为。您需要搜索特定的供应商解决方案才能实现此类要求。作为示例,请参阅@ApplicationScped in a cluster

归档预期行为的其他方法是使用像Zookeeper这样的分布式锁,甚至可能使用duplicate message filter的队列。