cross process communication

Homepage Clovertech Forums Read Only Archives Cloverleaf Cloverleaf cross process communication

  • Creator
  • #50293
    Gary Atkinson


    I currently have one inbound ADT feed that sends to 14 outbound threads.  I am thinking of creating another process for ADT’s to thin out outbound threads as the one inbound thread is getting pounded.

    1.)Is this recommended?  

    2.)Or is better to raw route to another thread from the one inbound ADT thread and have it take some of the workload? And how do you handle acknowledgments on the thread?



Viewing 19 reply threads
  • Author
    • #65495
      Jim Kosloskey


      Here is what we do:

      We have an inbound site that takes in the ADT and distributes it to multiple sites. We have multiple outbound threads that are mlp pdl to localhost some port. We static raw route to the outbound threads. Each of the outbound threads are really pointing to another site where the messages are actually delivered. The inbound thread and the outbound threads are in the same process.

      For each outbound thread aove, there is a site where the complement of the outbound thread from above is described as an mlp pdl localhost (same port) inbound thread. Each message is routed to up to 10 outbound threads (we have an 11 thread limit we try to maintain) which are the actual receiving system.

      So you can see the ‘distribution’ site can actually end up delivering messages to as many as 100 destinations (the 11 thread limit on the distribution site allows for 10 outbound threads each of which point to a site that can have as many as 10 destination threads) or more. If one makes a site pointed to from the main distribution site a sub-distribution site which points to even more destination sites, the actual limit goes on.

      Multiple sites gives us some advantages (there are also some additional considerations – no such thing as a free lunch) not the least of which is we now have our messages spread over multiple recovery/error databases.

      You can accomplish something similar inside one site by having a ‘distribution’ process that static raw routes to mlp pdl localhost outbound threads in the same process. Each of these outbound threads then points to an inbound thread in a different process inside the same site. In the process pointed to by an outbound thread there is an mlp pdl localhost thread that then routes to the actual destination threads. You will only have one Recovery/Error database however and there are some other drawbacks.

      We try to stay away from inter-process communication here whenever possible – sometimes it is not possible.


    • #65496
      Tom Rioux

      We do something very similar to what Jim describes here.  We have multiple hospitals in our system which each hospital being designated as it’s own site.  In our legacy systems, each hospital pretty much has its own ADT system.  At some of those sites which still use the legacy system, there are as many 20 or more outbound threads stemming off of a single inbound thread.  While I think that is very inefficient, it was in place when I got here so what is one to do.

      We are moving to an enterprise system which I do have some say so in the design.  We have created a “front door” site for the ADT’s coming in.  The sole purpose of that site is to route the ADT’s to the multiple sites.  For the most part, this is a raw route and any manipulation that is done is that which is global to all messages for all sites.  No site specific data manipulation is done there.

      When the message gets to the designated site, it is recieved in by the generic “ADT” process.  The spider web of a process that has many multiple outbounds from one inbound is done away with.  On the ADT process, it routes the message to multiple processes to balance out the load within the site.  No data manipulation is done here except that which is global to all messages for all processes.

      In each individual process that the message is routed to, the messages are then run through xlates, tcls, or whatever to perform the data manipulation.    The message is then sent out to the various recieving systems.

      I have included a screen shot of how we do this on the hospital site.  It may not be the most perfect design but it works for us.

    • #65497
      Gary Atkinson

      Thanks for tips!

    • #65498
      Russ Ross

      As you start to break your integrations into more granular pieces you will find it necessary to work in a more organized consistant standardized fashion to be able to keep track and make sense out of it.

      In particular naming conventions for threads will be very helpfull.

      Off the top of my head here are some we use:

      ib_ (inbound thread from a foriegn system)

      ob_ (outbound thread to a foriegn system)

      hs_ (hop send which sends a message via TCP/IP to localhost to another process in the same site)

      hr_ (hop receive which receives a message via TCP/IP from localhost from another process in the same site)

      js_ (jump send which sends a message via TCP/IP to localhost to another site)

      jr_ (jump receive which receives a message via TCP/IP from localhost from another site)

      ls_ (leap send which sends a message via TCP/IP to a site on another cloverleaf server)

      lr_ (leap received which receives a message via TCP/IP from a site on another cloverleaf server)

      mock_ (mock thread that pretends to be a foriegn system during down times)

      rs_ (resend thread that resends intercepted messages of a mock thread once ready to come out of down mode)

      grab_ (grab messages during down time from either a hs_ or js_ thread)

      return_ (return message after down mode is over to either a hr_ of jr_ thread)

      Russ Ross

    • #65499
      Russ Ross

      Here is a visual example of these type of threads:

      hs_ (hop send which sends a message via TCP/IP to localhost to another process in the same site)

      hr_ (hop receive which receives a message via TCP/IP from localhost from another process in the same site)

      Russ Ross

    • #65500
      Russ Ross

      Here is a visual example of these type of threads:

      js_ (jump send which sends a message via TCP/IP to localhost to another site)

      jr_ (jump receive which receives a message via TCP/IP from localhost from another site)

      By the way don’t worry about the down thread because it is SNA protocol to mainframe SMS/CARE and it cycles with each batch of messges.  The jr_iftp_030 thread is opening because it runs once a day to get the scheduling cancellations.

      We don’t like routing several inbound threads to one outbound thread but in pharmacy’s case the vendor demands to get everything on one port.

      The jr_cs_allergy thread is currently in down mode and that is why it is turned off.

      I just showed one jump send site and 2 of it’s jump receive sites thinking that would be enough to get the idea.

      Russ Ross

    • #65501
      Russ Ross

      Here is one of Jim Kosloskey’s integrations to a database using ODBC to illustrate the use of the following types of threads:

      grab_ (grab messages during down time from either a hs_ or js_ thread)

      return_ (return message after down mode is over to either a hr_ of jr_ thread)

      Stepping out of the nest towards using multiple sites will put pressure on people’s comfort zone and force them to wave good-bye to their old flat world thinking.

      It probably took Jim and I a couple of years to get others to start thinking outside the box but I think the journey has been worth the benifits.

      I agree with Jim that to do the discussion right needs to be done face to face with a white board.

      I likely will attend the User’s conference along with Jim and loose some golf balls afterwards.

      Hint:  You could probably get thousands of dollars of consluting help from Jim and myself for a dozen golf balls.  Even better if you end up playing golf with the group after the users conference.

      Russ Ross

    • #65502
      Richard Hart

      Hi Gary.

      We are like the other guys and have multiple sites, generally one for each connected application.

      We name threads with respect to the site, application and data and use a suffix to determine if the thread is connecting to another Cloverleaf site or an application.

      A ‘snd’ or ‘rcv’ thread will communicate with an application and an ‘in’ or ‘out’ thread is a Cloverleaf connection.

      We use the tcp_acknak.pdl for the in/out connections as this is fast.

      We make extensive use of Unix links to ensure that there is only one copy of the source code.


      Process         Connection                State Proto Status Count  Started            


      top_prod_rp     ccm_prod_rp_adt_out       up    up           0      16/09/08 20:23:06  

      top_prod_rp     cdc_prod_rp_adt_out       up    up           0      16/09/08 20:23:04  

      top_prod_rp     cdr_prod_rp_adt_out       up    up           0      16/09/08 20:23:02  

      top_prod_rp     cwb_prod_rp_adt_out       up    up           0      16/09/08 20:23:05  

      top_prod_rp     eds_prod_rp_adt_out       up    up           0      16/09/08 20:23:05  

      top_prod_rp     har_prod_rp_adt_out       up    up           0      16/09/08 20:23:06  

      top_prod_rp     ris_prod_rp_adt_out       up    up           0      16/09/08 20:23:03  

      top_prod_rp     sol_prod_rp_adt_out       up    up           0      16/09/08 20:23:05  

      top_prod_rp     sud_prod_rp_adt_out       up    up           0      16/09/08 20:23:03  

      top_prod_rp     top_prod_ih_adt_kil       up    up           0      16/09/08 20:23:03  

      top_prod_rp     top_prod_rp_adt_rcv       up    up           0      16/09/08 20:23:04  

      top_prod_rp     top_prod_rp_adt_snd       up    up           0      16/09/08 20:23:04

      Process         Connection                State Proto Status Count  Started            


      ccm_prod_ih     anp_prod_ih_lab_in        up    up           0      19/08/08 21:13:31  

      ccm_prod_ih     ccm_prod_ih_ack_rcv       up    up           0      19/08/08 21:34:18  

      ccm_prod_ih     ccm_prod_ih_adt_snd       up    up           0      19/08/08 21:13:34  

      ccm_prod_ih     ccm_prod_ih_lab_smt       up    up           0      19/08/08 21:13:05  

      ccm_prod_ih     ccm_prod_ih_lab_snd       up    up           0      19/08/08 21:12:03  

      ccm_prod_ih     ccm_prod_ih_ord_rcv       up    up           0      15/09/08 15:10:17  

      ccm_prod_ih     ris_prod_ih_lab_in        up    up           0      02/09/08 10:26:19  

      ccm_prod_ih     sud_prod_ih_lab_in        up    up           0      19/08/08 21:12:55  

      ccm_prod_ih     sud_prod_ih_ord_out       up    up           0      19/08/08 21:13:17  

      ccm_prod_ih     top_prod_ak_adt_in        up    up           0      02/09/08 10:25:23  

      ccm_prod_ih     top_prod_bl_adt_in        up    up           0      02/09/08 10:25:25  

      ccm_prod_ih     top_prod_fh_adt_in        up    up           0      02/09/08 10:25:27  

      ccm_prod_ih     top_prod_ke_adt_in        up    up           0      02/09/08 10:25:29  

      ccm_prod_ih     top_prod_km_adt_in        up    up           0      02/09/08 10:25:31  

      ccm_prod_ih     top_prod_os_adt_in        up    up           0      02/09/08 10:25:36  

      ccm_prod_ih     top_prod_pm_adt_in        up    up           0      02/09/08 10:25:38  

      ccm_prod_ih     top_prod_qe_adt_in        up    up           0      02/09/08 10:25:40  

      ccm_prod_ih     top_prod_rk_adt_in        up    up           0      02/09/08 10:25:42  

      ccm_prod_ih     top_prod_rp_adt_in        up    up           0      02/09/08 10:25:44  

      ccm_prod_ih     top_prod_sw_adt_in        up    up           0      02/09/08 10:25:46

    • #65503
      Gary Atkinson

      Wow those set-ups are very creative!  I see what mean by thinking outside the box.  Unfortuantely, I inherited our engine set-up, so I have to do some soul searching on the best way to go.  I’ll probably start fresh when we upgrade next.

      I wish I could attend the user conference, but $$ is tight  😥

      So, what kind of golf balls do you lilke  8)

    • #65504
      Russ Ross

      I like golf balls that have alot of luck and are hard to loose and go really far and straight when I hit them and cost a dollar at most.  

      Everything I hit is pre-owned.  

      Many times I don’t really keep score and just track how many golf balls I loose to measure my performance.

      Most of my golf history is loose a ball every other hole but this year I’m getting to the point of enjoyment and loose about 3 balls per round.

      I did make history this year by playing my one and only round of golf without loosing a ball.

      My mom decided to reward that performance and bought me some new Titlest pro-v golf balls at $4+change each.  

      I’m to nervous to hit them at that price and kept waiting until I was having a good day to try one.  

      When I was having a good golf day and decided to try one of those new golf balls, I discovered I had protected them so well I couldn’t find any of them anymore.  

      So you see I can even loose a golf ball without even hitting it.

      I’m starting to wonder if golf balls have an experation date on them that casues them to vanish after a certain date.

      Russ Ross

    • #65505
      Gary Atkinson

      Well if I ever make it out to the user conference I’ll buy you (and Jim I owe him big time) some nice Nike One golf balls  😛   I always use my most expensive golf balls over water  😯

    • #65506
      Tom Rioux

      Personally,  I used to play the Titleist Pro V-1 until a marshall on the course gave me another Titleist he had found and asked me to hit it and tell me what I thought.  I hit it and it performed just as well as the Pro V-1.  To my surprise, the ball was the Titleist DT So-Lo.  You can find that ball for around $20/dozen if you take time to shop around.  Also, I was at Golfsmith last week.  They have these bargain bins up front with bulk golf balls.  They had some Titleist Gran-Z’s in the bin.  These are balls that are predominately marketed in Japan.  They have a Titleist Pro V-1 core with a Titleist NXT cover.  I bought a dozen to see how they performed and I was very impressed.  I’m probably going back to get more just to stock up.

      As for Russ and his scores vs losing golf balls…I’ve played with Ross once and it doesn’t matter if he is keeping score or tracking the number of lost balls, the number will still be the same…and it is probably 3 digits!!!   KIDDING WITH YA RUSS!!!!   😛

    • #65507
      Kevin Crist

      thats awesome. i too count a good round of golf by how many balls i have lost. my wife bought me some nice looking nike balls for christmas last year and they are still boxed up in my bag. cant seem to get away from wal-marts jumbo get what you get bag for $15.00

    • #65508
      Gene Salay

      Ok I’m late to this golf party, but I’m looking for a way to send multiple input threads to one output thread.   I have four inbounds , routed to outbound threads which use local host.   I thought they could all point to the same llocalhost port number, but one will grab the connection and the others are excluded.   Is there a way to do this without going cross-process?

    • #65509
      Rob Abbott

      Make the server (receiving thread) multi-server.  This will allow it to accept multiple connections on the same port.

      Rob Abbott
      Director, Product Management - Infor Cloverleaf

    • #65510
      Robert Kersemakers

      How about routing the messages from the 4 inbound threads to just 1 outbound thread and send them on to the receiver?

      Zuyderland Medisch Centrum; Heerlen/Sittard; The Netherlands

    • #65511
      Gene Salay

      Thanks guys –

      I did try the multiserver but I must have configured it wrong because all the threads said they were up but the messages queued up on the threads sending ob to localhost.

      The 4 into 1 is the way I had it set up originally, but I am trying to avoid that cross-process communication.

    • #65512
      Gene Salay

      Sheesh – I set up multiserver again –

      Right now I have two threads medq_3mcs and gecvis_3mcs going localhost to 3mcsportal.

      the status window for 3mcsportal says Error Msg: CLIENTS:3 and the

      the other two are collecting messsages in the pending status and keep resending them.  

      3mcsportal is reporting that the messages failed, but the routes and xlates are working (the outbounds – 3mcsxmlo and 3mcsdoco – put files out the disk using fileset local)

      3mcsportal is set up with pdl-tcpip with an inbound proc of raw_hl7_ack.

      Sounds like I need to do something to make it stop resending.

    • #65513
      John Mercogliano


      John Mercogliano
      Sentara Healthcare
      Hampton Roads, VA

    • #65514
      Gene Salay

      Thanks John, I”m going to read that over.

      Thank you guys for your time and help!

      After my last post, I found  

      I downloaded hl7Raw_ack.tcl from the TCL Library and it resolved my issue.

      I tried a couple times to post this information to this thread, but it didn’t show up.  Maybe there’s some site control function that keeps one user from creating multiple sequential posts.

Viewing 19 reply threads
  • The forum ‘Cloverleaf’ is closed to new topics and replies.

Forum Statistics

Registered Users
Topic Tags