New post

検索

Article
· Apr 1 6m read

Conjunto de mensajes huérfanos

En este artículo, hablaremos sobre los Mensajes Huérfanos.

¿Qué es un Mensaje Huérfano?

Cada cuerpo de mensaje está asociado con un encabezado de mensaje que contiene los metadatos. El encabezado incluye información como el nombre de la configuración de origen, el nombre de la configuración de destino, la hora de creación, la hora de procesamiento, la referencia asociada al cuerpo del mensaje, la información de sesión, el nombre de la clase del cuerpo del mensaje y el estado del mensaje.

Cuando existen registros de cuerpos de mensajes que no tienen sus correspondientes registros de encabezado, estos se denominan cuerpos de mensajes huérfanos. En este artículo, analizaremos las posibles causas que pueden generar cuerpos de mensajes huérfanos.

Purgar solo los Encabezados

En la configuración de la tarea de purga, el parámetro BodiesToo determina si se deben purgar también los cuerpos de los mensajes junto con sus encabezados. Si esta opción está desactivada, la tarea de purga eliminará solo los encabezados de los mensajes, dejando los cuerpos de los mensajes intactos. Estos cuerpos de mensajes se convertirán en registros huérfanos, ya que el encabezado de referencia habrá sido eliminado.

Si purgáis los encabezados de los mensajes pero conserváis los cuerpos de los mensajes, el Portal de Gestión no ofrecerá ninguna opción para purgar estos cuerpos de mensajes huérfanos. En este caso, deberéis eliminarlos de forma programada.

(Traducción de la foto de debajo)

Asistente del programador de tareas

Este asistente os ayuda a programar una tarea para su ejecución por el administrador de tareas o a editar los detalles de una tarea previamente programada. Para definir tareas personalizadas, primero debéis crear una nueva subclase de la clase %SYS.Task.Definition, que luego podrá seleccionarse como un "tipo de tarea".

 

Por favor, consultad la documentación sobre la tarea de purga.

http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=EGMG_purge#EGMG_purge_basic

Clases Message Body complejas (Propiedades que referencian objetos)

Cuando IRIS purga un cuerpo de mensaje, no necesariamente elimina los objetos referenciados en las propiedades de tipo objeto. Específicamente, elimina otros objetos solo si son objetos serializables o si son objetos secundarios (según una relación definida). Para otros objetos, debéis gestionar su eliminación adecuadamente definiendo un disparador de eliminación o implementando el method %OnDelete() en la body class del mensaje.

Un ejemplo de código para la implementación de OnDelete:

Class Sample.Address Extends %Persistent{
/// The street address.
Property Street As %String(MAXLEN = 80);
/// The city name.
Property City As %String(MAXLEN = 80);
/// The 2-letter state abbreviation.
Property State As %String(MAXLEN = 2);
/// The 5-digit U.S. Zone Improvement Plan (ZIP) code.
Property Zip As %String(MAXLEN = 5);
}
Class Sample.Person Extends %Persistent{
/// Person's name.
Property Name As %String [ Required ];
/// Person's Social Security number. This is validated using pattern match.
Property SSN As %String(PATTERN = "3N1""-""2N1""-""4N") [ Required ];
/// Person's Date of Birth.
Property DOB As %Date;
/// Person's home address.
Property Home As Address;
/// Person's office address.
Property Office As Address;
///Callback for object deletion
ClassMethod %OnDelete(oid As %ObjectIdentity) As %Status [ Private ]{
      // Delete the property object references.
      Set tSC = $$$OK, tThis = ##class(Sample.Person).%Open(oid)
      If $ISOBJECT(tThis.Home) Set tSC = ##class(Sample.Address).%DeleteId(tThis.Home.%Id())
      If $ISOBJECT(tThis.Office) Set tSC = ##class(Sample.Address).%DeleteId(tThis.Office.%Id())
      Quit tSC
}
///Callback/Trigger for SQL delete
Trigger OnDelete [ Event = DELETE ]{
      // Delete the property object references. {%%ID} holds the id of the record being deleted.
      Set tID={%%ID}
      Set tThis = ##class(Sample.Person).%OpenId(tID)
      If $ISOBJECT(tThis.Home) Do ##class(Sample.Address).%DeleteId(tThis.Home.%Id())
      If $ISOBJECT(tThis.Office) Do ##class(Sample.Address).%DeleteId(tThis.Office.%Id())
      Quit
}
}

Objetos de tipo Mensaje creados pero nunca enviados a otro host

Cuando un mensaje se envía o reenvía a otro host, IRIS crea un nuevo encabezado de mensaje y asocia el cuerpo de mensaje correspondiente. Si el cuerpo del mensaje/instancia de objeto creada en un Servicio/Proceso de Negocio se guarda en disco/base de datos pero nunca se envía a otro host en producción, no tendrá un encabezado asociado y permanecerá como un Message Body Huérfano. La mejor práctica es no crear un message body a menos que se vaya a reenviar o no llamar al método %Save() en la instancia del objeto (la API SendRequestSync/SendRequestAsync lo guardará antes de poner el mensaje en la cola de configuración de destino). De esta forma, el objeto cuerpo del mensaje no será persistido a menos que se envíe a otro host.

La razón más común de este problema es cuando los desarrolladores:

  • Clonan el cuerpo del mensaje y nunca reenvían el cuerpo del mensaje clonado.
  • Se crean objetos de cuerpo de mensaje en variables de Contexto (BPL) y nunca se reenvían.

Efectos de los Mensajes Huérfanos

Los mensajes huérfanos no serán eliminados por la tarea de purga. Estos mensajes consumirán espacio en disco y, a medida que aumente su número proporcionalmente, el uso del disco incrementará. El espacio en disco no solo provendrá de los datos del cuerpo del mensaje, sino también de cualquier índice/entradas de tabla de búsqueda para cada uno de estos registros de cuerpos de mensaje huérfanos.

Identificación de Mensajes Huérfanos

La existencia de mensajes huérfanos puede identificarse consultando el encabezado y el cuerpo del mensaje. Cada encabezado de mensaje hace referencia al cuerpo de mensaje correspondiente. La referencia al Id del objeto cuerpo de mensaje se almacena en la propiedad MessageBodyId del encabezado y el nombre de la clase del cuerpo del mensaje se almacena en la propiedad MessageBodyClassName del encabezado.

Un ejemplo de consulta para encontrar mensajes huérfanos en la tabla de mensajes HL7:

SELECT HL7.Id  FROM EnsLib_HL7.Message HL7

   LEFT JOIN Ens.MessageHeader hdr

   ON HL7.Id=hdr.MessageBodyId

   WHERE hdr.MessageBodyId IS NULL

La consulta anterior devolverá todos los mensajes HL7 que no tienen sus encabezados correspondientes. La consulta puede modificarse para consultar otros tipos de mensajes simplemente reemplazando el nombre de la tabla del message body.

Purgar Mensajes Huérfanos

El Portal de Gestión no proporciona una forma de purgar los cuerpos de mensajes huérfanos. En este caso, debemos purgar los cuerpos de los mensajes de mediante programación. 

Existe otra rutina escrita como referencia para ayudar a purgar los mensajes huérfanos, pero esta rutina no realiza una purga profunda y solo ayuda a eliminar los cuerpos de los mensajes. He incluido el enlace de GitHub a continuación para descargar el código fuente:

https://gist.github.com/suriyasv/2ed7f2dbcfd8c79f3b9938762c17c0b5

Importante: Esta rutina no se creó específicamente para IRIS (ver artículo original). Debe tomarse simplemente como referencia y ejemplo, pero no debe utilizarse directamente en sistemas en producción.

La mejor práctica es siempre:

  1. Evitar errores de programación (como se mencionó anteriormente) para prevenir mensajes huérfanos.
  2. Configurar la tarea de purga con la opción BodiesToo desactivada solo si es necesario conservar los cuerpos de los mensajes, sabiendo que estos solo podrán purgarse programáticamente.
  3. Implementar relaciones o métodos OnDelete para las propiedades de objetos persistentes.

Espero que este artículo os sea útil al construir vuestra producción. No dudéis en hacernos saber si tenéis preguntas o inquietudes. ¡Gracias!

Discussion (0)1
Log in or sign up to continue
Digest
· Apr 1

InterSystems 开发者社区摘要,三月 2025

您好,欢迎阅读 三月 2025 开发人员社区通讯。
统计信息
✓ 三月发布了 4 篇新帖子:
 3个新公告
 1个新问题
✓ 三月有 19 位新成员加入
✓ 所有时间发布了 2,373 篇帖子
✓ 所有时间有 2,166 位成员加入
最高职位
本月最佳作家
公告
#InterSystems IRIS
#开发者社区官方
开发者社区回顾, 二月 2025
按Kellin Zhang
计划维护通知
按Anastasia Dyubaylo
问题
三月, 2025Month at a GlanceInterSystems Developer Community
Article
· Apr 1 1m read

IRISから外部のWebAPIを呼び出したとき、レスポンス内の全角文字が化ける

これは InterSystems FAQ サイトの記事です。

Content-Typeにcharset 情報が含まれていない場合、IRIS/Cachéは文字コードを判断できず文字コード変換が行われません。

 

