Skip to content

Commit 1245af2

Browse files
authored
Merge pull request #144 from ayeshLK/revamp-msg
Revamp `jms:Message` API
2 parents 4d99bab + 0b2f290 commit 1245af2

20 files changed

+540
-562
lines changed

ballerina/message.bal

Lines changed: 17 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,27 @@
1414
// specific language governing permissions and limitations
1515
// under the License.
1616

17-
import ballerina/jballerina.java;
17+
# Represent the valid value types allowed in JMS message properties.
18+
public type Property boolean|int|byte|float|string;
19+
20+
# Represents the allowed value types for entries in the map content of a JMS MapMessage.
21+
public type Value Property|byte[];
1822

1923
# Represent the JMS Message used to send and receive content from the a JMS provider.
2024
#
21-
# + messageId - Unique identifier for a JMS message
22-
# + timestamp - Time a message was handed off to a provider to be sent
23-
# + correlationId - Id which can be use to correlate multiple messages
25+
# + messageId - Unique identifier for a JMS message (Only set by the JMS provider)
26+
# + timestamp - Time a message was handed off to a provider to be sent (Only set by the JMS provider)
27+
# + correlationId - Id which can be used to correlate multiple messages
2428
# + replyTo - JMS destination to which a reply to this message should be sent
25-
# + destination - JMS destination of this message
26-
# + deliveryMode - Delivery mode of this message
27-
# + redelivered - Indication of whether this message is being redelivered
29+
# + destination - JMS destination of this message (Only set by the JMS provider)
30+
# + deliveryMode - Delivery mode of this message (Only set by the JMS provider)
31+
# + redelivered - Indication of whether this message is being redelivered (Only set by the JMS provider)
2832
# + jmsType - Message type identifier supplied by the client when the message was sent
29-
# + expiration - Message expiration time
30-
# + deliveredTime - The earliest time when a JMS provider may deliver the message to a consumer
31-
# + priority - Message priority level
33+
# + expiration - Message expiration time (Only set by the JMS provider)
34+
# + deliveredTime - The earliest time when a JMS provider may deliver the message to a consumer (Only set by the JMS provider)
35+
# + priority - Message priority level (Only set by the JMS provider)
3236
# + properties - Additional message properties
37+
# + content - Message content
3338
public type Message record {
3439
string messageId?;
3540
int timestamp?;
@@ -42,74 +47,6 @@ public type Message record {
4247
int expiration?;
4348
int deliveredTime?;
4449
int priority?;
45-
map<anydata> properties?;
50+
map<Property> properties?;
51+
string|map<Value>|byte[] content;
4652
};
47-
48-
# Represent the JMS Text Message.
49-
#
50-
# + content - Message content
51-
public type TextMessage record {|
52-
*Message;
53-
string content;
54-
|};
55-
56-
# Represent the JMS Map Message.
57-
#
58-
# + content - Message content
59-
public type MapMessage record {|
60-
*Message;
61-
map<anydata> content;
62-
|};
63-
64-
# Represent the JMS Bytes Message.
65-
#
66-
# + content - Message content
67-
public type BytesMessage record {|
68-
*Message;
69-
byte[] content;
70-
|};
71-
72-
isolated function externWriteText(handle message, handle value) returns error? = @java:Method {
73-
name: "setText",
74-
'class: "javax.jms.TextMessage"
75-
} external;
76-
77-
isolated function externWriteBytes(handle message, byte[] value) returns Error? = @java:Method {
78-
name: "writeBytes",
79-
'class: "io.ballerina.stdlib.java.jms.JmsMessageUtils"
80-
} external;
81-
82-
isolated function externSetBoolean(handle message, handle name, boolean value) returns error? = @java:Method {
83-
name: "setBoolean",
84-
'class: "javax.jms.MapMessage"
85-
} external;
86-
87-
isolated function externSetDouble(handle message, handle name, float value) returns error? = @java:Method {
88-
name: "setDouble",
89-
'class: "javax.jms.MapMessage"
90-
} external;
91-
92-
isolated function externSetLong(handle message, handle name, int value) returns error? = @java:Method {
93-
name: "setLong",
94-
'class: "javax.jms.MapMessage"
95-
} external;
96-
97-
isolated function externSetString(handle message, handle name, handle value) returns error? = @java:Method {
98-
name: "setString",
99-
'class: "javax.jms.MapMessage"
100-
} external;
101-
102-
isolated function externSetBytes(handle message, handle name, byte[] value) returns Error? = @java:Method {
103-
name: "writeBytesField",
104-
'class: "io.ballerina.stdlib.java.jms.JmsMessageUtils"
105-
} external;
106-
107-
isolated function externSetReplyTo(Session session, handle message, Destination replyTo) returns Error? = @java:Method {
108-
name: "setReplyTo",
109-
'class: "io.ballerina.stdlib.java.jms.JmsMessageUtils"
110-
} external;
111-
112-
isolated function externSetCorrelationId(handle message, string correlationId) returns Error? = @java:Method {
113-
name: "setCorrelationId",
114-
'class: "io.ballerina.stdlib.java.jms.JmsMessageUtils"
115-
} external;

ballerina/message_producer.bal

Lines changed: 3 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,8 @@ import ballerina/jballerina.java;
1818

1919
# JMS Message Producer client object to send messages to both queues and topics.
2020
public isolated client class MessageProducer {
21-
private final Session session;
22-
21+
2322
isolated function init(Session session, Destination? destination = ()) returns Error? {
24-
self.session = session;
2523
return self.externInit(session, destination);
2624
}
2725

@@ -37,12 +35,7 @@ public isolated client class MessageProducer {
3735
#
3836
# + message - Message to be sent to the JMS provider
3937
# + return - A `jms:Error` if there is an error or else `()`
40-
isolated remote function send(Message message) returns Error? {
41-
handle jmsMessage = check getJmsMessage(self.session, message);
42-
return self.externSend(jmsMessage);
43-
}
44-
45-
isolated function externSend(handle message) returns Error? = @java:Method {
38+
isolated remote function send(Message message) returns Error? = @java:Method {
4639
name: "send",
4740
'class: "io.ballerina.stdlib.java.jms.producer.Actions"
4841
} external;
@@ -55,13 +48,7 @@ public isolated client class MessageProducer {
5548
# + destination - Destination used for the message sender
5649
# + message - Message to be sent to the JMS provider
5750
# + return - A `jms:Error` if there is an error or else `()`
58-
isolated remote function sendTo(Destination destination, Message message) returns Error? {
59-
handle jmsMessage = check getJmsMessage(self.session, message);
60-
return self.externSendTo(self.session, destination, jmsMessage);
61-
}
62-
63-
isolated function externSendTo(Session session, Destination destination, handle message)
64-
returns Error? = @java:Method {
51+
isolated remote function sendTo(Destination destination, Message message) returns Error? = @java:Method {
6552
name: "sendTo",
6653
'class: "io.ballerina.stdlib.java.jms.producer.Actions"
6754
} external;
@@ -75,72 +62,3 @@ public isolated client class MessageProducer {
7562
'class: "io.ballerina.stdlib.java.jms.producer.Actions"
7663
} external;
7764
};
78-
79-
isolated function getJmsMessage(Session session, Message message) returns handle|Error {
80-
handle jmsMessage = check constructJmsMessage(session, message);
81-
check updateReplyToMessageField(session, jmsMessage, message.replyTo);
82-
check updateCorrelationIdField(jmsMessage, message.correlationId);
83-
return jmsMessage;
84-
}
85-
86-
const string TEXT = "TEXT";
87-
const string BYTES = "BYTES";
88-
const string MAP = "MAP";
89-
90-
isolated function constructJmsMessage(Session session, Message message) returns handle|Error {
91-
if message is TextMessage {
92-
handle jmsMessage = check session.createJmsMessage(TEXT);
93-
error? result = trap externWriteText(jmsMessage, java:fromString(message.content));
94-
if result is error {
95-
return error Error(result.message());
96-
}
97-
return jmsMessage;
98-
} else if message is BytesMessage {
99-
handle jmsMessage = check session.createJmsMessage(BYTES);
100-
error? result = trap externWriteBytes(jmsMessage, message.content);
101-
if result is error {
102-
return error Error(result.message());
103-
}
104-
return jmsMessage;
105-
} else if message is MapMessage {
106-
handle jmsMessage = check session.createJmsMessage(MAP);
107-
error? result = trap populateMapMessage(jmsMessage, message.content);
108-
if result is error {
109-
return error Error(result.message());
110-
}
111-
return jmsMessage;
112-
}
113-
return error Error("Unidentified message type");
114-
}
115-
116-
isolated function updateReplyToMessageField(Session session, handle jmsMessage,
117-
Destination? replyTo = ()) returns Error? {
118-
if replyTo is () {
119-
return;
120-
}
121-
check externSetReplyTo(session, jmsMessage, replyTo);
122-
}
123-
124-
isolated function updateCorrelationIdField(handle jmsMessage, string? correlationId = ()) returns Error? {
125-
if correlationId is () {
126-
return;
127-
}
128-
check externSetCorrelationId(jmsMessage, correlationId);
129-
}
130-
131-
isolated function populateMapMessage(handle mapMessage, map<anydata> keyValues) returns error? {
132-
foreach string 'key in keyValues.keys() {
133-
var value = keyValues.get('key);
134-
if value is int {
135-
check externSetLong(mapMessage, java:fromString('key), value);
136-
} else if value is float {
137-
check externSetDouble(mapMessage, java:fromString('key), value);
138-
} else if value is boolean {
139-
check externSetBoolean(mapMessage, java:fromString('key), value);
140-
} else if value is string {
141-
check externSetString(mapMessage, java:fromString('key), java:fromString(value));
142-
} else if value is byte[] {
143-
check externSetBytes(mapMessage, java:fromString('key), value);
144-
}
145-
}
146-
}

ballerina/tests/failover_connection_tests.bal

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,13 @@ isolated function testQueueWithTextMessageWithFailover() returns error? {
4141
});
4242

4343
string content = "This is a sample message";
44-
TextMessage message = {
45-
content: content
44+
Message message = {
45+
content
4646
};
4747
check failoverQueueProducer->send(message);
4848
Message? response = check failoverQueueConsumer->receive(5000);
49-
test:assertTrue(response is TextMessage, "Invalid message type received");
50-
if response is TextMessage {
49+
test:assertTrue(response is Message, "Invalid message type received");
50+
if response is Message {
5151
test:assertEquals(response.content, content, "Invalid payload");
5252
}
5353

@@ -69,13 +69,13 @@ isolated function testTopicWithTextMessageWithFailover() returns error? {
6969
});
7070

7171
string content = "This is a sample message";
72-
TextMessage message = {
73-
content: content
72+
Message message = {
73+
content
7474
};
7575
check failoverTopicProducer->send(message);
7676
Message? response = check failoverTopicConsumer->receive(5000);
77-
test:assertTrue(response is TextMessage, "Invalid message type received");
78-
if response is TextMessage {
77+
test:assertTrue(response is Message, "Invalid message type received");
78+
if response is Message {
7979
test:assertEquals(response.content, content, "Invalid payload");
8080
}
8181

0 commit comments

Comments
 (0)