Spring JMS MessageListener实现类不能参与事务拦截,否则会出现MessageListener的实现类在操作数据库时找不到数据库,特别是多租户数据库切换条件下,会出现两种情况:
(1)服务器刚启动第一次执行Listener时会报错:
Hibernate:Could not execute JDBC batch update 以及Hibernate:NO database selected
Exception in thread "main" org.hibernate.exception.GenericJDBCException: Could not execute JDBC b
(2)执行第二次以后,如果涉及到不同租户的交替操作,当前租户的Listener运行所取得的数据库是上一个租户的数据库,造成存储的数据窜库。
解决办法:
(1)配置Listener实现类不参与Spring事务拦截,如图1:
(2)如果与方法(1)事务拦截冲突,直接修改类名把Listener实现类排除在hibernate事务拦截之外,如把
SmsJMSReceiverServiceImpl改成SmsJMSReceiver。