[ https://issues.apache.org/jira/browse/ARTEMIS-1498?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16351087#comment-16351087 ]
ASF GitHub Bot commented on ARTEMIS-1498: ----------------------------------------- Github user michaelandrepearce commented on the issue: https://github.com/apache/activemq-artemis/pull/1793 Here is a much more complete sample, i would be expecting to see (this is what i was meaning in the original PR comment on: #1793) ``` /** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.activemq.artemis.core.protocol.openwire; import javax.jms.JMSException; import java.io.IOException; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import io.netty.buffer.UnpooledByteBufAllocator; import org.apache.activemq.artemis.api.core.ActiveMQBuffer; import org.apache.activemq.artemis.api.core.ActiveMQPropertyConversionException; import org.apache.activemq.artemis.api.core.ICoreMessage; import org.apache.activemq.artemis.api.core.Message; import org.apache.activemq.artemis.api.core.RefCountMessage; import org.apache.activemq.artemis.api.core.SimpleString; import org.apache.activemq.artemis.core.message.impl.CoreMessageObjectPools; import org.apache.activemq.artemis.core.persistence.Persister; import org.apache.activemq.command.ActiveMQDestination; import org.apache.activemq.command.ActiveMQMessage; import org.apache.activemq.util.ByteSequence; import org.apache.activemq.wireformat.WireFormat; public class OpenWireMessage extends RefCountMessage { private org.apache.activemq.command.ActiveMQMessage message; private WireFormat marshaller; public OpenWireMessage(org.apache.activemq.command.ActiveMQMessage message, WireFormat marshaller){ this.message = message; this.marshaller = marshaller; } @Override public void messageChanged() { } @Override public Long getScheduledDeliveryTime() { return message.getArrival(); } @Override public SimpleString getReplyTo() { return SimpleString.toSimpleString(message.getReplyTo().getPhysicalName()); } @Override public Message setReplyTo(SimpleString address) { message.setReplyTo(ActiveMQDestination.createDestination(address.toString(), ActiveMQDestination.QUEUE_TYPE)); return this; } @Override public Message setBuffer(ByteBuf buffer) { message.setContent(new ByteSequence(ByteBufUtil.getBytes(buffer))); return this; } @Override public ByteBuf getBuffer() { ByteBuf byteBuf = UnpooledByteBufAllocator.DEFAULT.buffer(message.getContent().getLength()); byteBuf.writeBytes(message.getContent().getData(), message.getContent().getOffset(), message.getContent().getLength()); return byteBuf; } @Override public Message copy() { return new OpenWireMessage((ActiveMQMessage)message.copy(), marshaller); } @Override public Message copy(long newID) { OpenWireMessage copy = new OpenWireMessage((ActiveMQMessage)message.copy(), marshaller); copy.setMessageID(newID); return copy; } @Override public long getMessageID() { return message.getMessageId().getBrokerSequenceId(); } @Override public Message setMessageID(long id) { message.getMessageId().setBrokerSequenceId(id); return this; } @Override public long getExpiration() { return message.getExpiration(); } @Override public Message setExpiration(long expiration) { message.setExpiration(expiration); return this; } @Override public Object getUserID() { return message.getUserID(); } @Override public Message setUserID(Object userID) { message.setUserID(userID.toString()); return this; } @Override public boolean isDurable() { return message.isPersistent(); } @Override public Message setDurable(boolean durable) { message.setPersistent(durable); return this; } @Override public Persister<Message> getPersister() { return null; } @Override public String getAddress() { return message.getDestination().getPhysicalName(); } @Override public Message setAddress(String address) { message.setDestination(ActiveMQDestination.createDestination(address, ActiveMQDestination.QUEUE_TYPE)); return this; } @Override public SimpleString getAddressSimpleString() { return null; } @Override public Message setAddress(SimpleString address) { return null; } @Override public long getTimestamp() { return message.getTimestamp(); } @Override public Message setTimestamp(long timestamp) { message.setTimestamp(timestamp); return this; } @Override public byte getPriority() { return message.getPriority(); } @Override public Message setPriority(byte priority) { message.setPriority(priority); return this; } @Override public void receiveBuffer(ByteBuf buffer) { } @Override public void sendBuffer(ByteBuf buffer, int deliveryCount) { } @Override public int getPersistSize() { return 0; } @Override public void persist(ActiveMQBuffer targetRecord) { } @Override public void reloadPersistence(ActiveMQBuffer record) { } @Override public Message putBooleanProperty(String key, boolean value) { try { message.setBooleanProperty(key, value); } catch (JMSException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } return this; } @Override public Message putByteProperty(String key, byte value) { try { message.setByteProperty(key, value); } catch (JMSException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } return this; } @Override public Message putBytesProperty(String key, byte[] value) { return putObjectProperty(key, value); } @Override public Message putShortProperty(String key, short value) { try { message.setShortProperty(key, value); } catch (JMSException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } return this; } @Override public Message putCharProperty(String key, char value) { return putStringProperty(key, Character.toString(value)); } @Override public Message putIntProperty(String key, int value) { try { message.setIntProperty(key, value); } catch (JMSException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } return this; } @Override public Message putLongProperty(String key, long value) { try { message.setLongProperty(key, value); } catch (JMSException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } return this; } @Override public Message putFloatProperty(String key, float value) { try { message.setFloatProperty(key, value); } catch (JMSException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } return this; } @Override public Message putDoubleProperty(String key, double value) { try { message.setDoubleProperty(key, value); } catch (JMSException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } return this; } @Override public Message putBooleanProperty(SimpleString key, boolean value) { return putBooleanProperty(key.toString(), value); } @Override public Message putByteProperty(SimpleString key, byte value) { return putByteProperty(key.toString(), value); } @Override public Message putBytesProperty(SimpleString key, byte[] value) { return putBytesProperty(key.toString(), value); } @Override public Message putShortProperty(SimpleString key, short value) { return putShortProperty(key.toString(), value); } @Override public Message putCharProperty(SimpleString key, char value) { return putCharProperty(key.toString(), value); } @Override public Message putIntProperty(SimpleString key, int value) { return putIntProperty(key.toString(), value); } @Override public Message putLongProperty(SimpleString key, long value) { return putLongProperty(key.toString(), value); } @Override public Message putFloatProperty(SimpleString key, float value) { return putFloatProperty(key.toString(), value); } @Override public Message putDoubleProperty(SimpleString key, double value) { return putDoubleProperty(key.toString(), value); } @Override public Message putStringProperty(String key, String value) { try { message.setStringProperty(key, value); } catch (JMSException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } return this; } @Override public Message putObjectProperty(String key, Object value) throws ActiveMQPropertyConversionException { try { final Object v; if (value instanceof SimpleString) { v = value.toString(); } else { v = value; } message.setProperty(key, value); } catch (IOException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } return this; } @Override public Message putObjectProperty(SimpleString key, Object value) throws ActiveMQPropertyConversionException { return putObjectProperty(key.toString(), value); } @Override public Object removeProperty(String key) { try { Object o = message.getProperty(key); if (o != null) { message.removeProperty(key); } return o; } catch (IOException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } } @Override public boolean containsProperty(String key) { try { return message.getProperty(key) != null; } catch (IOException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } } @Override public Boolean getBooleanProperty(String key) throws ActiveMQPropertyConversionException { try { return message.getBooleanProperty(key); } catch (JMSException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } } @Override public Byte getByteProperty(String key) throws ActiveMQPropertyConversionException { try { return message.getByteProperty(key); } catch (JMSException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } } @Override public Double getDoubleProperty(String key) throws ActiveMQPropertyConversionException { try { return message.getDoubleProperty(key); } catch (JMSException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } } @Override public Integer getIntProperty(String key) throws ActiveMQPropertyConversionException { try { return message.getIntProperty(key); } catch (JMSException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } } @Override public Long getLongProperty(String key) throws ActiveMQPropertyConversionException { try { return message.getLongProperty(key); } catch (JMSException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } } @Override public Object getObjectProperty(String key) { try { return message.getObjectProperty(key); } catch (JMSException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } } @Override public Short getShortProperty(String key) throws ActiveMQPropertyConversionException { try { return message.getShortProperty(key); } catch (JMSException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } } @Override public Float getFloatProperty(String key) throws ActiveMQPropertyConversionException { try { return message.getFloatProperty(key); } catch (JMSException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } } @Override public String getStringProperty(String key) throws ActiveMQPropertyConversionException { try { return message.getStringProperty(key); } catch (JMSException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } } @Override public SimpleString getSimpleStringProperty(String key) throws ActiveMQPropertyConversionException { try { return SimpleString.toSimpleString(message.getStringProperty(key)); } catch (JMSException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } } @Override public byte[] getBytesProperty(String key) throws ActiveMQPropertyConversionException { try { return (byte[]) message.getObjectProperty(key); } catch (JMSException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } } @Override public Object removeProperty(SimpleString key) { return removeProperty(key.toString()); } @Override public boolean containsProperty(SimpleString key) { return containsProperty(key.toString()); } @Override public Boolean getBooleanProperty(SimpleString key) throws ActiveMQPropertyConversionException { return getBooleanProperty(key.toString()); } @Override public Byte getByteProperty(SimpleString key) throws ActiveMQPropertyConversionException { return getByteProperty(key.toString()); } @Override public Double getDoubleProperty(SimpleString key) throws ActiveMQPropertyConversionException { return getDoubleProperty(key.toString()); } @Override public Integer getIntProperty(SimpleString key) throws ActiveMQPropertyConversionException { return getIntProperty(key.toString()); } @Override public Long getLongProperty(SimpleString key) throws ActiveMQPropertyConversionException { return getLongProperty(key.toString()); } @Override public Object getObjectProperty(SimpleString key) { return getObjectProperty(key.toString()); } @Override public Object getAnnotation(SimpleString key) { return getObjectProperty(key.toString()); } @Override public Short getShortProperty(SimpleString key) throws ActiveMQPropertyConversionException { return getShortProperty(key.toString()); } @Override public Float getFloatProperty(SimpleString key) throws ActiveMQPropertyConversionException { return getFloatProperty(key.toString()); } @Override public String getStringProperty(SimpleString key) throws ActiveMQPropertyConversionException { return getStringProperty(key.toString()); } @Override public SimpleString getSimpleStringProperty(SimpleString key) throws ActiveMQPropertyConversionException { return SimpleString.toSimpleString(getStringProperty(key)); } @Override public byte[] getBytesProperty(SimpleString key) throws ActiveMQPropertyConversionException { return getBytesProperty(key.toString()); } @Override public Message putStringProperty(SimpleString key, SimpleString value) { return putStringProperty(key.toString(), value.toString()); } @Override public Message putStringProperty(SimpleString key, String value) { return putStringProperty(key.toString(), value); } @Override public int getEncodeSize() { return 0; } @Override public Set<SimpleString> getPropertyNames() { try { Set<SimpleString> simpleStrings = new HashSet<>(); Enumeration propertyNames = message.getPropertyNames(); while (propertyNames.hasMoreElements()) { simpleStrings.add(SimpleString.toSimpleString((String) propertyNames.nextElement())); } return simpleStrings; } catch (JMSException e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } } @Override public ICoreMessage toCore() { return toCore(null); } @Override public ICoreMessage toCore(CoreMessageObjectPools coreMessageObjectPools) { try { return OpenWireMessageConverter.inbound(message, marshaller, coreMessageObjectPools); } catch (Exception e) { throw new ActiveMQPropertyConversionException(e.getMessage()); } } @Override public int getMemoryEstimate() { return message.getSize(); } } ``` > [interop] Openwire internal headers should not be part of message properties > ---------------------------------------------------------------------------- > > Key: ARTEMIS-1498 > URL: https://issues.apache.org/jira/browse/ARTEMIS-1498 > Project: ActiveMQ Artemis > Issue Type: Bug > Components: OpenWire > Environment: interoperability between Openwire -> AMQP/Core > Reporter: Michal Toth > Priority: Minor > > Sending an empty message from Openwire JMS client to AMQP or Core receiver > client shows extra "internal" headers (__HDR_*) in message properties. > They should not be there, as these are internal for broker in my opinion. > Openwire sender > {noformat} > $ java -jar /var/dtests/node_data/clients/aoc7.jar sender --timeout 5 > --log-msgs interop --broker tcp://localhost:61616 --address queue_name_\$ > --count 1 --conn-username admin --conn-password admin > {'durable': True, 'priority': 4, 'ttl': 0, 'first-acquirer': False, > 'delivery-count': 0, 'id': > 'dhcp-145-96.lab.eng.brq.redhat.com-33646-1509702974536-1:1:1:1:1', > 'user-id':None, 'address': 'queue_name_$', 'subject': None, 'reply-to': None, > 'correlation-id': None, 'content-type': None, 'content-encoding': None, > 'absolute-expiry-time': 0, 'creation-time': 1509702974798, 'group-id': None, > 'group-sequence': 0, 'reply-to-group-id': None, 'properties': {}, 'content': > None, 'type': None} > {noformat} > AMQP/Core receiver > {noformat} > $ java -jar /var/dtests/node_data/clients/aac1.jar receiver --timeout 5 > --log-msgs interop --broker localhost:5672 --address queue_name_\$ --count 1 > --conn-username admin --conn-password admin > Unsupported object type org.apache.qpid.proton.amqp.Binary > \x00\x00\x00Jn\x02\xae\x02{\x00=ID:dhcp-145-96.lab.eng.brq.redhat.com-33646-1509702974536-1:1\x00\x01\x00\x01\x00\x01 > Unsupported object type org.apache.qpid.proton.amqp.Binary > \x00\x00\x00F{\x01+\x00=ID:dhcp-145-96.lab.eng.brq.redhat.com-33646-1509702974536-1:1\x00\x01\x00\x01 > {'durable': True, 'priority': 4, 'ttl': 0, 'first-acquirer': False, > 'delivery-count': 0, 'id': None, 'user-id': None, 'address': 'queue_name_$', > 'subject': None, 'reply-to': None, 'correlation-id': None, 'content-type': > None, 'content-encoding': None, 'absolute-expiry-time': 0, 'creation-time': > 1509702974798, 'group-id': None, 'group-sequence': 0, 'reply-to-group-id': > None, 'properties': {'__HDR_COMMAND_ID': 5, 'JMSXDeliveryCount': 1, > '__HDR_ARRIVAL': 0, '__HDR_MESSAGE_ID': > \x00\x00\x00Jn\x02\xae\x02{\x00=ID:dhcp-145-96.lab.eng.brq.redhat.com-33646-1509702974536-1:1\x00\x01\x00\x01\x00\x01, > '__HDR_GROUP_SEQUENCE': 0, '__HDR_PRODUCER_ID': > \x00\x00\x00F{\x01+\x00=ID:dhcp-145-96.lab.eng.brq.redhat.com-33646-1509702974536-1:1\x00\x01\x00\x01, > '__HDR_DROPPABLE': False, '__HDR_BROKER_IN_TIME': 1509702974800}, 'content': > None} > {noformat} -- This message was sent by Atlassian JIRA (v7.6.3#76005)