Question
· Jan 6

Adapteur UDP ne fonctionne pas

Bonjour

J'essaie de travailler avec l'Adapteur/Connection UDP- et j'ai cette erreur .

ERREUR #5002: Erreur Cache: <WRITE>zSend+5^EnsLib.UDP.Common.1

 Voici la méthode
 

Class TEMPLATE.BO.UDPSend Extends Ens.BusinessOperation
{

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 :

zSend(pDevice="",pBuffer) public { Set:'($data(pBuffer)#2) pBuffer=""
    Set tStatus = 1
    Try {
        Do pBuffer.Rewind()
        Use pDevice Do pBuffer.OutputToDevice()
        Use pDevice Write !
    }
    Catch eSend {
        Set tStatus = eSend.AsStatus()
    }
    Quit tStatus }
Version du produit: Ensemble 2018.1
$ZV: Cache for Windows (x86-64) 2018.1.4 (Build 505_1U) Thu May 28 2020 10:01:40 EDT
Discussion (6)2
Connectez-vous ou inscrivez-vous pour continuer

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)

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.