そこで、以下のように、「自動的な文字変換を行わず、UTF-8に変換する処理を記述」することで、その指定がある無しに関わらず、対応することができます。

 

 // requestオブジェクトは以下のように生成 
 // 詳細処理は省略
 // set request=##class(%Net.HttpRequest).%New()
 // リクエスト時に、文字変換を行わないように指定
 set request.ReadRawMode=1
 do request.Send("POST",URL)

 // 受取ったデータを、UTF-8に変換してから、JSON変換
 set response = request.HttpResponse.Data
 set data = response.Read()
 set data2 = $zcvt(data,"I","UTF8")
 set response = {}.%FromJSON(data2)
 write response.%ToJSON()

長い文字列が想定される場合には、一度のReadで読み込めない可能性があるため、以下のようなコーディングを行う必要があります。

 set stream=##class(%Stream.TmpCharacter).%New()

 while 'response.AtEnd {
   set data = response.Read()
   set data2 = $zcvt(data,"I","UTF8")
   do stream.Write(data2)
 }

 set res = {}.%FromJSON(stream)
 write res.%ToJSON() 
Discussion (0)1
Log in or sign up to continue
Article
· Apr 1 1m read

IRIS-Intelligent Butler

# IRIS-Intelligent Butler
IRIS Intelligent Butler is an AI intelligent butler system built on the InterSystems IRIS data platform, aimed at providing users with comprehensive intelligent life and work assistance through data intelligence, automated decision-making, and natural interaction.
## Application scenarios
 adding services, initializing configurations, etc. are currently being enriched
## Intelligent Butler
IRIS Smart Manager utilizes the powerful data management and AI capabilities of InterSystems IRIS to create a highly personalized, automated, secure, and reliable intelligent life and work assistant. Whether it is household users, enterprises, or medical institutions, IRIS can achieve smarter and more efficient daily management.
🚀  In the future, IRIS intelligent butler will continue to evolve and become a true "digital companion"!

## How to use it

### Prerequisites
Make sure you have git and Docker desktop installed.
### Installation
#### 1.Clone/git pull the repo into any local directory
```
git clone https://github.com/RenatoJanzai/IRIS-Intelligent-Butler.git
```  
#### Open the terminal in this directory and run

```
docker-compose build
```
#### Run the IRIS container 

```
docker-compose up -d
```

1 Comment
Discussion (1)2
Log in or sign up to continue
Digest
· Apr 1

InterSystems開発者コミュニティのダイジェスト、3月 2025

3月 2025開発者コミュニティ ニュースレターへようこそ。
全体統計
24 件の新しい投稿が公開 (3月 月):
 18件の新着記事
 6の新しい発表
1 人の新メンバーが参加 (3月 月)
1,473 件の投稿が公開 (全期間)
315 人のメンバーが参加 (全期間)
トップ記事
今月のトップ作家
記事
#InterSystems IRIS
計算プロパティの使用方法1
Hiroshi Sato順
計算プロパティの使用方法2
Hiroshi Sato順
ObjectScriptを使用し、ローカルファイルを他のサーバーにアップロード(POST)する方法
Hiroshi Sato順
select count(*)の応答に時間がかかる、あるいはタイムアウトが発生する場合の対処法について
Hiroshi Sato順
ODBC経由で取得したデータが途切れる場合の対処法
Hiroshi Sato順
既存のネームスペースで、インターオペラビリティ機能を無効にする方法
Hiroshi Sato順
オンラインバックアップの保存先
Tomoko Furuzono順
CSP(REST)でのトラブルシューティングに使用できるツール
Tomoko Furuzono順
ジャーナルのON/OFFを、コマンドで操作する方法
Tomoko Furuzono順
クライアントーサーバ間の通信を暗号化する
Tomoko Furuzono順
%Net.POP3 を使用して添付ファイル付きのメールを受信する方法 --- Gmailを使用したサンプルのご紹介
Megumi Kakechi順
ORDER BY で並べ替える際の照合順を調整する
Tomoko Furuzono順
機能トラッカのメッセージについて
Tomoko Furuzono順
ジャーナルの整合性チェックやサマリの表示をコマンドで実行する方法
Tomoko Furuzono順
Iris における FastAPI アプリケーションの実行
Toshihiko Minamoto順
バージョン2025.1インストール時に指定する初期セキュリティオプションのデフォルトが「ロックダウン」に変わりました
Mihoko Iijima順
IRISのSQLでサポートされているSQLウィンドウ関数について
Tomoko Furuzono順
小数桁数を指定して切り上げ・切り捨ての処理を行う方法
Tomoko Furuzono順
お知らせ
3月, 2025Month at a GlanceInterSystems Developer Community