Search in sources :

Example 6 with MessageAnnotations

use of org.apache.qpid.proton.amqp.messaging.MessageAnnotations in project activemq-artemis by apache.

the class JMSMappingOutboundTransformerTest method doTestConvertMessageWithJMSDestination.

private void doTestConvertMessageWithJMSDestination(ServerDestination jmsDestination, Object expectedAnnotationValue) throws Exception {
    ServerJMSTextMessage textMessage = createTextMessage();
    textMessage.setText("myTextMessageContent");
    textMessage.setJMSDestination(jmsDestination);
    Message amqp = AMQPConverter.getInstance().fromCore(textMessage.getInnerMessage()).getProtonMessage();
    MessageAnnotations ma = amqp.getMessageAnnotations();
    Map<Symbol, Object> maMap = ma == null ? null : ma.getValue();
    if (maMap != null) {
        Object actualValue = maMap.get(AMQPMessageSupport.JMS_DEST_TYPE_MSG_ANNOTATION);
        assertEquals("Unexpected annotation value", expectedAnnotationValue, actualValue);
    } else if (expectedAnnotationValue != null) {
        fail("Expected annotation value, but there were no annotations");
    }
    if (jmsDestination != null) {
        assertEquals("Unexpected 'to' address", jmsDestination.getAddress(), amqp.getAddress());
    }
}
Also used : CoreMessage(org.apache.activemq.artemis.core.message.impl.CoreMessage) ServerJMSTextMessage(org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSTextMessage) ServerJMSObjectMessage(org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSObjectMessage) Message(org.apache.qpid.proton.message.Message) ServerJMSMessage(org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMessage) ServerJMSStreamMessage(org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSStreamMessage) ServerJMSBytesMessage(org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSBytesMessage) ServerJMSMapMessage(org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMapMessage) ServerJMSTextMessage(org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSTextMessage) MessageAnnotations(org.apache.qpid.proton.amqp.messaging.MessageAnnotations) Symbol(org.apache.qpid.proton.amqp.Symbol)

Example 7 with MessageAnnotations

use of org.apache.qpid.proton.amqp.messaging.MessageAnnotations in project activemq-artemis by apache.

the class JMSMappingInboundTransformerTest method doTransformWithToTypeDestinationTypeAnnotationTestImpl.

private void doTransformWithToTypeDestinationTypeAnnotationTestImpl(Object toTypeAnnotationValue, Class<? extends Destination> expectedClass) throws Exception {
    String toAddress = "toAddress";
    Message amqp = Message.Factory.create();
    amqp.setBody(new AmqpValue("myTextMessageContent"));
    amqp.setAddress(toAddress);
    if (toTypeAnnotationValue != null) {
        Map<Symbol, Object> map = new HashMap<>();
        map.put(Symbol.valueOf("x-opt-to-type"), toTypeAnnotationValue);
        MessageAnnotations ma = new MessageAnnotations(map);
        amqp.setMessageAnnotations(ma);
    }
    javax.jms.Message jmsMessage = ServerJMSMessage.wrapCoreMessage(new AMQPMessage(amqp).toCore());
    assertTrue("Expected TextMessage", jmsMessage instanceof TextMessage);
}
Also used : ServerJMSTextMessage(org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSTextMessage) AMQPMessage(org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage) ServerJMSObjectMessage(org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSObjectMessage) Message(org.apache.qpid.proton.message.Message) TextMessage(javax.jms.TextMessage) ServerJMSMessage(org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMessage) ServerJMSStreamMessage(org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSStreamMessage) ICoreMessage(org.apache.activemq.artemis.api.core.ICoreMessage) ServerJMSBytesMessage(org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSBytesMessage) ServerJMSMapMessage(org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMapMessage) HashMap(java.util.HashMap) Symbol(org.apache.qpid.proton.amqp.Symbol) MessageAnnotations(org.apache.qpid.proton.amqp.messaging.MessageAnnotations) AMQPMessage(org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage) AmqpValue(org.apache.qpid.proton.amqp.messaging.AmqpValue) ServerJMSTextMessage(org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSTextMessage) TextMessage(javax.jms.TextMessage)

Example 8 with MessageAnnotations

