Добавление сообщений в IAsyncCollector Вывод темы с идентификатором сеанса - PullRequest
0 голосов
/ 02 октября 2018

Можно ли в настоящее время отправлять сообщения в вывод темы IAsyncCollector из функций Azure, а также устанавливать идентификатор сеанса?Мои темы действительно касались порядка FIFO, и поэтому нам пришлось настраивать сессии.Из-за этого мы представили, что просто устанавливаем Guid в качестве уникального идентификатора сеанса.Я знаю, как я буду отправлять сообщения в мою тему через этот вывод, но, конечно, это ошибки, поскольку мы не устанавливаем идентификатор сессии явно.Можно ли установить это где-то в коде, когда мы отправляем его в IAsyncCollector?

Вот что у нас есть,

[FunctionName("AccountCreatedHook")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req,
    TraceWriter log, [ServiceBus("topic-name", Connection = "busname", EntityType = Microsoft.Azure.WebJobs.ServiceBus.EntityType.Topic)] IAsyncCollector<AccountEventDTO> accountCreatedTopic)
{
    log.Info("C# HTTP trigger function processed a request.");

    // Get request body
    var accountEvent = await req.Content.ReadAsAsync<AccountEventDTO>();
    var payload = req.Content.ReadAsStringAsync().Result;

    if (accountEvent != null && accountEvent.Name != null)
    {
        await accountCreatedTopic.AddAsync(accountEvent);
        return req.CreateResponse(HttpStatusCode.OK, "Account successfully added to topic.");
    }

    return req.CreateResponse(HttpStatusCode.BadRequest, "Account was not formed well.");
}

1 Ответ

0 голосов
/ 02 октября 2018

Вместо привязки к вашему AccountEventDTO напрямую вам нужно привязать к Message (функции Azure v2) или BrokeredMessage (функции Azure v1).Затем вы можете установить свойство SessionId в сообщении.

Чтобы задать тело сообщения, сериализуйте ваш DTO как JSON, а UTF-8 закодируйте его:

var bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(accountEvent));
var message = new Message(bytes) { SessionId = sessionId };

для v2или

var bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(accountEvent));
var memoryStream = new MemoryStream(bytes, writable: false);
var message = new BrokeredMessage(memoryStream) { SessionId = sessionId };

для версии 1.

...