이 예제 메시지 플로우에는 다른 TCP/IP 포트에서 대기하도록 구성된 두 개의 SCADAInput 노드가 들어 있습니다. 메시지가 오류 없이 수신되면 입력 노드는 입력 메시지 컨텐츠를 조작하고 다수의 출력 메시지를 생성하는 Compute 노드로 전달합니다. Compute 노드는 Publication 노드로 출력 메시지를 전달하고 Publication 노드는 WebSphere MQ 프로토콜을 사용하는 등록된 subscriber에게 메시지를 publish합니다. 플로우의 오류는 MQOutput 노드로 전달되며 나중에 처리하도록 큐에 오류 메시지를 기록합니다.
Telemetry 클라이언트는 예를 들면, 상태 변경을 표시하거나 계속 활성 상태임을 확인하는 이벤트를 생성합니다. 클라이언트는 이벤트를 배치(batch)하여 15분마다 브로커에게 송신하도록 프로그램되어 있습니다. 메시지 플로우는 배치 메시지에서 개별 이벤트 메시지를 추출하여 publish하도록 설계되어 있습니다.
Compute 노드는 배치(batch)된 입력 메시지를 개별 이벤트 메시지로 분리하는 ESQL을 사용하여 구성되었습니다. WHILE 루프는 배치의 각 메시지에 대해 반복됩니다. MQMD는 입력 메시지에서 각 출력 메시지로 복사됩니다. 관련 필드는 입력 트리에서 출력 트리로 복사됩니다. 각 출력 메시지는 usr 폴더의 MQRFH2 헤더에서 사용자 등록 정보를 설정하여 빌드되는 JMSText 메시지입니다. 각 메시지는 PROPAGATE문을 통해 Publication 노드로 전달됩니다.
다음은 두 개의 이벤트가 있는 입력 배치 메시지 예입니다.
<?xml version="1.0" encoding="UTF-8"?> <!-- edited by Mary Bright --> <events d_tstamp="20040417103118"> <StateChange topic="LCUnit/12345/StateChange" d_tstamp="20040417104439" i_state="1" i_old_state="0"> <![CDATA[Changing state from 'Starting' to 'Payload' because 'The startup routine is complete']]> </StateChange> <Heartbeat topic="LCUnit/12345/Heartbeat" d_tstamp="20040417105126" i_state="1"> <d_tstamp>20040417104948</d_tstamp> <i_state>1</i_state> </Heartbeat> </events>
The ESQL module that processes messages of this format is shown below:
CREATE COMPUTE MODULE messageflow_Compute CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN DECLARE BatchTime CHAR; SET BatchTime = InputRoot.XML.events.d_tstamp; DECLARE Count INTEGER CARDINALITY(InputRoot.XML.events.*[]); DECLARE I INTEGER 2; WHILE I <= Count DO SET OutputRoot.Properties.MessageDomain = 'XML'; SET OutputRoot.XML = NULL; SET OutputRoot.MQMD = InputRoot.MQMD; SET OutputRoot.MQRFH2.CodedCharSetId = 1208; SET OutputRoot.MQRFH2.(MQRFH2.Field)Format = 'MQSTR '; SET OutputRoot.MQRFH2.(MQRFH2.Field)NameValueCCSID = 1208; SET OutputRoot.MQRFH2.psc.Topic = InputRoot.XML.events.*[I].topic; SET OutputRoot.MQRFH2.usr.*[] = InputRoot.XML.events.*[I].(XML.Attribute)*[]; SET OutputRoot.MQRFH2.usr.b_time = BatchTime; SET OutputRoot.XML.Body.Text = InputRoot.XML.events.*[I].(XML.CDataSection)*' SET I = I + 1; PROPAGATE; END WHILE; RETURN FALSE; END; END MODULE;
메시지 플로우에는 메시지 핸들링 용량을 증가시키기 위한 두 개의 입력 노드가 있습니다. 입력 노드는 얼마든지 사용할 수 있습니다. 또한 메시지 플로우 등록 정보 추가 인스턴스를 변경하여 메시지 플로우를 서비스하는 프로세스 수를 증가시킬 수 있습니다. 수백 개의 클라이언트가 있는 경우 둘 이상의 브로커에서 높은 메시지 로드를 핸들링해야 할 것입니다. 이러한 기술 중 하나 이상을 사용하여 승인 가능한 메시지 처리 레벨을 확인하십시오.
이 예에서는 Telemetry 클라이언트 메시지를 핸들링하는 한 가지 방법만을 표시합니다. 이 메시지 플로우를 변경하거나 사용자의 Telemetry 요구사항에 맞게 새로 작성하십시오.