Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有JMS 2.0的Spring 4 CachingConnectionFactory不';不能正确缓存生产者_Java_Spring_Jms_Spring Jms - Fatal编程技术网

Java 带有JMS 2.0的Spring 4 CachingConnectionFactory不';不能正确缓存生产者

Java 带有JMS 2.0的Spring 4 CachingConnectionFactory不';不能正确缓存生产者,java,spring,jms,spring-jms,Java,Spring,Jms,Spring Jms,我们刚刚升级到Spring4和JMS 2.0。我们使用CachingConnectionFactory和JmsTemplate来发布消息,并注意到在发布到目标时,第一次尝试有效,然后再次尝试发布到同一目标会导致以下异常: 原因:javax.jms.IllegalStateException:生产者已关闭 Spring3.2和JMS1.1的一切都很好,所以我做了一些挖掘,看看问题出在哪里,问题似乎出在CachedMessageProducer类中。通常,此类重新实现MessageProducer接

我们刚刚升级到Spring4和JMS 2.0。我们使用
CachingConnectionFactory
JmsTemplate
来发布消息,并注意到在发布到目标时,第一次尝试有效,然后再次尝试发布到同一目标会导致以下异常:

原因:javax.jms.IllegalStateException:生产者已关闭

Spring3.2和JMS1.1的一切都很好,所以我做了一些挖掘,看看问题出在哪里,问题似乎出在
CachedMessageProducer
类中。通常,此类重新实现
MessageProducer
接口中的所有方法。具体来说,有一个
close()
方法,该方法被重新实现,在使用
JmsTemplate
发送消息后,它只会重置属性,但会使生产者保持活动状态(因为它是一个缓存工厂)

但是,Spring4中有一个名为
GetProxyIfEssential
的新方法,用于确定是否正在使用JMS 2.0,并在检测到JMS 2.0时创建一个
Jms2MessageProducerInvocationHandler
代理。此代理的invoke方法将所有调用委托给原始
MessageProducer
对象,并且似乎绕过了CachedMessageProducer中的方法调用。最终的结果是对原始的
MessageProducer
对象调用close方法(我们不需要它,因为它应该被缓存)。这意味着未来发布的尝试会给出一个例外,即制作人已关闭


以前还有其他人有过这个问题吗?我不确定我是否做错了什么,或者这是Spring新的JMS 2.0支持中的一个错误。

就像您自己发现的,这确实是一个错误,这在即将发布的
4.0.6
4.1.RC1
中得到了解决。谢谢

我假设这是一个bug,我创建了一个Jira票证: