Neo
Neo

Reputation: 16239

Which way to use send messages into topic using azure function?

I found two ways to send messages into service bus topic from azure function.

one is using output -

[FunctionName("ServiceBusOutput")]
[return: ServiceBus("myqueue", Connection = "ServiceBusConnection")]
public static string ServiceBusOutput([HttpTrigger] dynamic input, ILogger log)
{
    log.LogInformation($"C# function processed: {input.Text}");
    return input.Text;
}

Another is using code -

const string ServiceBusConnectionString = "string";
const string TopicName = "topicName";
static ITopicClient topicClient;
topicClient = new TopicClient(ServiceBusConnectionString, TopicName);
string messageBody = "Test";
var message = new Message(Encoding.UTF8.GetBytes(messageBody));
await topicClient.SendAsync(message);

I'm not getting which one we should use and when?

  1. if we use Output how to pass queue name myqueue as a variable so that in code we can assign it.

  2. if i have array how can we return one by one message to output return which will send one by one message to queue ?

Upvotes: 0

Views: 606

Answers (2)

HariHaran
HariHaran

Reputation: 4179

  1. if we use Output how to pass queue name myqueue as a variable so that in code we can assign it.

For this you can use Imperative Binding.Imperative binding is useful when binding parameters need to be computed at runtime rather than design time. More reference here

Example:

public static async Task ServiceBusBinderTest(
 string message,
 int numMessages,
 Binder binder) {
 var attribute = new ServiceBusAttribute(BinderQueueName) {
  EntityType = EntityType.Queue
 };
 var collector = await binder.BindAsync < IAsyncCollector < string >> (attribute);

 for (int i = 0; i < numMessages; i++) {
  await collector.AddAsync(message + i);
 }

 await collector.FlushAsync();
}

if i have array how can we return one by one message to output return which will send one by one message to queue ?

You can configure the OnMessageOptions instance with decreasing your MaxConcurrentCalls

OnMessageOptions options = new OnMessageOptions();
options.AutoComplete = false;
options.MaxConcurrentCalls = 5;

Upvotes: 1

silent
silent

Reputation: 16198

Full examples from here. For instance, how to write multiple messages, using the ICollector

public static void Run(TimerInfo myTimer, ILogger log, [ServiceBus("myqueue", Connection = "ServiceBusConnection")] ICollector<string> outputSbQueue)
{
    string message = $"Service Bus queue messages created at: {DateTime.Now}";
    log.LogInformation(message); 
    outputSbQueue.Add("1 " + message);
    outputSbQueue.Add("2 " + message);
}

As far as I know the first version, using return does not work if you have any async calls inside your Function. The version using the collector can also work in async Functions but simply using an IAsyncCollector instead.

Upvotes: 2

Related Questions