是否有一个 BeanFactory 实现同时加载和缓存每个 bean?
在一个完美的场景中,我希望每个 bean 在不同的线程中运行。现在有可能吗?还是我需要为此编写自己的实现?
场景:每个 bean 都分配了一个消息队列通道,并且正在异步通信。在默认实现中,所有 bean 都在同一个线程中。这意味着如果我有 50 个 bean,每个 bean 每秒收到 10 条消息,很快就会处理大量消息,我将在处理这些消息时有延迟。
是否有一个 BeanFactory 实现同时加载和缓存每个 bean?
在一个完美的场景中,我希望每个 bean 在不同的线程中运行。现在有可能吗?还是我需要为此编写自己的实现?
场景:每个 bean 都分配了一个消息队列通道,并且正在异步通信。在默认实现中,所有 bean 都在同一个线程中。这意味着如果我有 50 个 bean,每个 bean 每秒收到 10 条消息,很快就会处理大量消息,我将在处理这些消息时有延迟。
我认为解决方案是使用ConcurrentMapCacheFactoryBean
例如。
<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>
有关如何使用查看的一些示例:
今天我研究了 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