====== Anwendungsfall: Schreibe Partnervariablenabhängig auf die Festplatte ======
In diesem HowTo erfahren Sie, welche Bedingungen für die Umsetzung eines eigenen Plugins nötig sind. Nachfolgend können Sie die Umsetzung anhand eines Anwendungsfalls nachvollziehen, in dem Attachments einer Nachricht auf die Festplatte geschrieben werden, sofern der Partner eine entsprechende Variable (mit einem Pfad) hinterlegt hat.
==== Erstellen der Jobstep-Klasse ====
Erstellen Sie hierfür zuerst ein neues Projekt in Visual Studio mit den Einstellungen:
* **Target framework**: mindestens **.NET Framework 4.5** (oder höher)
* **Projektreferenz**: die **eBiss.Api**, zufinden als .dll im eBiss Verzeichnis
*
Sie finden das komplette Projekt in Ihrem StandardTemplates-Unterverzeichnis von eBiss, unter: \StandardTemplates\PluginSample\eBiss.Plugin.Sample
Erstellen wir also zuerst unseren Jobstep mit dem Namen AttachmentWriter. Hierfür erbt unsere erstellte Klasse von einer abstrakten Klasse **ClientJobStepBase** und implementiert die Run() Methode. Des Weiteren benötigen wir noch private Methoden, die eine Partnervariable auslesen und mit Hilfe eines Streams das Attachment auf die Festplatte schreiben.
public class AttachmentWriter : ClientJobStepBase
{
#region Internal and private Member
private void WriteToFile(IAttachment attachment, string folder)
{
using (Stream readStream = attachment.OpenReadStream())
{
string outFn = attachment.Filename;
if (String.IsNullOrEmpty(outFn))
{
outFn = attachment.Oid + ".dat";
}
if (folder[folder.Length - 1] != '/' && folder[folder.Length - 1] != '\\')
{
folder += "\\";
}
string fn = folder + outFn;
LogContext.Debug("Write attachment to file: " + fn);
using (Stream writeStream = File.Create(fn))
{
byte[] fileBuff = new byte[1024];
int bytesRead = 0;
while ((bytesRead = readStream.Read(fileBuff, 0, fileBuff.Length)) > 0)
{
writeStream.Write(fileBuff, 0, bytesRead);
}
writeStream.Flush();
writeStream.Close();
}
}
}
private bool CheckVariableForWriteAttachment(IPartner partner)
{
ILocation loc = partner.MainLocation;
IVariableInstance writeAttachment = loc.VariableInstances.Where(v => v.VariableDefinition.Name == "WriteAttachment").FirstOrDefault();
if (writeAttachment != null)
return writeAttachment.Value_Bool;
return false;
}
private string GetPath(IPartner partner)
{
ILocation loc = partner.MainLocation;
IVariableInstance writeAttachmentPath = loc.VariableInstances.Where(v => v.VariableDefinition.Name == "AttachmentPath").FirstOrDefault();
if (writeAttachmentPath != null && string.IsNullOrWhiteSpace(writeAttachmentPath.Value_Text) == false)
{
string outPath = writeAttachmentPath.Value_Text;
if (!Directory.Exists(outPath))
{
throw new ApplicationException($"Path '{outPath}' from variable AttachmentPath for partner '{partner.Name}' is not a valid or existing directory.");
}
return outPath;
}
return null;
}
[...]
Anschließend wird die Run Methode ausprogrammiert und in unserem Fall ausreichend mit Hilfe des LogContext geloggt. Effektiv wird über eine Liste von Nachrichten iteriert und überprüft, ob der aktuelle Partner eine Variable mit dem Namen "WriteAttachment" besitzt. Anschließend wird mit der Variable "AttachmentPath" der entsprechende Pfad validiert und mit Hilfe des Streams das Attachment auf die Festplatte geschrieben. Im Fehlerfall werfen wir eine Exception und die Nachricht bekommt zusätzlich einen Task.
public override JobStepResult Run()
{
JobStepResult rc = JobStepResult.Ok;
LogContext.Debug("Enter");
foreach (IMessage msg in Job.InputMessages)
{
try
{
if (CheckVariableForWriteAttachment(msg.Partner) == false)
{
LogContext.Debug($"Variable 'WriteAttachment' not set or false for Partner '{msg.Partner.Name}'.");
}
else
{
string folder = GetPath(msg.Partner);
if (folder != null)
{
foreach (IAttachment attachment in msg.Attachments)
{
WriteToFile(attachment, folder);
}
}
else
{
throw new ApplicationException($"Variable 'AttachmentPath' for Partner '{msg.Partner.Name}' is not set.");
}
}
}
catch (Exception ex)
{
LogContext.Exception(ex);
this.Job.AddTask(msg, ex.Message);
rc = JobStepResult.Error;
}
}
LogContext.Debug("Exit with: " + rc.ToString());
return rc;
}
Erstellen Sie anschließend Ihr Projekt und kopieren die .dll in das eBiss Plugin-Unterverzeichnis. Sobald Sie den Dienst neugestartet haben, finden Sie Ihre Jobsteps im Workflow-Editor.
{{:howtos:plugins:jobsteps:jobexampletwo.png?nolink&500|}}
//Abb. 1: Jobstep im Workflow-Editor//