use of org.apache.qpid.proton.amqp.messaging.MessageAnnotations in project activemq-artemis by apache.

the class JMSTransformationSpeedComparisonTest method createComplexQpidJMSMessage.

private Message createComplexQpidJMSMessage() {
    Map<String, Object> applicationProperties = new HashMap<>();
    Map<Symbol, Object> messageAnnotations = new HashMap<>();
    applicationProperties.put("property-1", "string-1");
    applicationProperties.put("property-2", 512);
    applicationProperties.put("property-3", true);
    applicationProperties.put("property-4", "string-2");
    applicationProperties.put("property-5", 512);
    applicationProperties.put("property-6", true);
    applicationProperties.put("property-7", "string-3");
    applicationProperties.put("property-8", 512);
    applicationProperties.put("property-9", true);
    messageAnnotations.put(Symbol.valueOf("x-opt-jms-msg-type"), 0);
    messageAnnotations.put(Symbol.valueOf("x-opt-jms-dest"), 0);
    Message message = Proton.message();
    // Header Values
    message.setPriority((short) 9);
    message.setDurable(true);
    message.setDeliveryCount(2);
    message.setTtl(5000);
    // Properties
    message.setMessageId("ID:SomeQualifier:0:0:1");
    message.setGroupId("Group-ID-1");
    message.setGroupSequence(15);
    message.setAddress("queue://test-queue");
    message.setReplyTo("queue://reply-queue");
    message.setCreationTime(System.currentTimeMillis());
    message.setContentType("text/plain");
    message.setCorrelationId("ID:SomeQualifier:0:7:9");
    message.setUserId("username".getBytes(StandardCharsets.UTF_8));
    // Application Properties / Message Annotations / Body
    message.setApplicationProperties(new ApplicationProperties(applicationProperties));
    message.setMessageAnnotations(new MessageAnnotations(messageAnnotations));
    message.setBody(new AmqpValue("String payload for AMQP message conversion performance testing."));
    return message;
}
Also used : ICoreMessage(org.apache.activemq.artemis.api.core.ICoreMessage) AMQPMessage(org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage) Message(org.apache.qpid.proton.message.Message) HashMap(java.util.HashMap) Symbol(org.apache.qpid.proton.amqp.Symbol) MessageAnnotations(org.apache.qpid.proton.amqp.messaging.MessageAnnotations) ApplicationProperties(org.apache.qpid.proton.amqp.messaging.ApplicationProperties) AmqpValue(org.apache.qpid.proton.amqp.messaging.AmqpValue)

Example 9 with MessageAnnotations

use of org.apache.qpid.proton.amqp.messaging.MessageAnnotations in project activemq-artemis by apache.

the class CoreAmqpConverter method fromCore.

public static AMQPMessage fromCore(ICoreMessage coreMessage) throws Exception {
    if (coreMessage == null) {
        return null;
    }
    ServerJMSMessage message = ServerJMSMessage.wrapCoreMessage(coreMessage);
    message.decode();
    long messageFormat = 0;
    Header header = null;
    final Properties properties = new Properties();
    Map<Symbol, Object> daMap = null;
    final Map<Symbol, Object> maMap = new HashMap<>();
    Map<String, Object> apMap = null;
    Map<Object, Object> footerMap = null;
    Section body = convertBody(message, maMap, properties);
    if (message.getInnerMessage().isDurable()) {
        if (header == null) {
            header = new Header();
        }
        header.setDurable(true);
    }
    byte priority = (byte) message.getJMSPriority();
    if (priority != javax.jms.Message.DEFAULT_PRIORITY) {
        if (header == null) {
            header = new Header();
        }
        header.setPriority(UnsignedByte.valueOf(priority));
    }
    String type = message.getJMSType();
    if (type != null) {
        properties.setSubject(type);
    }
    String messageId = message.getJMSMessageID();
    if (messageId != null) {
        try {
            properties.setMessageId(AMQPMessageIdHelper.INSTANCE.toIdObject(messageId));
        } catch (ActiveMQAMQPIllegalStateException e) {
            properties.setMessageId(messageId);
        }
    }
    Destination destination = message.getJMSDestination();
    if (destination != null) {
        properties.setTo(toAddress(destination));
        maMap.put(JMS_DEST_TYPE_MSG_ANNOTATION, destinationType(destination));
    }
    Destination replyTo = message.getJMSReplyTo();
    if (replyTo != null) {
        properties.setReplyTo(toAddress(replyTo));
        maMap.put(JMS_REPLY_TO_TYPE_MSG_ANNOTATION, destinationType(replyTo));
    }
    String correlationId = message.getJMSCorrelationID();
    if (correlationId != null) {
        try {
            properties.setCorrelationId(AMQPMessageIdHelper.INSTANCE.toIdObject(correlationId));
        } catch (ActiveMQAMQPIllegalStateException e) {
            properties.setCorrelationId(correlationId);
        }
    }
    long expiration = message.getJMSExpiration();
    if (expiration != 0) {
        long ttl = expiration - System.currentTimeMillis();
        if (ttl < 0) {
            ttl = 1;
        }
        if (header == null) {
            header = new Header();
        }
        header.setTtl(new UnsignedInteger((int) ttl));
        properties.setAbsoluteExpiryTime(new Date(expiration));
    }
    long timeStamp = message.getJMSTimestamp();
    if (timeStamp != 0) {
        properties.setCreationTime(new Date(timeStamp));
    }
    final Set<String> keySet = MessageUtil.getPropertyNames(message.getInnerMessage());
    for (String key : keySet) {
        if (key.startsWith("JMSX")) {
            if (key.equals("JMSXUserID")) {
                String value = message.getStringProperty(key);
                properties.setUserId(new Binary(value.getBytes(StandardCharsets.UTF_8)));
                continue;
            } else if (key.equals("JMSXGroupID")) {
                String value = message.getStringProperty(key);
                properties.setGroupId(value);
                continue;
            } else if (key.equals("JMSXGroupSeq")) {
                UnsignedInteger value = new UnsignedInteger(message.getIntProperty(key));
                properties.setGroupSequence(value);
                continue;
            }
        } else if (key.startsWith(JMS_AMQP_PREFIX)) {
            // AMQP Message Information stored from a conversion to the Core Message
            if (key.equals(JMS_AMQP_NATIVE)) {
                // skip..internal use only
                continue;
            } else if (key.equals(JMS_AMQP_FIRST_ACQUIRER)) {
                if (header == null) {
                    header = new Header();
                }
                header.setFirstAcquirer(message.getBooleanProperty(key));
                continue;
            } else if (key.equals(JMS_AMQP_HEADER)) {
                if (header == null) {
                    header = new Header();
                }
                continue;
            } else if (key.equals(JMS_AMQP_HEADER_DURABLE)) {
                if (header == null) {
                    header = new Header();
                }
                header.setDurable(message.getInnerMessage().isDurable());
                continue;
            } else if (key.equals(JMS_AMQP_HEADER_PRIORITY)) {
                if (header == null) {
                    header = new Header();
                }
                header.setPriority(UnsignedByte.valueOf(priority));
                continue;
            } else if (key.startsWith(JMS_AMQP_PROPERTIES)) {
                continue;
            } else if (key.startsWith(JMS_AMQP_DELIVERY_ANNOTATION_PREFIX)) {
                if (daMap == null) {
                    daMap = new HashMap<>();
                }
                String name = key.substring(JMS_AMQP_DELIVERY_ANNOTATION_PREFIX.length());
                daMap.put(Symbol.valueOf(name), message.getObjectProperty(key));
                continue;
            } else if (key.startsWith(JMS_AMQP_MESSAGE_ANNOTATION_PREFIX)) {
                String name = key.substring(JMS_AMQP_MESSAGE_ANNOTATION_PREFIX.length());
                maMap.put(Symbol.valueOf(name), message.getObjectProperty(key));
                continue;
            } else if (key.equals(JMS_AMQP_CONTENT_TYPE)) {
                properties.setContentType(Symbol.getSymbol(message.getStringProperty(key)));
                continue;
            } else if (key.equals(JMS_AMQP_CONTENT_ENCODING)) {
                properties.setContentEncoding(Symbol.getSymbol(message.getStringProperty(key)));
                continue;
            } else if (key.equals(JMS_AMQP_REPLYTO_GROUP_ID)) {
                properties.setReplyToGroupId(message.getStringProperty(key));
                continue;
            } else if (key.startsWith(JMS_AMQP_FOOTER_PREFIX)) {
                if (footerMap == null) {
                    footerMap = new HashMap<>();
                }
                String name = key.substring(JMS_AMQP_FOOTER_PREFIX.length());
                footerMap.put(name, message.getObjectProperty(key));
                continue;
            }
        } else if (key.equals("_AMQ_GROUP_ID")) {
            String value = message.getStringProperty(key);
            properties.setGroupId(value);
            continue;
        } else if (key.equals(NATIVE_MESSAGE_ID)) {
            // skip..internal use only
            continue;
        } else if (key.endsWith(HDR_SCHEDULED_DELIVERY_TIME.toString())) {
            // skip..remove annotation from previous inbound transformation
            continue;
        }
        if (apMap == null) {
            apMap = new HashMap<>();
        }
        Object objectProperty = message.getObjectProperty(key);
        if (objectProperty instanceof byte[]) {
            objectProperty = new Binary((byte[]) objectProperty);
        }
        apMap.put(key, objectProperty);
    }
    ByteBuf buffer = PooledByteBufAllocator.DEFAULT.heapBuffer(1024);
    try {
        EncoderImpl encoder = TLSEncode.getEncoder();
        encoder.setByteBuffer(new NettyWritable(buffer));
        if (header != null) {
            encoder.writeObject(header);
        }
        if (daMap != null) {
            encoder.writeObject(new DeliveryAnnotations(daMap));
        }
        if (maMap != null) {
            encoder.writeObject(new MessageAnnotations(maMap));
        }
        if (properties != null) {
            encoder.writeObject(properties);
        }
        if (apMap != null) {
            encoder.writeObject(new ApplicationProperties(apMap));
        }
        if (body != null) {
            encoder.writeObject(body);
        }
        if (footerMap != null) {
            encoder.writeObject(new Footer(footerMap));
        }
        byte[] data = new byte[buffer.writerIndex()];
        buffer.readBytes(data);
        AMQPMessage amqpMessage = new AMQPMessage(messageFormat, data);
        amqpMessage.setMessageID(message.getInnerMessage().getMessageID());
        amqpMessage.setReplyTo(coreMessage.getReplyTo());
        return amqpMessage;
    } finally {
        TLSEncode.getEncoder().setByteBuffer((WritableBuffer) null);
        buffer.release();
    }
}
Also used : Destination(javax.jms.Destination) EncoderImpl(org.apache.qpid.proton.codec.EncoderImpl) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Symbol(org.apache.qpid.proton.amqp.Symbol) Properties(org.apache.qpid.proton.amqp.messaging.Properties) ApplicationProperties(org.apache.qpid.proton.amqp.messaging.ApplicationProperties) ByteBuf(io.netty.buffer.ByteBuf) NettyWritable(org.apache.activemq.artemis.protocol.amqp.util.NettyWritable) MessageAnnotations(org.apache.qpid.proton.amqp.messaging.MessageAnnotations) ApplicationProperties(org.apache.qpid.proton.amqp.messaging.ApplicationProperties) ActiveMQAMQPIllegalStateException(org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPIllegalStateException) DeliveryAnnotations(org.apache.qpid.proton.amqp.messaging.DeliveryAnnotations) Section(org.apache.qpid.proton.amqp.messaging.Section) AMQPMessage(org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage) Date(java.util.Date) Header(org.apache.qpid.proton.amqp.messaging.Header) Footer(org.apache.qpid.proton.amqp.messaging.Footer) Binary(org.apache.qpid.proton.amqp.Binary) UnsignedInteger(org.apache.qpid.proton.amqp.UnsignedInteger) ServerJMSMessage(org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMessage)

Example 10 with MessageAnnotations

use of org.apache.qpid.proton.amqp.messaging.MessageAnnotations in project activemq-artemis by apache.

the class AMQPMessage method partialDecode.

private synchronized void partialDecode(ByteBuffer buffer) {
    DecoderImpl decoder = TLSEncode.getDecoder();
    decoder.setByteBuffer(buffer);
    buffer.position(0);
    _header = null;
    _deliveryAnnotations = null;
    _messageAnnotations = null;
    _properties = null;
    applicationProperties = null;
    Section section = null;
    try {
        if (buffer.hasRemaining()) {
            section = (Section) decoder.readObject();
        }
        if (section instanceof Header) {
            _header = (Header) section;
            headerEnds = buffer.position();
            messagePaylodStart = headerEnds;
            if (_header.getTtl() != null) {
                this.expiration = System.currentTimeMillis() + _header.getTtl().intValue();
            }
            if (buffer.hasRemaining()) {
                section = (Section) decoder.readObject();
            } else {
                section = null;
            }
        } else {
            // meaning there is no header
            headerEnds = 0;
        }
        if (section instanceof DeliveryAnnotations) {
            _deliveryAnnotations = (DeliveryAnnotations) section;
            // Advance the start beyond the delivery annotations so they are not written
            // out on send of the message.
            messagePaylodStart = buffer.position();
            if (buffer.hasRemaining()) {
                section = (Section) decoder.readObject();
            } else {
                section = null;
            }
        }
        if (section instanceof MessageAnnotations) {
            _messageAnnotations = (MessageAnnotations) section;
            if (buffer.hasRemaining()) {
                section = (Section) decoder.readObject();
            } else {
                section = null;
            }
        }
        if (section instanceof Properties) {
            _properties = (Properties) section;
            if (_properties.getAbsoluteExpiryTime() != null && _properties.getAbsoluteExpiryTime().getTime() > 0) {
                this.expiration = _properties.getAbsoluteExpiryTime().getTime();
            }
            // We don't read the next section on purpose, as we will parse ApplicationProperties
            // lazily
            section = null;
        }
        if (section instanceof ApplicationProperties) {
            applicationProperties = (ApplicationProperties) section;
        } else {
            if (buffer.hasRemaining()) {
                this.appLocation = buffer.position();
            } else {
                this.appLocation = -1;
            }
        }
    } finally {
        decoder.setByteBuffer(null);
    }
}
Also used : DecoderImpl(org.apache.qpid.proton.codec.DecoderImpl) Header(org.apache.qpid.proton.amqp.messaging.Header) MessageAnnotations(org.apache.qpid.proton.amqp.messaging.MessageAnnotations) DeliveryAnnotations(org.apache.qpid.proton.amqp.messaging.DeliveryAnnotations) ApplicationProperties(org.apache.qpid.proton.amqp.messaging.ApplicationProperties) TypedProperties(org.apache.activemq.artemis.utils.collections.TypedProperties) Properties(org.apache.qpid.proton.amqp.messaging.Properties) ApplicationProperties(org.apache.qpid.proton.amqp.messaging.ApplicationProperties) Section(org.apache.qpid.proton.amqp.messaging.Section)

