Set message durable as default (#46)
* set message durable as default * related to https://github.com/rabbitmq/rabbitmq-server/pull/13918 --------- Signed-off-by: Gabriele Santomaggio <G.santomaggio@gmail.com>
This commit is contained in:
parent
ca3cc92d5c
commit
ebc9a3435c
|
|
@ -62,7 +62,7 @@ RabbitMQ supports the following DeliveryState types:
|
||||||
- StateRejected
|
- StateRejected
|
||||||
See: https://www.rabbitmq.com/docs/next/amqp#outcomes for more information.
|
See: https://www.rabbitmq.com/docs/next/amqp#outcomes for more information.
|
||||||
|
|
||||||
Note: If the destination address is not defined during the creation, the message must have a TO property set.
|
If the destination address is not defined during the creation, the message must have a TO property set.
|
||||||
You can use the helper "MessagePropertyToAddress" to create the destination address.
|
You can use the helper "MessagePropertyToAddress" to create the destination address.
|
||||||
See the examples:
|
See the examples:
|
||||||
Create a new publisher that sends messages to a specific destination address:
|
Create a new publisher that sends messages to a specific destination address:
|
||||||
|
|
@ -84,6 +84,16 @@ Create a new publisher that sends messages based on message destination address:
|
||||||
..:= MessagePropertyToAddress(msg, &QueueAddress{Queue: "myQueueName"})
|
..:= MessagePropertyToAddress(msg, &QueueAddress{Queue: "myQueueName"})
|
||||||
..:= publisher.Publish(context.Background(), msg)
|
..:= publisher.Publish(context.Background(), msg)
|
||||||
|
|
||||||
|
</code>
|
||||||
|
|
||||||
|
The message is persistent by default by setting the Header.Durable to true when Header is nil.
|
||||||
|
You can set the message to be non-persistent by setting the Header.Durable to false.
|
||||||
|
Note:
|
||||||
|
When you use the `Header` is up to you to set the message properties,
|
||||||
|
You need set the `Header.Durable` to true or false.
|
||||||
|
|
||||||
|
<code>
|
||||||
|
|
||||||
</code>
|
</code>
|
||||||
*/
|
*/
|
||||||
func (m *Publisher) Publish(ctx context.Context, message *amqp.Message) (*PublishResult, error) {
|
func (m *Publisher) Publish(ctx context.Context, message *amqp.Message) (*PublishResult, error) {
|
||||||
|
|
@ -97,6 +107,14 @@ func (m *Publisher) Publish(ctx context.Context, message *amqp.Message) (*Publis
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set the default persistence to the message
|
||||||
|
if message.Header == nil {
|
||||||
|
message.Header = &amqp.MessageHeader{
|
||||||
|
Durable: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
r, err := m.sender.Load().SendWithReceipt(ctx, message, nil)
|
r, err := m.sender.Load().SendWithReceipt(ctx, message, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
||||||
|
|
@ -203,4 +203,65 @@ var _ = Describe("AMQP publisher ", func() {
|
||||||
|
|
||||||
Expect(connection.Close(context.Background())).To(BeNil())
|
Expect(connection.Close(context.Background())).To(BeNil())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("Message should durable by default", func() {
|
||||||
|
// https://github.com/rabbitmq/rabbitmq-server/pull/13918
|
||||||
|
|
||||||
|
// Here we test the default behavior of the message durability
|
||||||
|
// The lib should set the Header.Durable to true by default
|
||||||
|
// when the Header is set by the user
|
||||||
|
// it is up to the user to set the Header.Durable to true or false
|
||||||
|
connection, err := Dial(context.Background(), "amqp://", nil)
|
||||||
|
Expect(err).To(BeNil())
|
||||||
|
Expect(connection).NotTo(BeNil())
|
||||||
|
name := generateNameWithDateTime("Message should durable by default")
|
||||||
|
_, err = connection.Management().DeclareQueue(context.Background(), &QuorumQueueSpecification{
|
||||||
|
Name: name,
|
||||||
|
})
|
||||||
|
Expect(err).To(BeNil())
|
||||||
|
|
||||||
|
publisher, err := connection.NewPublisher(context.Background(), &QueueAddress{Queue: name}, nil)
|
||||||
|
Expect(err).To(BeNil())
|
||||||
|
Expect(publisher).NotTo(BeNil())
|
||||||
|
|
||||||
|
msg := NewMessage([]byte("hello"))
|
||||||
|
Expect(msg.Header).To(BeNil())
|
||||||
|
publishResult, err := publisher.Publish(context.Background(), msg)
|
||||||
|
Expect(err).To(BeNil())
|
||||||
|
Expect(publishResult).NotTo(BeNil())
|
||||||
|
Expect(publishResult.Outcome).To(Equal(&StateAccepted{}))
|
||||||
|
Expect(msg.Header).NotTo(BeNil())
|
||||||
|
Expect(msg.Header.Durable).To(BeTrue())
|
||||||
|
|
||||||
|
consumer, err := connection.NewConsumer(context.Background(), name, nil)
|
||||||
|
Expect(err).To(BeNil())
|
||||||
|
Expect(consumer).NotTo(BeNil())
|
||||||
|
dc, err := consumer.Receive(context.Background())
|
||||||
|
Expect(err).To(BeNil())
|
||||||
|
Expect(dc).NotTo(BeNil())
|
||||||
|
Expect(dc.Message().Header).NotTo(BeNil())
|
||||||
|
Expect(dc.Message().Header.Durable).To(BeTrue())
|
||||||
|
Expect(dc.Accept(context.Background())).To(BeNil())
|
||||||
|
|
||||||
|
msgNotPersistent := NewMessage([]byte("hello"))
|
||||||
|
msgNotPersistent.Header = &amqp.MessageHeader{
|
||||||
|
Durable: false,
|
||||||
|
}
|
||||||
|
publishResult, err = publisher.Publish(context.Background(), msgNotPersistent)
|
||||||
|
Expect(err).To(BeNil())
|
||||||
|
Expect(publishResult).NotTo(BeNil())
|
||||||
|
Expect(publishResult.Outcome).To(Equal(&StateAccepted{}))
|
||||||
|
Expect(msgNotPersistent.Header).NotTo(BeNil())
|
||||||
|
Expect(msgNotPersistent.Header.Durable).To(BeFalse())
|
||||||
|
dc, err = consumer.Receive(context.Background())
|
||||||
|
Expect(err).To(BeNil())
|
||||||
|
Expect(dc).NotTo(BeNil())
|
||||||
|
Expect(dc.Message().Header).NotTo(BeNil())
|
||||||
|
Expect(dc.Message().Header.Durable).To(BeFalse())
|
||||||
|
Expect(dc.Accept(context.Background())).To(BeNil())
|
||||||
|
Expect(publisher.Close(context.Background())).To(BeNil())
|
||||||
|
Expect(connection.Management().DeleteQueue(context.Background(), name)).To(BeNil())
|
||||||
|
Expect(connection.Close(context.Background())).To(BeNil())
|
||||||
|
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -29,13 +29,18 @@ func (a *AmqpQueueInfo) Members() []string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func newAmqpQueueInfo(response map[string]any) *AmqpQueueInfo {
|
func newAmqpQueueInfo(response map[string]any) *AmqpQueueInfo {
|
||||||
|
leader := ""
|
||||||
|
if response["leader"] != nil {
|
||||||
|
leader = response["leader"].(string)
|
||||||
|
}
|
||||||
|
|
||||||
return &AmqpQueueInfo{
|
return &AmqpQueueInfo{
|
||||||
name: response["name"].(string),
|
name: response["name"].(string),
|
||||||
isDurable: response["durable"].(bool),
|
isDurable: response["durable"].(bool),
|
||||||
isAutoDelete: response["auto_delete"].(bool),
|
isAutoDelete: response["auto_delete"].(bool),
|
||||||
isExclusive: response["exclusive"].(bool),
|
isExclusive: response["exclusive"].(bool),
|
||||||
queueType: TQueueType(response["type"].(string)),
|
queueType: TQueueType(response["type"].(string)),
|
||||||
leader: response["leader"].(string),
|
leader: leader,
|
||||||
members: response["replicas"].([]string),
|
members: response["replicas"].([]string),
|
||||||
arguments: response["arguments"].(map[string]any),
|
arguments: response["arguments"].(map[string]any),
|
||||||
consumerCount: response["consumer_count"].(uint32),
|
consumerCount: response["consumer_count"].(uint32),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue