Adapteur UDP ne fonctionne pas
Bonjour
J'essaie de travailler avec l'Adapteur/Connection UDP- et j'ai cette erreur .
Voici la méthode
{
Parameter ADAPTER = "EnsLib.UDP.OutboundAdapter";
Property Adapter As EnsLib.UDP.OutboundAdapter;
Method SendData(pInput As Ens.Request, Output pOutput As Ens.Response) As %Status
{
Try {
Set status=$$$OK
Set pOutput=##class(Ens.Response).%New()
Set stream = ##class(%Stream.GlobalCharacter).%New()
Do stream.Write("This is some text")
$$$LOGINFO(stream.Read())
Do stream.Rewind()
Set status = ..Adapter.SendStream(stream)
}
Catch exception {
Set status=exception.AsStatus()
}
Return status
}
XData MessageMap
{
<MapItems>
<MapItem MessageType="Ens.Request">
<Method>SendData</Method>
</MapItem>
</MapItems>
}
}
J'ai essayé avec ##class(%Net.UDP).%New() et cela fonctionne.
Quelqu'un a t'il une idée de pourquoi cela ne fonctionne pas ou des exemples d'une méthode fonctionnel, s'il vous plaît?
Par avance, merci
Corentin
PS : Pour ceux qui ne veulent pas explorer le code pour trouver la ligne où est généré l'erreur :
Set tStatus = 1
Try {
Do pBuffer.Rewind()
Use pDevice Do pBuffer.OutputToDevice()
Use pDevice Write !
}
Catch eSend {
Set tStatus = eSend.AsStatus()
}
Quit tStatus }
Bonjour @Corentin Blondeau
Je n'ai pas pu tester par moi-même, mais intuitivement je pense qu'il manque une une Instruction "Open" pour que le "Use" et "Write" puisse fonctionner.
Essayez avec un appel à la méthode Open de l'adapter avant le SendStream:
$$$TOE(status,..Adapter.Open(..Adapter.Device)) Set status = ..Adapter.SendStream(stream) Do ..Adapter.Close(..Adapter.Device)
Bonjour
En utilisant ..Adapter.Open, je me prend un Timeout,
ERREUR #5001: Timed out while opening device: c:\intersystems\ensemble\bin/udpsend 127.0.0.1 3001
L'adapter le fait déjà sur le OnInit()
PPS : pour pouvoir tester simplement, et avoir un récepteur UDP, il suffit d'éxécuter dans le terminal :
Set sobj = ##class(%Net.UDP).%New(3001,"127.0.0.1") zwrite sobj.Recv()
Oui en effet!
On ne trouve malheureusement aucun exemple d'utilisation de cet adapter et je me demande s'il est bien fonctionnel.
En suivant le code de la méthode "OnInit", ensuite la méthode "Open", on retrouve la ligne:
Open pDevice:(pParameters):pTimeout
qParameters me semble bien trop light, dans votre cas, ça reviendrait à faire :
Open "c:\intersystems\ensemble\bin/udpsend 127.0.0.1 3001":("WQ"):5
En TCP on ferait quelque chose ressemblant à :
OPEN "|TCP|3001":("127.0.0.1":3001):5
Je n'ai pas trouvé de documentation qui traite sur l'utilisation du protocol UDP directement avec les commandes Open Use Write donc j'ai tenté d'investiguer en comparant avec la classe "%Net.UDP", mais je suis bloqué sur "$system.UDP.Init(host,port,timeout,sendsiz,rcvsiz)", impossible voir le code qui se cache derrière et donc l'éventuelle utilisation de la commande "Open".
Si vous avez un accès au WRC vous pouvez leur poser la question.
Update :
J'ai crée un ticket au WRC. En effet, il y a un bug, l'adatper ne fonctionne pas.
On doit utiliser le ##class(%Net.UDP).%New()
Corentin
Je m'en doutais.
Merci pour le feedback :-)
Lorenzo.