当使用代理重新交付插件时,ActiveMQ有时会丢失消息属性

当使用代理重新交付插件时,ActiveMQ有时会丢失消息属性,activemq,spring-jms,Activemq,Spring Jms,我们将ActiveMQ 5.8.0与SpringJMS 3.2.3.0结合使用。应用程序使用SpringDefaultMessageListenerContainer侦听队列,并使用SpringMappingJackson2MessageConverter将对象存储在ActiveMQTextMessage中 我们还使用ActiveMQ代理重新交付插件,该插件在ActiveMQ.xml中配置。消息保存在Oracle数据库中,该数据库也在activemq.xml中配置 现在我们有以下问题:在重新传递

我们将ActiveMQ 5.8.0与SpringJMS 3.2.3.0结合使用。应用程序使用Spring
DefaultMessageListenerContainer
侦听队列,并使用Spring
MappingJackson2MessageConverter将对象存储在
ActiveMQTextMessage

我们还使用ActiveMQ代理重新交付插件,该插件在
ActiveMQ.xml
中配置。消息保存在Oracle数据库中,该数据库也在
activemq.xml
中配置

现在我们有以下问题:在重新传递的大约60%的消息中,由
MappingJackson2MessageConverter
在消息上设置的
javaClass
属性丢失。这将导致以下堆栈跟踪:

org.springframework.jms.support.converter.MessageConversionException: Could not find type id property [javaClass]
            at org.springframework.jms.support.converter.MappingJackson2MessageConverter.getJavaTypeForMessage(MappingJackson2MessageConverter.java:360)
            at org.springframework.jms.support.converter.MappingJackson2MessageConverter.fromMessage(MappingJackson2MessageConverter.java:176)
在检查数据库中的持久化消息时,我们发现
javaClass
属性确实丢失了。但是,
RedeliveryPlugin
设置的
redeliverylay
AMQ\u SCHEDULED\u DELAY
属性存在

这可能是由ActiveMQ中的错误引起的吗?我看到
RedeliveryPlugin.scheduleRedelivery()
marshalledProperties
设置为null,这应该是正确的行为,以确保在
Message.beforemashall()中序列化所有属性。但是如果属性是延迟创建的,并且还没有调用创建它们的方法(即
getProperty()
或类似的方法),那么将
marshalledProperties
置零将清除在重新交付插件之前设置的属性

下面的单元测试证明,当前实现的
org.apache.activemq.command.Message
,可以实现此场景:

@测试
public void testGetPropertyAfterUnmarshallAndNullMarshalledProperties()引发IOException{
ActiveMQTextMessage msg=新的ActiveMQTextMessage();
msg.setProperty(TYPEID_属性,TEST_类);
OpenWireFormat wireFormat=新的OpenWireFormat(CommandTypes.PROTOCOL_版本);
msg.beforemashall(有线格式);
ByteSequence ByteSequence=wireFormat.marshal(msg);
ActiveMQTextMessage Unmarshaled=(ActiveMQTextMessage)wireFormat.unmarshal(byteSequence);
//模拟再交付插件行为
unmarshaled.setMarshalledProperties(null);
assertNull(unmarshaled.getProperty(TYPEID_属性));
}

有没有人在使用代理重新交付插件时见过这种行为?我们开始使用代理插件是因为我们遇到了客户机重新交付机制的问题,因此返回到该机制不是一个选项。

我也看到了这一点。