XML sturen via Symfony naar labelsoftware

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • maarud
  • Registratie: Mei 2005
  • Laatst online: 22:03
Ik zit te proberen om een labelprogramma aan te sturen via een XML file.

De manual zegt als volgt:

The XML Monitor will monitor a directory or TCP/IP port waiting for a compatible XML file to be initiated.

So far so good. Ik heb een XML bestand gemaakt via de ingebouwde generator, ik plaats hem in het mapje wat ik laat monitoren, en de labels worden geprint. Nadien wordt de XML verwijderd (instelling in de XML monitor).

Dus, volgende stap, ik heb in Symfony een XML Twig template gemaakt, een form erbij geknutseld, een FileSystem plugin geinstalleerd in Symfony en voila, een prachtig XML bestandje, precies zoals hij ook door de generator gemaakt is.

Maar, zodra het bestandje in de folder op een network mapped drive komt, blijft hij gewoon staan en wordt niet verwijderd (en dus niet verwerkt). Als ik het bestand CTRL-C, CTRL-V doe, waardoor ik een kopie krijg, dan wordt deze wel verwerkt. Het lijkt wel alsof de XML monitor geen nieuw bestand ziet als de webserver hem in een mapje plaatst.

Nu kan ik:
a) zorgen dat een door Symfony geplaatst bestand ook als nieuw bestand wordt gezien
b) ipv de directory monitor de TCP/IP functie gebruik, maar ik weet niet hoe dat werkt (wellicht met fsockopen() en dan het xml-bestand sturen?).

Vraag:
Hoe kan ik mijn gewenste doel bereiken?

Acties:
  • 0 Henk 'm!

  • maarud
  • Registratie: Mei 2005
  • Laatst online: 22:03
Oplossing:

Eerst even onderzocht wat er nu precies gebeurt bij het maken van een XML bestand met PowerShell
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$folder = '<full path to the folder to watch>'
$filter = '*.*'                             # <-- set this according to your requirements
$destination = '<full path to the destination folder>'
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
 IncludeSubdirectories = $true              # <-- set this according to your requirements
 NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}
$onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
 $path = $Event.SourceEventArgs.FullPath
 $name = $Event.SourceEventArgs.Name
 $changeType = $Event.SourceEventArgs.ChangeType
 $timeStamp = $Event.TimeGenerated
 Write-Host "The file '$name' was $changeType at $timeStamp"
 Move-Item $path -Destination $destination -Force -Verbose # Force will overwrite files with same name
}


Blijkt dus dat er een .tmp bestand wordt gemaakt, die vervolgens hernoemd wordt naar het .xml bestand. Dit klopt met de Symfony FileSystem specs:
dumpFile() allows you to dump contents to a file. It does this in an atomic manner: it writes a temporary file first and then moves it to the new file location when it's finished. This means that the user will always see either the complete old file or complete new file (but never a partially-written file)
Maar blijkbaar accepteert de (verouderde) XML monitor dit niet.

De Move-Item naar een andere map, en dié monitoren, deed het ook niet.

De oplossing? Maak een kopie (met Copy-Item) in dezelfde map, en verwijder het origineel. Dat werkt wel! Vervolgens verwijderd de XML Monitor wel de kopie na het verwerken.

Met behulp van
code:
1
Register-ObjectEvent $fsw Changed

kan ik de Copy-Item uitvoeren zodra het bestand gerenamed is.