首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JMS持久异步事件通知

JMS持久异步事件通知
EN

Stack Overflow用户
提问于 2012-11-21 02:55:19
回答 1查看 1.4K关注 0票数 1

我希望有人给我指出一些要求的正确方向:我们需要在我们的服务器上发送异步可靠的通知消息的消费者将订阅/取消订阅的意愿消费者将在数量上很大生产者将是一个通知,即使服务器停机,不会丢失,如果服务器再次启动将被发送。通知的数量预计会很高,所使用的线程数量应该尽可能低。

考虑到上述(疯狂的)需求,我尝试使用activemq/jms来解决这个问题。这看起来是正确的方向吗?

考虑到上述情况: 1.我使用了持久订阅者、jms消息和kahadb。2对于jms生产者来说,解决方案似乎很简单。3.对于消费者来说,我遇到了麻烦。

a.虽然我有spring,但我不能使用jms: listener -container,因为我需要动态订阅和取消订阅消费者,这似乎是不可能的,所以我为我拥有的每个侦听器创建了一个SimpleListenerContainer。这听起来还行吧?b.在SimpleListenerContainer中,我设置了clientId (因为这是持久所需的)

代码语言:javascript
复制
    super.setSubscriptionDurable(durable);
    if (durable ) super.setClientId(clientId);

在这里,我有以下内容。给定以下配置:

代码语言:javascript
复制
    <bean id="messageBusReceiverConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
        <property name="maxConnections" value="10"/>
        <property name="maximumActive" value="500"/>
        <property name="connectionFactory" ref="jmsConnectionFactory"/>
        <property name="idleTimeout" value="0"/>
    </bean>

我希望有10*500=5000并行消费者成为可能。如果消费者不耐用,这是真的。但是,对于使用super.setClientId( clientID ) (超级是SimpleMessageListenerContainer)的持久消费者,在第10个连接之后,我得到:不允许在使用的连接上设置SimpleMessageListenerContainer;嵌套异常是javax.jms.IllegalStateException:不允许在使用的连接上设置clientID

因此,我似乎不能使用持久的订阅者使用SimpleMessageListenerContainer进行会话,只能用于连接。这是真的吗?拥有maxConnections=500和maximumActive=1听起来合理吗?这解决了我的问题但是..。尽管对JMS来说是新事物,但这对代理来说似乎有点过头了。

好的,考虑到我仍然在正确的轨道上,我现在需要取消订阅我的消费者/侦听器,所以我这样做了

代码语言:javascript
复制
container.stop();
container.destroy();

其中容器为SimpleMessageListenerContainer。container.destroy();在被调用时抛出一些异常。是否有必要调用它,或者停止方法就足够了?

好吧,我知道这些问题是武断的,甚至对于一个了解jms (如果jms是正确的解决方案)并且从我的代码中几乎没有给出任何东西的人来说,可能也很难回答。我希望有人能就我是否在正确的轨道上给我一些指导,在他提出的问题上尽可能多地给我输入,然后我可以在需要的地方给出代码,以解决我剩下的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-03 22:11:53

我缺乏关于spring的知识来回答你关于IllegalStateException的问题,尽管我猜这与maxConnections设置为10有关。

你需要弹簧吗?在任何情况下,请确保在JMS Broker的配置中启用了持久性,确保使用持久队列/主题,并确保对消息使用setDurable(true)

我认为,如果您想要可靠的消息传递,那么使用功能强大的JMS提供程序通常是正确的。您可以使用SPECjms2007基准测试各种产品,这取决于性能对您的重要性,也有一些results可用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13480140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档