开发talos activemq的扩展时,自定义了一个Message实现如下:
public class TalosActiveMqMessage extends ActiveMQMessage implements Message {
...
}
在自测时发现能通过ActiveMq产生消息,但在Consumer接收到的消息无法正常转义,找到源码:
private ActiveMQMessage createActiveMQMessage(final MessageDispatch md) throws JMSException {
ActiveMQMessage m = (ActiveMQMessage)md.getMessage().copy();
if (m.getDataStructureType() == 29) {
((ActiveMQBlobMessage)m).setBlobDownloader(new BlobDownloader(this.session.getBlobTransferPolicy()));
}
if (m.getDataStructureType() == 26) {
((ActiveMQObjectMessage)m).setTrustAllPackages(this.session.getConnection().isTrustAllPackages());
((ActiveMQObjectMessage)m).setTrustedPackages(this.session.getConnection().getTrustedPackages());
}
if (this.transformer != null) {
Message transformedMessage = this.transformer.consumerTransform(this.session, this, m);
if (transformedMessage != null) {
m = ActiveMQMessageTransformation.transformMessage(transformedMessage, this.session.connection);
}
}
if (this.session.isClientAcknowledge()) {
m.setAcknowledgeCallback(new Callback() {
public void execute() throws Exception {
ActiveMQMessageConsumer.this.checkClosed();
ActiveMQMessageConsumer.this.session.checkClosed();
ActiveMQMessageConsumer.this.session.acknowledge();
}
});
} else if (this.session.isIndividualAcknowledge()) {
m.setAcknowledgeCallback(new Callback() {
public void execute() throws Exception {
ActiveMQMessageConsumer.this.checkClosed();
ActiveMQMessageConsumer.this.session.checkClosed();
ActiveMQMessageConsumer.this.acknowledge(md);
}
});
}
return m;
}
发现在Consumer转义Message时调用的是Message.copy()方法,于是试着把自定义的TalosActiveMqMessage新增了对copy方法的重写,最终搞定,代码如下:
@Override
public org.apache.activemq.command.Message copy() {
TalosActiveMqMessage copy = new TalosActiveMqMessage();
super.copy(copy);
copy.setTraceId(this.traceId);
copy.setSpanId(this.spanId);
copy.setParentSpanId(this.parentSpanId);
copy.setSampled(this.sampled);
copy.setWrappedMessage(this.wrappedMessage);
return copy;
}