Rechercher

Article
· Oct 28, 2024 3m de lecture

Soluciones para los Timeouts en Servicios SOAP

Hola a todos, hoy comentamos con un ejemplo cómo solucionar problemas relacionados con el TimeOut cuando se hacen llamadas a servicios SOAP.

Tomemos como ejemplo aplicaciones que proporcionen servicios SOAP que utilizan consultas SQL basadas en "DSTIME" para devolver registros que han sido añadidos o modificados recientemente. Como estos registros no cambian con frecuencia, estas consultas suelen devolver un número reducido de registros, lo cual implica un tiempo de procesamiento corto.

Sin embargo, en ocasiones realizamos cambios en una tabla que afectan a todos los registros en ella. Cuando eso ocurre, en la siguiente solicitud SOAP de un cliente, el servicio ejecutará su consulta, la cual tomará un tiempo adicionalmente largo porque incluirá todos los registros (en nuestras aplicaciones, las consultas devuelven cientos de miles de registros en este caso).

La cantidad de tiempo necesario para generar los resultados a veces supera el "timeout" predeterminado especificado en la conexión del gateway CSP para la instancia que aloja el servicio SOAP. Esto provoca que la conexión se cierre antes de que el cliente reciba los datos solicitados, y en su lugar, el cliente obtiene un mensaje de error como el siguiente:

ERROR #5002: ObjectScript error: InvokeClient+208^%SOAP.WebClient.1

El error se debe a un timeout. Esto podemos confirmarlo revisando los detalles del InterSystems IRIS SOAP Log.

En este caso, el log de mostraba esta información:

Input to Web client with SOAP action = http://www.intersystems.com/user/SOAPTest.SlowSOAPService.GetSlowService

ERROR #5922: Timed out waiting for response
string**** SOAP client return error. method=GetSlowService, action=http://www.intersystems.com/user/SOAPTest.SlowSOAPService.GetSlowService
     ERROR #5922: Timed out waiting for response

Para resolver este error, podemos añadir código para establecer un timeout de conexión en la instancia del cliente SOAP antes de llamar al método SOAP que utiliza esa consulta específica.

Habíamos ejecutado la consulta en la página SQL del Portal de Administración, exportando el resultado a un archivo CSV, y observamos que tardó más de 6 minutos en completarse. Por lo tanto, añadimos este código para aumentar el timeout a 10 minutos antes de llamar al servicio (los nombres se han cambiado para proteger a los inocentes 😊):

    #dim result As %XML.DataSet
    set wc = ##class(SlowSOAPService.WebClient.SlowSOAPServiceSoap).%New()
    set sc = wc.TimeoutSet(600)
    set sc = wc.GetSlowService(.result)

La clase `%SOAP.WebService` proporciona el método “TimeoutSet”, que solo cambia el valor de timeout de conexión para esa solicitud específica. No afecta el valor de timeout de la conexión del gateway CSP, que por defecto es un breve período de 30 segundos (para incentivar la escritura de código eficiente en el lado del servidor).

De hecho, para mantener ese incentivo, podemos asegurarnos de que el timeout extendido solo se utilice en los casos excepcionales en los que sea necesario, envolviendo el código del cliente en un condicional que verifique una variable global, de la siguiente manera:

    #dim result As %XML.DataSet
    set wc = ##class(SlowSOAPService.WebClient.SlowSOAPServiceSoap).%New()
    if (^reallySlowSvcExpectedTime > 0) {
        set sc = wc.TimeoutSet(^reallySlowSvcExpectedTime)
    }
    set sc = wc.GetSlowService(.result)

La global actúa tanto como un indicador (¿es mayor que 0? entonces establece el timeout) y como el número de segundos a esperar. Para el problema descrito al inicio de este artículo, notificaríamos a los clientes que deben configurar temporalmente una variable global utilizando un terminal IRIS conectado a su instancia de la siguiente manera:

    set ^reallySlowSvcExpectedTime = 600

Una vez que esperemos nuevamente a que el servicio devuelva rápidamente una pequeña cantidad de datos, los clientes pueden restablecerse para usar el timeout predeterminado configurando la variable global de nuevo a 0:

    set ^reallySlowSvcExpectedTime = 0
Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer
Question
· Oct 28, 2024

Load and compile error

Hello,

I am using the following: 

s status = $SYSTEM.OBJ.Load("myClassName," "c")

and while trying to compile it i get an error that a property or method does not exist, more specifically:

 

Method or Property 'basicToolbar' does not exist in this class.

it's important to say - basicToolbar DOES EXIST! If i manually compile this class through the studio, it will work and is runnable. 
only when using the Load command i get this error. 

what could possibly be wrong?
i also tried combination of different flags but fail to understand how is this possible.
 

