我有一个使用 JMS 插件(使用版本 1.3)的 grails 2.2 应用程序。
我遇到的情况是,当我的服务器启动时,JMS 插件初始化并且监听器服务在服务器完成设置之前抓取队列中所有等待的消息。
具体来说,它命中代码中的第一个 hibernate 查询并失败并出现以下错误:
| Error 2014-10-14 11:06:56,535 [ruleInputDataListenerJmsListenerContainer-1] ERROR drms.RuleInputDataListenerService - Message Exception: Failed to process JMS Message.
groovy.lang.MissingMethodException: No signature of method: au.edu.csu.drms.Field.executeQuery() is applicable for argument types: () values: []
Possible solutions: executeQuery(java.lang.String), executeQuery(java.lang.String, java.util.Collection), executeQuery(java.lang.String, java.util.Map), executeQuery(java.lang.String, java.util.Collection, java.util.Map), executeQuery(java.lang.String, java.util.Map, java.util.Map)
有问题的代码是正确的:
String query = "SELECT f FROM field f WHERE (attributeName = :attributeName AND entityName = :entityName)"
def fieldList = Field.executeQuery(query, [attributeName: _attributeName, entityName: _entityName])
据我所知,这是在 JMS 监听器执行 onMessage
方法时未初始化 hibernate 的问题。它也会发生在 withCriteria
或任何其他 hibernate 查询方法中。
只有在服务器启动时队列中有消息并且每条消息等待失败时才会发生。一旦队列完成并处理新消息,它就可以正常工作。
有没有办法让 hibernate 及时初始化或延迟执行监听器服务(很像具有启动延迟计时器的 Quartz 插件)?
更新:
我不使用 bean 配置,因为它是一个守护进程类型的应用程序——我们没有要定义的 beans。
有没有办法使用@DependsOn 并让我的监听器依赖于 Hibernate 本身?
最佳答案
假设您有以下 EntityManagerFactory 配置:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaDialect" ref="jpaDialect"/>
</bean>
您需要让您的 JMS 连接工厂依赖于 entityManagerFactory:
<bean id="jmsConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory"
destroy-method="stop" depends-on="jmsBroker, entityManagerFactory">
<property name="connectionFactory" ref="activeMQConnectionFactory"/>
</bean>
关于java - JMS 监听器在服务器启动时设置 Hibernate 之前触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26351469/