Pesquisar

Resumo
· Maio 5

Publications des développeurs d'InterSystems, semaine Avril 28 - Mai 04, 2025, Résumé

Articles
Annonces
#Portail d'apprentissage
#Communauté des développeurs officielle
Avril 28 - Mai 04, 2025Week at a GlanceInterSystems Developer Community
Anúncio
· Maio 5

InterSystems FHIR and Digital Health Interoperability Contest 2025

Hi Developers,

We are happy to announce the new InterSystems online programming contest dedicated to all things health-related:

🏆 InterSystems FHIR and Digital Health Interoperability Contest 🏆

Duration: May 12 - June 1, 2025

Prize pool: $12,000

 The topic

Develop any interoperability FHIR solution or Healthcare Interoperability solution or a solution that helps to develop or/and maintain interoperability solutions using InterSystems IRIS for Health, Health Connect, or FHIR server.  

General Requirements:

  1. An application or library must be fully functional. It should not be an import or a direct interface for an already existing library in another language (except for C++, there you really need to do a lot of work to create an interface for IRIS). It should not be a copy-paste of an existing application or library.
  2. Accepted applications: new to Open Exchange apps or existing ones, but with a significant improvement. Our team will review all applications before approving them for the contest.
  3. The application should work either on IRIS Community Edition or IRIS for Health Community Edition. Both could be downloaded as host (Mac, Windows) versions from Evaluation site, or can be used in a form of containers pulled from InterSystems Container Registry or Community Containers: intersystemsdc/iris-community:latest or intersystemsdc/irishealth-community:latest .  
  4. The application should be Open Source and published on GitHub or GitLab.  
  5. The README file to the application should be in English, contain the installation steps, and contain either the video demo or/and a description of how the application works.
  6. Only 3 submissions from one developer are allowed.

NB. Our experts will have the final say in whether the application is approved for the contest or not based on the criteria of complexity and usefulness. Their decision is final and not subject to appeal.

Prizes

1. Experts Nomination - a specially selected jury will determine winners:

🥇 1st place - $5,000 

🥈 2nd place - $2,500 

🥉 3rd place - $1,000

🏅 4th place - $500

🏅 5th place - $300

🌟 6-10th places - $100

2. Community winners - applications that will receive the most votes in total:

🥇 1st place - $1,000 

🥈 2nd place - $600 

🥉 3rd place - $300

🏅 4th place - $200

🏅 5th place - $100

❗ If several participants score the same number of votes, they are all considered winners, and the prize money is shared among the winners.
❗ Cash prizes are awarded only to those who can verify their identity. If there are any doubts, organizers will reach out and request additional information about the participant(s).

Who can participate?

Any Developer Community member, except for InterSystems employees (ISC contractors allowed). Create an account!

Developers can team up to create a collaborative application. 2 to 5 developers are allowed in one team.

Do not forget to highlight your team members in the README of your application – DC user profiles.

Important Deadlines:

🛠 Application development and registration phase:

  • May 12, 2025 (00:00 EST): Contest begins.
  • May 25, 2025 (23:59 EST): Deadline for submissions.

 Voting period:

  • May 26, 2025 (00:00 EST): Voting begins.
  • June 1, 2025 (23:59 EST): Voting ends.

Note: Developers can improve their apps throughout the entire registration and voting period.

    Helpful Resources:

    ✓ Documentation:

    ✓ Tools:

    • Clinfhir - FHIR visualization and developer tool.

    ✓ Example applications:

    ✓ Online courses:

    ✓ Videos:

    ✓ For beginners with IRIS:

    ✓ For beginners with ObjectScript Package Manager (IPM):

    ✓ How to submit your app to the contest:

    Need Help?

    Join the contest channel on InterSystems' Discord server or talk with us in the comment to this post. 

    We're waiting for YOUR project – join our coding marathon to win! 


    By participating in this contest, you agree to the competition terms laid out here. Please read them carefully before proceeding.

    7 Comments
    Discussão (7)6
    Entre ou crie uma conta para continuar
    Anúncio
    · Maio 5

    Meetup FHIR France #13

    Salut la Communauté !

    Nous sommes ravis d'annoncer que le Meetup FHIR France fait son grand retour… en présentiel à l’occasion de SantExpo 2025 ! 

    📅 Dates: 21 mai, 2025, à partir de 19h00

    📌 Lieu : Halles d'Issy - Biltoki, 1 Rue Rouget de Lisle, Issy-les-Moulineaux

    Meetup FHIR France #13 : PARIS

    Programme prévisionnel :

    • 19h00 : accueil des participants
    • 19h30 – 21h00 : présentations et échanges :
      • « Comment les APIs FHIR du Serveur Multi-Terminologies (SMT) de l’ANS aident à gérer les artéfacts terminologiques de l’Europe ? » par Abdelali BOUSSADI et Yohann POIRON (Agence du Numérique en Santé)
      • « Les avantages et gains de la plateforme FHIR du CHU de Toulouse : Des référentiels à l'architecture » par Paul ORTEGA et Christian COUDER (CHU de Toulouse)
      • « Requêtage intelligent avec FHIR – OWL – LLM » par @Yann de Cambourg (Synodis), Guillaume POULERIGUEN (ftprod), Vincent HENRY (Jarod Knowledge Science)
      • « Prévoir et prévenir les urgences vitales grâce à HL7 FHIR » par Quentin FRANCOIS (PREVIA MEDICAL)
    • 21h00+ : Cocktail et networking

    Inscription

    L'événement est gratuit, mais les places sont limitées. Veuillez vous inscrire via la page officielle du Meetup :

    👉 Inscrivez-vous ici 👈

    Ce meetup est une excellente occasion de découvrir des cas d'usage concrets de FHIR, d'échanger avec des experts et de renforcer la communauté francophone autour de l'interopérabilité en santé.

    Nous espérons vous y retrouver nombreux !

    Discussão (0)1
    Entre ou crie uma conta para continuar
    Artigo
    · Maio 5 10min de leitura

    How to produce and consume RabbitMQ messages on IRIS

    RabbitMQ is a message broker that allows producers (those who send a data message) and consumers (those who receive a data message) to establish asynchronous, real-time, and high-performance massive data flows. RabbitMQ supports AMQP (Advanced Message Queuing Protocol), an open standard application layer protocol. 
    The main reasons to employ RabbitMQ include the following:

    • You can improve the performance of the applications using an asynchronous approach.
    • It lets you decouple and reduce dependencies between services, microservices, and applications with the help of a data message mediator, meaning that there is no need for producers and consumers of exchanged data to know each other.
    • It allows the long-running processing of sent data (with the results) to be delivered after utilizing a response queue.
    • It helps you migrate from monolithic to microservices, where microservices exchange data via Rabbit in a decoupled and asynchronous way.
    • It offers reliability and resilience by making it possible for messages to be stored and forwarded. A message can be delivered multiple times until it is processed.
    • Message queueing is the key to scaling your application. As the workload increases, you will only have to add more workers to handle the queues faster.
    • It works well with data streaming applications.
    • It is beneficial for IoT applications.
    • It is a must for Bots’ communication.

    RabbitMQ basic concepts

    We will utilize a temperature monitor as a case to detail RabbitMQ concepts:


    Diagrama O conteúdo gerado por IA pode estar incorreto.

    • Producer: it is a software program that sends messages.
    • Exchange: it receives a message from the producer and routes it to zero or more queues.
    • Queue: it is a message store/buffer supporting small and big binary messages.
    • Consumer: it is a program that primarily waits for messages to be received.
    • Message: it is the data sent and received with header and body sections.
    • Message  Broker: it is AMQP message middleware software that allows the exchange of data between producers and consumers.

         
    There are a few existing types of possible exchanges (source: https://www.cloudamqp.com/blog/part1-rabbitmq-for-beginners-what-is-rabbitmq.html):  

    RabbitMQ Topic Exchange 

    • Direct: The message is routed to the queues whose binding key is the exact match to the routing key of the message. For example, if the queue is bound to the exchange with the binding key pdfprocess, a message published to the exchange with a routing key pdfprocess will be routed to that queue.
    • Fanout: A fanout exchange routes messages to all the queues bound to them.
    • Topic: The topic exchange does a wildcard match between the routing key and the routing pattern specified in the binding.
    • Headers: Headers make exchanges using the message header attributes for routing.

    Install an example of IRIS and RabbitMQ running a temperature monitoring case

    To learn more about IRIS and RabbitMQ, we will play with a sample from Open Exchange:

    1. Go to the https://openexchange.intersystems.com/package/rabbit-iris-sample.
    2. For Docker installation, clone/git pull the repo into any local directory:
      git clone https://github.com/yurimarx/rabbit-iris-sample.git
       
    3. Open the terminal in this directory and run the following:
      docker-compose build
       
    4. Run the IRIS container with your project:  
      docker-compose up -d
    5. For ZPM (IPM) installation, use the line below:
      USER>zpm “rabbit-iris-sample”

    Configure the RabbitMQ

    1. Proceed to the RabbitMQ console (http://localhost:15672) and log in with the Username "guest" and Password "guest" to see the initial page:


    Interface gráfica do usuário, Aplicativo O conteúdo gerado por IA pode estar incorreto.

    2. Move to the tab "Exchange" > section "Add a new exchange". Set the "temperature" value for the Name field and select the option Topic on the field Type. Then click "Add exchange":

    Interface gráfica do usuário, Aplicativo O conteúdo gerado por IA pode estar incorreto.

    3. Go to the tab "Queues and Streams" > section "Add a new queue". Set the "temperature" value for the Name field and click "Add queue":

    Interface gráfica do usuário, Aplicativo, Teams O conteúdo gerado por IA pode estar incorreto.

    4. In the tab "Queues and Streams", click the temperature queue:

    Interface gráfica do usuário, Aplicativo O conteúdo gerado por IA pode estar incorreto.


    5. Head to the section "Add binding to this queue" and set the "temperature" value for the From exchange field. Then set "temperature.current" to the Routing key field and click the button "Bind":


    Interface gráfica do usuário, Texto O conteúdo gerado por IA pode estar incorreto.

    6. Now, the queue and exchange are connected and ready to manage messages with the routing key "temperature.current":

    Interface gráfica do usuário, Aplicativo O conteúdo gerado por IA pode estar incorreto.

    Start the IRIS production and see the results

    1. Proceed to the sample production (http://localhost:52795/csp/user/EnsPortal.ProductionConfig.zen?PRODUCTIO...) and click the button “Start”:


    Interface gráfica do usuário, Texto, Aplicativo O conteúdo gerado por IA pode estar incorreto.

    2. The production has started successfully:


    Interface gráfica do usuário, Texto, Aplicativo, Email O conteúdo gerado por IA pode estar incorreto.

    3. At this point, move to the [SQL](http://localhost:52795/csp/sys/exp/%25CSP.UI.Portal.SQL.Home.zen?$NAMESPACE=USER&$NAMESPACE=USER) to query the temperature table and see the results:


    Interface gráfica do usuário, Texto, Aplicativo O conteúdo gerado por IA pode estar incorreto.

    4. Check the production business services, business operations, and the produced messages to observe how the samples work.
     

    InterSystems IRIS RabbitMQ (AMQP) services, operations, and message types to consume and produce messages

    Overview

    Interface gráfica do usuário O conteúdo gerado por IA pode estar incorreto.

    1. The Business Service GetCurrentTemperature uses the Inbound Adapter dc.rabbit.TemperatureInboundAdapter to get the current temperature for a latitude/longitude localization. It consumes the external API (https://api.open-meteo.com/v1/forecast?latitude="_..Latitude_"&longitude="_..Longitude_"&current=temperature_2m&temperature_unit=fahrenheit&forecast_days=1) and sends the result to SendTemperatureOperation.
    2. The SendTemperatureOperation receives the current temperature and utilizes the EnsLib.RabbitMQ.OutboundAdapter to publish it on the RabbitMQ topic "Temperature".
    3. The RabbitTemperatureClientService consumes the RabbitMQ "Temperature" topic, gets the temperature data, and sends it to RabbitTemperatureOperation.
    4. The RabbitTemperatureOperation receives the temperature data and saves it in the IRIS database in the table dc.rabbit.Temperature.

    The temperature Inbound Adapter

    Inbound adapters are employed by Business Services to connect to external data sources, APIs, File systems, Web services, etc. In our case, the Inbound Adapter will connect to an external API to get the temperature for latitude/longitude locations. Check out the source code comments below:

    /// Extends the Ens.InboundAdapter to create a new custom adapter
    Class dc.rabbit.TemperatureInboundAdapter Extends Ens.InboundAdapter
    {
    
    Property Latitude As %String;
    Property Longitude As %String;
    Property SSLConfig As %String;
    /// To access HTTPS endpoints
    Parameter SERVER = "api.open-meteo.com";
    /// To the user config SSL config and the Latitude and Longitude parameters
    Parameter SETTINGS = "SSLConfig:Basic:sslConfigSelector,Latitude:Basic,Longitude:Basic";
    /// Method utilized to validate the configurations before starting the service using this adapter
    Method OnInit() As %Status
    {
        If (..SSLConfig = "" || ..Latitude = "" || ..Longitude = "") {
            return $$$ERROR(5001, "SSLConfig required")
        }
        
        Quit $$$OK
    }
    
    /// Method with the business implementation
    Method OnTask() As %Status
    {
        If ((..SSLConfig = "" || ..Latitude = "" || ..Longitude = "")) {
            Return $$$OK
        }
        
        Set tSC = 1
        // HTTP Request
        #dim httprequest as %Net.HttpRequest
        #dim httpResponse as %Net.HttpResponse
        Try {
            Set httprequest = ##class(%Net.HttpRequest).%New()    
            Do httprequest.ServerSet(..#SERVER)
            Do httprequest.SSLConfigurationSet(..SSLConfig)
            
            /// URL to be requested
            Set requestString = "/v1/forecast?latitude="_..Latitude_"&longitude="_..Longitude_"&current=temperature_2m&temperature_unit=fahrenheit&forecast_days=1"
            /// Requests the data from the temperature API
            Do httprequest.Get(requestString)
            Set httpResponse = httprequest.HttpResponse
            
            /// If not OK, returns error
            If (httpResponse.StatusCode '=200) {
                $$$ThrowStatus($$$ERROR(5001, "HTTP StatusCode = "_httpResponse.StatusCode))
            }
            
            /// Gets the response and creates a dc.rabbit.TemperatureMessage to send to the Business Operation configure to receive the message
            Set apiResult = {}.%FromJSON(httpResponse.Data)
            Set temperature = ##class(dc.rabbit.TemperatureMessage).%New()
            Set temperature.Latitude = ..Latitude
            Set temperature.Longitude = ..Longitude
            Set temperature.Temperature = apiResult.current."temperature_2m"
            Set temperature.TemperatureDate = apiResult.current.time    
            $$$ThrowOnError(..BusinessHost.ProcessInput(temperature))
            
        } Catch ex {
            Do ex.Log()
            Set tSC = ex.AsStatus()
        }
    
        /// Gets the current temperature again after the time configured in the service using this adapter (pulling time)
        Set ..BusinessHost.%WaitForNextCallInterval=1
        Quit tSC
    }
    }

    The service dc.rabbit.TemperatureService

    This service (dc.rabbit.TemperatureInboundAdapter) was designed to get the current temperature and send it to the SendTemperatureOperation (pay attention to the following comments):

    /// Service to get the current temperature and send it to the configured operation
    Class dc.rabbit.TemperatureService Extends Ens.BusinessService
    {
    
    Property Adapter As dc.rabbit.TemperatureInboundAdapter;
    /// Uses the TemperatureInboundAdapter
    Parameter ADAPTER = "dc.rabbit.TemperatureInboundAdapter";
    /// Receives the temperature data from the inbound adapter and sends it to the operation
    Method OnProcessInput(pInput As dc.rabbit.TemperatureMessage, pOutput As %RegisteredObject) As %Status
    {
        /// Creates a RabbitMQ message to send the temperature data as the content inside the RabbitMQ message
        #dim rabbitMesssage As EnsLib.RabbitMQ.Message
        Set rabbitMesssage = ##class(EnsLib.RabbitMQ.Message).%New()
        Do pInput.%JSONExportToString(.content)
        /// Sets the body of the message with the temperature data
        Do rabbitMesssage.SetEncodedContent(content)
        Set rabbitMesssage.appId = "IRIS"
        Set rabbitMesssage.exchange = "temperature" /// Sets the RabbitMQ exchange that will receive the message
        Set rabbitMesssage.routingKey = "temperature.current" /// Sets the right routing key to the exchange route of the message to the "Temperature" topic
        Return ..SendRequestAsync("SendTemperatureOperation", rabbitMesssage) /// Sends the Rabbit message to the operation and passes the message to the Rabbit
    }
    }

     

    The Business Operation SendTemperatureOperation

    It is a business operation from IRIS(EnsLib.RabbitMQ.Operation) utilized to publish a message on the RabbitMQ topic. It receives an EnsLib.RabbitMQ.Message and sends it to the RabbitMQ server configured on RabbitMQ settings:


    Interface gráfica do usuário, Aplicativo O conteúdo gerado por IA pode estar incorreto.

    The message destination is defined in the source code that created the message (inside the GetCurrentTemperature service):


    Texto O conteúdo gerado por IA pode estar incorreto.

    The properties exchange and routing key are needed to route the message to the right topic.

    The Business service RabbitTemperatureClientService

    This business service subscribes to a RabbitMQ topic, configured on RabbitMQ Settings, to receive messages and dispatch them for business operations or business processes configured on Target Config Names:


    Interface gráfica do usuário, Texto, Aplicativo, chat ou mensagem de texto O conteúdo gerado por IA pode estar incorreto.


    The BusinessOperation dc.rabbit.RabbitTemperatureOperation

    This Business Operation receives a message from RabbitTemperatureClientService and saves it in the IRIS Database:

    
    Class dc.rabbit.RabbitTemperatureOperation Extends Ens.BusinessOperation
    {
    
    Property Adapter As Ens.OutboundAdapter;
    Parameter ADAPTER = "Ens.OutboundAdapter";
    Method ProcessRabbitTemperature(pInput As EnsLib.RabbitMQ.Message, Output pOutput As %RegisteredObject) As %Status
    {
        Set content = {}.%FromJSON(pInput.encodedContent)
    
        Set temperature = ##class(Temperature).%New()
        Set temperature.Latitude = content.Latitude
        Set temperature.Longitude = content.Longitude
        Set temperature.Temperature = content.Temperature
        Set temperature.TemperatureDate = content.TemperatureDate
        Set tSC = temperature.%Save()
    
        Return tSC
    }
    
    XData MessageMap
    {
    <MapItems>
      <MapItem MessageType="EnsLib.RabbitMQ.Message">
        <Method>ProcessRabbitTemperature</Method>
      </MapItem>
    </MapItems>
    }
    }
    
    The EnsLib.RabbitMQ.Message class
    This class from IRIS is used to transport and configure which RabbitMQ exchange will be chosen to receive or publish messages:
    /// Receives the temperature data from the inbound adapter and sends it to the operation
    Method OnProcessInput(pInput As dc.rabbit.TemperatureMessage, pOutput As %RegisteredObject) As %Status
    {
        /// Creates a RabbitMQ message to send the temperature data as the content inside the RabbitMQ message
        #dim rabbitMesssage As EnsLib.RabbitMQ.Message
        Set rabbitMesssage = ##class(EnsLib.RabbitMQ.Message).%New()
        Do pInput.%JSONExportToString(.content)
        /// Sets the body of the message with the temperature data
        Do rabbitMesssage.SetEncodedContent(content)
        Set rabbitMesssage.appId = "IRIS"
        Set rabbitMesssage.exchange = "temperature" /// Sets the RabbitMQ exchange that will receive the message
        Set rabbitMesssage.routingKey = "temperature.current" /// Sets the right routing key to the exchange route of the message to the "Temperature" topic
        Return ..SendRequestAsync("SendTemperatureOperation", rabbitMesssage) /// Sends the Rabbit message to the operation and passes the message to the Rabbit
    }

    More information about this class can be found below:
    https://docs.intersystems.com/iris20243/csp/docbook/Doc.View.cls?KEY=EME...  

     
    More information

    Additional details about operating RabbitMQ adapters and utility classes may be found on the following resources:

    1. Using RabbitMQ on productions: https://docs.intersystems.com/iris20243/csp/docbook/DocBook.UI.Page.cls?...
    2. Using RabbitMQ on any part of your source code: https://docs.intersystems.com/iris20243/csp/docbook/DocBook.UI.Page.cls?...
    3. My sample: https://openexchange.intersystems.com/package/rabbit-iris-sample
    Discussão (0)1
    Entre ou crie uma conta para continuar