Aggregations

MessageAnnotations (org.apache.qpid.proton.amqp.messaging.MessageAnnotations)24 Symbol (org.apache.qpid.proton.amqp.Symbol)19 HashMap (java.util.HashMap)15 ApplicationProperties (org.apache.qpid.proton.amqp.messaging.ApplicationProperties)11 Message (org.apache.qpid.proton.message.Message)10 AMQPMessage (org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage)6 AmqpValue (org.apache.qpid.proton.amqp.messaging.AmqpValue)6 ICoreMessage (org.apache.activemq.artemis.api.core.ICoreMessage)5 ServerJMSMessage (org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMessage)5 Binary (org.apache.qpid.proton.amqp.Binary)5 Properties (org.apache.qpid.proton.amqp.messaging.Properties)5 ServerJMSBytesMessage (org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSBytesMessage)4 ServerJMSMapMessage (org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMapMessage)4 ServerJMSObjectMessage (org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSObjectMessage)4 ServerJMSStreamMessage (org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSStreamMessage)4 ServerJMSTextMessage (org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSTextMessage)4 Section (org.apache.qpid.proton.amqp.messaging.Section)4 Map (java.util.Map)3 Data (org.apache.qpid.proton.amqp.messaging.Data)3 Header (org.apache.qpid.proton.amqp.messaging.Header)3