2017-03-21 3 views
2

저는 Azure 함수를 가지고 있으며 EventHub에서 메시지를 가져 와서 (이 작업은 매우 간단하고 효과적입니다) 런타임에 테이블 바인딩을 사용하여 해당 정보를 테이블 저장소에 저장하려고합니다. 여기 Azure 함수를 테이블 저장소에 저장

는 지금까지이 작업은 다음과 같습니다

public static async Task Run(string eventHubMessage, TraceWriter log, Binder binder) 
{ 
    var m = JsonConvert.DeserializeObject<Measurement>(eventHubMessage); 
    var attributes = new Attribute[] 
    { 
     new StorageAccountAttribute("AzureWebJobsTest"), 
     new TableAttribute(tableName, m.PartitionKey, m.RowKey) 
    }; 

    using(var output = await binder.BindAsync<MyTableEntity>(attributes)) 
    { 
     if(output == null) 
      log.Info($"4. output is null"); 
     else 
     { 
      output.Minimum = m.Minimum; 
      output.Maximum = m.Maximum; 
      output.Average = m.Average; 
      output.Timestamp = m.Timestamp; 
      output.ETag = m.ETag; 

      output.WriteEntity(/* Need an operationContext*/) 
     } 
    } 
} 
public class MyTableEntity : TableEntity, IDisposable 
{ 
    public double Average { get; set;} 
    public double Minimum { get; set;} 
    public double Maximum { get; set;} 

    bool disposed = false; 
    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this);   
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     if (disposed) 
     return; 

     if (disposing) 
     { 
     } 

     disposed = true; 
    } 
} 

내 문제;

1) 출력은 이고 항상입니다.

2) 출력이 null이 아니더라도 OperationContext에 필요한 항목이나 ITableEntity.Write()를 호출하여 테이블 저장소에 쓸 수있는 올바른 방법인지 알 수 없습니다.

ETA JSON 바인딩 :

{ 
    "bindings": [ 
    { 
     "type": "eventHubTrigger", 
     "name": "eventHubMessage", 
     "direction": "in", 
     "path": "measurements", 
     "connection": "MeasurementsConnectionString" 
    } 
    ], 
    "disabled": false 
} 
+0

@mikhail, JSON을 추가했습니다. 나는 허브에서 전달되는 tablename을 기반으로 런타임에 바인딩을 수행하려고합니다. 나는 많은 테이블을 가지고 있고 나는 명령형 바인딩이 필요하다. – Stuart

답변

3

가 대신 개체 자체의 IAsyncCollector에 결합한다 표에 새 항목을 추가하려면, 새로운 엔티티를 생성하고 AddAsync를 호출합니다. 다음 스 니펫은 나를 위해 작동합니다.

var attributes = new Attribute[] 
{ 
    new StorageAccountAttribute("..."), 
    new TableAttribute("...") 
}; 

var output = await binder.BindAsync<IAsyncCollector<MyTableEntity>>(attributes);  
await output.AddAsync(new MyTableEntity() 
{ 
    PartitionKey = "...", 
    RowKey = "...", 
    Minimum = ..., 
    ... 
}); 
+0

고마워, 그게 효과가있어. 이제는 함수가 끝날 때마다 이것을 얻습니다. 'Microsoft.Azure.WebJobs.Host : 함수가 반환 된 후 매개 변수 바인더를 처리하는 동안 오류가 발생했습니다. Microsoft.WindowsAzure.Storage : 지정된 엔터티가 이미 있습니다. '중복 된 항목을 삽입하려고했기 때문에이 작업이 수행됩니까? – Stuart

+0

예, 동일한 파티션/행 키를 두 번 삽입하려고합니다. 업데이트 [예제] (http://stackoverflow.com/a/36805728/1171619)의 예를 참조하십시오. – Mikhail