3 Comments
Discussion (3)1
Connectez-vous ou inscrivez-vous pour continuer
Annonce
· Oct 28, 2024

¡20,000 miembros en la Comunidad de Desarrolladores de InterSystems!

Redoble de tambores, por favor...

🎉 ¡La Comunidad de Desarrolladores de InterSystems ha superado oficialmente los 20,000 miembros registrados! 🎉

Pero eso no es todo: también hemos alcanzado algunos hitos impresionantes:

📝 21,500 publicaciones

👁 10,000,000 visitas

¡Queremos dedicar un momento para celebrar con todos vosotros que habéis hecho esto posible!

En lo que parece un abrir y cerrar de ojos, ¡nuestra comunidad ha EXPLOTADO en tamaño! 🤯 ¡Hemos duplicado nuestro número en solo dos años! No se trata solo de números, sino del impacto que vosotros estáis generando, y no podríamos estar más agradecidos.

Este crecimiento fenomenal se debe a vosotros, nuestra increíble comunidad de desarrolladores, contribuyentes y pioneros. Ya sea compartiendo vuestra experiencia y conocimientos avanzados, haciendo preguntas que invitan a la reflexión o colaborando con otros, ¡sois el corazón de esta Comunidad! ❤️‍🔥 Estáis transformando esta plataforma en una potencia de ideas y soluciones, y ¡estamos aquí para ello!

🌍🫂 Con seis comunidades regionales en diferentes idiomas (EN, ES, PT, JP, CN, FR), estamos uniendo a desarrolladores de todo el mundo, haciendo de la Comunidad de Desarrolladores de InterSystems un verdadero centro global.

👏 Un agradecimiento especial a nuestros supermoderadores, gestores de contenido y administradores que mantienen esta increíble máquina funcionando sin problemas. ¡Vuestra dedicación mantiene los engranajes en movimiento, y no podríamos hacerlo sin vosotros!

¿Y adivina qué? ¡Esto es solo el comienzo!  
Estamos emocionados de seguir creciendo, aprendiendo e innovando JUNTOS. Ya seas nuevo en la comunidad o un miembro de larga data, hay mucho más por delante para todos nosotros.

¡GRACIAS!

---

Atentamente,  
El equipo de la Comunidad de Desarrolladores de InterSystems

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer
Question
· Oct 28, 2024

Rename a namespace has removed all my code

Hi all.

I hope you can help me.

I've renamed a namespace and its databases names.

  • Old Namespace: LABORATORIO
  • New namespace: SRV-LABORATORIO

The rename of all has worked fine. When I've tried to access to the portal, it is no available, displaying the message "Tha namespace SRV-LABORATORIO does not support productions"

So, I've run the following command in terminal

zn "SRV-LABORATORIO"
do ##class(%EnsembleMgr).EnableNamespace($namespace)

My IRIS has created the links to create the production.

Now, I've opened the portal but my code has disappear.

If all the code was into Routine database, Why do I only see the classes that are mapped to my namespace?

Where are the classes I had in the old namespace and stored in the routines database?

2 Comments
Discussion (2)2
Connectez-vous ou inscrivez-vous pour continuer
Annonce
· Oct 28, 2024

ボーナスポイント獲得状況:第2回 InterSystems Japan 技術文書ライティングコンテスト

開発者の皆さん、こんにちは!

第2回 技術文書ライティングコンテスト に応募された作品のボーナスポイント獲得状況をお知らせします📣(順位発表は11月1日を予定しています)

記事 EmbeddedPythonに関連する記事(4点) 生成AIに関連する記事(4点) FHIRに関連する記事(3点) コードの記述が含まれる記事(2点) 動作するコードサンプルをGitリポジトリへ公開する(5点) 記事の内容に関連した画面キャプチャや図を貼る(1点) 合計点
FHIR Object Modelを使ったInteroperability開発     11
UnitTest(ユニットテスト)の自動化について考察        

6

IRIS環境設定の自動化について~インストールマニフェストの利用~     12
Embedded Python を利用する時の注意点

      7
IRIS開発における生成AIの活用について       7
SourceControlを用いた自動ソースチェックツールについて       8

 

コンテストにご応募いただいた @Yusuke Kojima さん @Kosaku Ikeda さん @Saori Murata さん @Akio Hashimoto さん @So Ochi さん @Kawasaki Kazuhito さん、もし点数に間違いがある場合は、この記事のコメント欄やダイレクトメッセージでお知らせください!

まだ、「いいね」クリックによる投票を行っていないコミュニティメンバーの皆さんは、これだ🔥と思う作品にぜひ「いいね」してください!

投票方法については「投票受付中!:第2回 InterSystems Japan 技術文書ライティングコンテスト」の記事をご参照ください。

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer