【发布时间】:2012-05-20 06:35:29
【问题描述】:
在我的 Spring 项目中,我确实有一个 JMS 消息侦听器,由 spring 管理:
<bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory" p:brokerURL="tcp://localhost:61616"/>
<bean id="simpleExampleListener" class="my.package.ExampleListener" />
<jms:listener-container container-type="default" connection-factory="jmsFactory" acknowledge="auto" concurrency="1-3">
<jms:listener destination="TEST.FOO" ref="simpleExampleListener" method="onMessage"/>
</jms:listener-container>
在一个特定的消息上,我需要调用一个 Spring MVC 控制器,它是请求范围的(实际上目标是调用一个服务,它也是请求范围并被控制器调用)。所以我不能直接从侦听器中执行此操作,因为 Spring 根据需要管理它们并且它们不受请求范围限制(因为我无法通过 @Autowire 或 ApplicationContext 访问控制器)。一种解决方案可能是通过我的控制器映射的带有 Rest Template 到 URL 的 HTTP 调用。但是,我认为这是一种开销,所以也许还有其他方法可以避免 HTTP 协议开销并在 Spring MVC 框架内调用 Controller?
【问题讨论】:
-
你可以使用原型范围,而不是请求范围吗?
-
如果您确实进行了 Http 调用,至少这将与 webapp 代码松散耦合。直接调用控制器就丑多了。
-
你能解释一下为什么你想从消息监听器调用控制器吗?我想不出任何用例......
-
@Nathan Hughes:实际上,目标是调用由控制器调用的服务(也是请求范围的),因此可以跳过控制器并直接调用服务,这样就不会再丑陋了...
-
同意。所以打电话给服务,问题解决了^_^
标签: spring spring-mvc jms spring-jms