0

是否有一个 BeanFactory 实现同时加载和缓存每个 bean?

在一个完美的场景中,我希望每个 bean 在不同的线程中运行。现在有可能吗?还是我需要为此编写自己的实现?

场景:每个 bean 都分配了一个消息队列通道,并且正在异步通信。在默认实现中,所有 bean 都在同一个线程中。这意味着如果我有 50 个 bean,每个 bean 每秒收到 10 条消息,很快就会处理大量消息,我将在处理这些消息时有延迟。

4

2 回答 2

1

我认为解决方案是使用ConcurrentMapCacheFactoryBean

http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/cache/concurrent/ConcurrentMapCacheFactoryBean.html

例如。

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">

    <cache:annotation-driven/>

    <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
        <property name="caches">
            <set>
                <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="default"/>
            </set>
        </property>
    </bean>
</beans>

有关如何使用查看的一些示例:

于 2012-09-18T21:40:13.060 回答
0

今天我研究了 Spring Integration,发现它有点适合这个场景。我可以使用 ExecutorChannel 一次处理不同线程中的消息。实际上我可以很容易地使用 BlockingQueue 本身来实现这个场景。总之,谢谢关注!

顺便说一句,如果有人有兴趣,这就是我想出的:

Scenario for an individual Bean:
Allocate a blocking queue

Spawn a background thread which:
    Blocks until message is available in the MQ channel
    When message is available:
        Put a message inside a blocking queue and block until queue is not full
    Repeat the sequence

Spawn a background thread which:
    Blocks until queue is not empty
    Processes a message when it's available in the queue
    Removes a message from the queue indicating that processing is done
    Repeat the sequence
于 2012-09-19T12:35:01.093 回答