[ https://issues.apache.org/jira/browse/BOOKKEEPER-309?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13402706#comment-13402706 ]
Sijie Guo commented on BOOKKEEPER-309: -------------------------------------- {quote} But JMS assumes some basic functionality to be provided by every messaging system : the reason for changes to hedwig protocol was necessitated due to lack of these in hedwig : a) lack of support for metadata for messages, b) returning published message's id. The list is actually much longer, but as I mentioned elsewhere, we simulate a lot of the changes within provider (some of them poorly as a kludge) to minimize changes to hedwig and protocol : which was a priotity one requirement. {quote} b) is a dependency for you to implement JMS provider. so my suggestion when reviewing all sub tasks is you should put all changes related to b) together in a separated jira like 'support returning published message id'. Not spread it over several jiras mixed with other features. besides that, I found you change 'consume' behavior. so 'changing consume behavior' would be another jira to handle it, not mix it with other jiras. so for BOOKKEEPER-308, you have several tasks need to be done: 1. Support returning published message id 2. Changing consume behavior 3. Add metadata support in Message for JMS 4. JMS provider implementation 1, 2, 3 are independent, while 4 depends on 1, 2, 3. How about changing sub tasks as above? so we don't need to spread discussion over different jiras, make each jira focus on one feature. {quote} In my opinion, relying on raw bytes to convey semantics for metadata will make interoperable implementations impossible as features evolve, and/or as more language bindings are added; so when taking a call, please take that into consideration. {quote} I don't think there is language binding issue for a generic key/bytes header, because you are using protobuf. You could create a kind of message called JMSValue. {code} message JMSValue { enum Type { BOOLEAN = 1; BYTE = 2; SHORT = 3; INT = 4; LONG = 5; FLOAT = 6; DOUBLE = 7; STRING = 8; }; required Type type = 1; optional bool booleanValue = 2; optional sint32 byteValue = 3; ... } {code} What I concerned most is that mixing hedwig protocol with jms protocol together is not a good idea. It introduced overhead for those native hedwig client users. I think it would not be difficult to decouple them. {code} message JMSMessage { + repeated Key2Boolean booleanMetadata = 4; + repeated Key2Byte byteMetadata = 5; + repeated Key2Short shortMetadata = 6; + repeated Key2Integer integerMetadata = 7; + repeated Key2Long longMetadata = 8; + repeated Key2Float floatMetadata = 9; + repeated Key2Double doubleMetadata = 10; + repeated Key2String stringMetadata = 11; + optional JmsBodyType jmsBodyType = 12; +} + +enum JmsBodyType { + STREAM = 0; + MAP = 1; + TEXT = 2; + OBJECT = 3; + BYTES = 4; + // no payload, only message. + MESSAGE = 5; +} + +message Key2Boolean { + required string key = 1; + required bool value = 2; +} + +message Key2Byte { + required string key = 1; + // since protobuffer does not support sint8, we use sint32. We need this explicitly to differentiate between + // byte and int headers. + required sint32 value = 2; +} + +message Key2Short { + required string key = 1; + // since protobuffer does not support sint16, we use sint32. We need this explicitly to differentiate between + // byte and int headers. + required sint32 value = 2; +} + +message Key2Integer { + required string key = 1; + required sint32 value = 2; +} + +message Key2Long { + required string key = 1; + required sint64 value = 2; +} + +message Key2Float { + required string key = 1; + required float value = 2; +} + +message Key2Double { + required string key = 1; + required double value = 2; +} + +message Key2String { + required string key = 1; + required string value = 2; } {code} you could have a JMSMessage protobuf definition to carry all jms related things, and put it in JMS proto file which is just used in hedwig-jms-client. And a JMS > Protocol changes in hedwig to support JMS spec > ---------------------------------------------- > > Key: BOOKKEEPER-309 > URL: https://issues.apache.org/jira/browse/BOOKKEEPER-309 > Project: Bookkeeper > Issue Type: Sub-task > Reporter: Mridul Muralidharan > Attachments: hedwig-protocol.patch > > > JMS spec compliance requires three changes to the protocol. > a) Support for message properties. > b) Make body optional (message contains only properties). > c) Return the published message's seq-id in the response. -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa For more information on JIRA, see: http://www.atlassian.com/software/jira