-
Notifications
You must be signed in to change notification settings - Fork 36
/
IKafkaProducerEndpointBuilder.cs
204 lines (193 loc) · 10.6 KB
/
IKafkaProducerEndpointBuilder.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
// Copyright (c) 2020 Sergio Aquilini
// This code is licensed under MIT license (see LICENSE file for details)
using System;
using Silverback.Messaging.Messages;
using Silverback.Messaging.Outbound.Routing;
namespace Silverback.Messaging.Configuration.Kafka
{
/// <summary>
/// Builds the <see cref="KafkaProducerEndpoint" />.
/// </summary>
public interface IKafkaProducerEndpointBuilder : IProducerEndpointBuilder<IKafkaProducerEndpointBuilder>
{
/// <summary>
/// Specifies the name of the topic and optionally the target partition.
/// </summary>
/// <param name="topicName">
/// The name of the topic.
/// </param>
/// <param name="partition">
/// The optional partition index. If <c>null</c> the partition is automatically derived from the message
/// key (use <see cref="KafkaKeyMemberAttribute" /> to specify a message key, otherwise a random one will be
/// generated).
/// </param>
/// <returns>
/// The <see cref="IKafkaProducerEndpointBuilder" /> so that additional calls can be chained.
/// </returns>
IKafkaProducerEndpointBuilder ProduceTo(string topicName, int? partition = null);
/// <summary>
/// Specifies the name of the topic and optionally the target partition.
/// </summary>
/// <param name="topicNameFunction">
/// The function returning the topic name for the message being produced. If the function returns
/// <c>null</c> the message will not be produced.
/// </param>
/// <param name="partitionFunction">
/// The optional function returning the target partition index for the message being produced. If <c>null</c>
/// the partition is automatically derived from the message key (use <see cref="KafkaKeyMemberAttribute" />
/// to specify a message key, otherwise a random one will be generated).
/// </param>
/// <returns>
/// The <see cref="IKafkaProducerEndpointBuilder" /> so that additional calls can be chained.
/// </returns>
IKafkaProducerEndpointBuilder ProduceTo(
Func<IOutboundEnvelope, string?> topicNameFunction,
Func<IOutboundEnvelope, int>? partitionFunction = null);
/// <summary>
/// Specifies the name of the topic and optionally the target partition.
/// </summary>
/// <typeparam name="TMessage">
/// The type of the messages being produced.
/// </typeparam>
/// <param name="topicNameFunction">
/// The function returning the topic name for the message being produced. If the function returns
/// <c>null</c> the message will not be produced.
/// </param>
/// <param name="partitionFunction">
/// The optional function returning the target partition index for the message being produced. If <c>null</c>
/// the partition is automatically derived from the message key (use <see cref="KafkaKeyMemberAttribute" />
/// to specify a message key, otherwise a random one will be generated).
/// </param>
/// <returns>
/// The <see cref="IKafkaProducerEndpointBuilder" /> so that additional calls can be chained.
/// </returns>
IKafkaProducerEndpointBuilder ProduceTo<TMessage>(
Func<IOutboundEnvelope<TMessage>, string?> topicNameFunction,
Func<IOutboundEnvelope<TMessage>, int>? partitionFunction = null)
where TMessage : class;
/// <summary>
/// Specifies the name of the topic and optionally the target partition.
/// </summary>
/// <param name="topicNameFunction">
/// The function returning the topic name for the message being produced. If the function returns
/// <c>null</c> the message will not be produced.
/// </param>
/// <param name="partitionFunction">
/// The optional function returning the target partition index for the message being produced. If <c>null</c>
/// the partition is automatically derived from the message key (use <see cref="KafkaKeyMemberAttribute" />
/// to specify a message key, otherwise a random one will be generated).
/// </param>
/// <returns>
/// The <see cref="IKafkaProducerEndpointBuilder" /> so that additional calls can be chained.
/// </returns>
IKafkaProducerEndpointBuilder ProduceTo(
Func<IOutboundEnvelope, IServiceProvider, string?> topicNameFunction,
Func<IOutboundEnvelope, IServiceProvider, int>? partitionFunction = null);
/// <summary>
/// Specifies the name of the topic and optionally the target partition.
/// </summary>
/// <typeparam name="TMessage">
/// The type of the messages being produced.
/// </typeparam>
/// <param name="topicNameFunction">
/// The function returning the topic name for the message being produced. If the function returns
/// <c>null</c> the message will not be produced.
/// </param>
/// <param name="partitionFunction">
/// The optional function returning the target partition index for the message being produced. If <c>null</c>
/// the partition is automatically derived from the message key (use <see cref="KafkaKeyMemberAttribute" />
/// to specify a message key, otherwise a random one will be generated).
/// </param>
/// <returns>
/// The <see cref="IKafkaProducerEndpointBuilder" /> so that additional calls can be chained.
/// </returns>
IKafkaProducerEndpointBuilder ProduceTo<TMessage>(
Func<IOutboundEnvelope<TMessage>, IServiceProvider, string?> topicNameFunction,
Func<IOutboundEnvelope<TMessage>, IServiceProvider, int>? partitionFunction = null)
where TMessage : class;
/// <summary>
/// Specifies the name of the topic and optionally the target partition.
/// </summary>
/// <param name="topicNameFormatString">
/// The endpoint name format string that will be combined with the arguments returned by the
/// <paramref name="topicNameArgumentsFunction" /> using a <c>string.Format</c>.
/// </param>
/// <param name="topicNameArgumentsFunction">
/// The function returning the arguments to be used to format the string.
/// </param>
/// <param name="partitionFunction">
/// The optional function returning the target partition index for the message being produced. If <c>null</c>
/// the partition is automatically derived from the message key (use <see cref="KafkaKeyMemberAttribute" />
/// to specify a message key, otherwise a random one will be generated).
/// </param>
/// <returns>
/// The <see cref="IKafkaProducerEndpointBuilder" /> so that additional calls can be chained.
/// </returns>
IKafkaProducerEndpointBuilder ProduceTo(
string topicNameFormatString,
Func<IOutboundEnvelope, string[]> topicNameArgumentsFunction,
Func<IOutboundEnvelope, int>? partitionFunction = null);
/// <summary>
/// Specifies the name of the topic and optionally the target partition.
/// </summary>
/// <typeparam name="TMessage">
/// The type of the messages being produced.
/// </typeparam>
/// <param name="topicNameFormatString">
/// The endpoint name format string that will be combined with the arguments returned by the
/// <paramref name="topicNameArgumentsFunction" /> using a <c>string.Format</c>.
/// </param>
/// <param name="topicNameArgumentsFunction">
/// The function returning the arguments to be used to format the string.
/// </param>
/// <param name="partitionFunction">
/// The optional function returning the target partition index for the message being produced. If <c>null</c>
/// the partition is automatically derived from the message key (use <see cref="KafkaKeyMemberAttribute" />
/// to specify a message key, otherwise a random one will be generated).
/// </param>
/// <returns>
/// The <see cref="IKafkaProducerEndpointBuilder" /> so that additional calls can be chained.
/// </returns>
IKafkaProducerEndpointBuilder ProduceTo<TMessage>(
string topicNameFormatString,
Func<IOutboundEnvelope<TMessage>, string[]> topicNameArgumentsFunction,
Func<IOutboundEnvelope<TMessage>, int>? partitionFunction = null)
where TMessage : class;
/// <summary>
/// Specifies the type of the <see cref="IKafkaProducerEndpointNameResolver" /> to be used to resolve the
/// actual endpoint name and partition.
/// </summary>
/// <typeparam name="TResolver">
/// The type of the <see cref="IKafkaProducerEndpointNameResolver" /> to be used.
/// </typeparam>
/// <returns>
/// The <see cref="IKafkaProducerEndpointBuilder" /> so that additional calls can be chained.
/// </returns>
IKafkaProducerEndpointBuilder UseEndpointNameResolver<TResolver>()
where TResolver : IKafkaProducerEndpointNameResolver;
/// <summary>
/// Uses the specified value provider function to set the kafka key for each produced message.
/// </summary>
/// <typeparam name="TMessage">
/// The type of the messages to be enriched.
/// </typeparam>
/// <param name="valueProvider">
/// The value provider function.
/// </param>
/// <returns>
/// The endpoint builder so that additional calls can be chained.
/// </returns>
IKafkaProducerEndpointBuilder WithKafkaKey<TMessage>(Func<IOutboundEnvelope<TMessage>, object?> valueProvider)
where TMessage : class;
/// <summary>
/// Configures the Kafka client properties.
/// </summary>
/// <param name="configAction">
/// An <see cref="Action{T}" /> that takes the <see cref="KafkaProducerConfig" /> and configures it.
/// </param>
/// <returns>
/// The <see cref="IKafkaProducerEndpointBuilder" /> so that additional calls can be chained.
/// </returns>
IKafkaProducerEndpointBuilder Configure(Action<KafkaProducerConfig> configAction);
}
}