퇴근5분전

 막 끝난 프로젝트에서 {설비 ---- mes서버}간에 데이타 통신을 ActiveMQ라는 것으로 구현이 되어 있었다.

메세지 전문을 만들면서 '보내는건 되어도 결과를 받을 순 없다.' 라는 답변을 받았다.

그런게 어딧냐고... 기간계 통신이 일방적으로 주기만 하는게 어디있느냐... 주고 받고 해야지... 라며 얘기를 했었다.

 

 프로젝트 끝나고 집에서 ActiveMQ관련해서 찾아보다 보니 RabbitMQ나 Kafka 같은 것들까지 나오길래...

구글링을 하면서 이게 뭔가 찾아봤더니 MSMQ같은 큐였다. 

 내 기억엔 MSMQ에서 양방향으로 비동기 통신을 했었던 걸로 기억하는데? 

이런것들은 한쪽에서 보내는 것만 된다고?

 

 몇 일을 고민도해보고 찾아보고 샘플도 만들어보고 테스트도 해보니... 내가 알던 방식이 맞다.

큐라는걸 사용할 뿐이지.. 주고 받고 해야지... 

기본 메세지 전송은 [프로듀서]라는게 [큐]에 등록(Send)하면 [컨슈머]가 꺼내서(Listner) 처리를 한다.

 

 Q. 서버.컨슈머가 메세지 처리 후 결과를 클라이언트에 돌려주는 방법이 있나?

 전 프로젝트 소스에서도 클라이언트.프로듀서가 전송 후 결과를 받는 것으로 처리 되어 있는 걸로 봐서는... 있지만?

서버쪽 소스는 내가 볼수 없었기에... 추측만 해볼 수 밖에...

 계기 ::

  설비에서 부자재 사용을 알릴때 서버에 요청하면 사용승인난 대기하던 부자재를 사용처리하면서 

 등록 ID를 설비에 돌려줘야 하는데... 이게 안되는게 아니고 안하는거였다? 왜? 귀찮아서 였을까??

 

간단하게 두가지 방법이 있었다. 

첫번째는 임시 큐를 사용하는 방법.

클라이언트.컨슈머 생성시 tempQueueDestination = session.CreateTemporaryQueue() 로 임시큐 사용

요청메세지에 NMSReplyTo = tempQueueDestination 을 할당하여 .Send

서버.컨슈머가 메세지를 수신하고 처리시 수신메세지.NMSReplyTo를 이용해서 서버.Producer를 만들고 Send하면

클라이언트.컨슈머에서 Receive 할 수 있다. - 테스트 결과 잘 된다.

mporaryQueue()

 

두번째 방법은 응답 컨슈머 생성시 selector를 지정

1. 클라이언트.컨슈머 생성시 selector를 res=producerID를 지정

2. 클라이언트.프로듀서의 요청메세지.Properties["req"] = null; 을 지정

3. 클라이언트.프로듀서의 요청메세지.Properties["pid"] = producerID; 을 지정

4. Send

 

1. 서버.컨슈머 생성시 selector를 req is null을 지정한다. 

2. 서버.컨슈머의 수신된 메세지 처리시

   서버.프로듀서의 응답메세지.Properties["res"] = 수신된메세지. Properties["pid"] 지정

3. Send

※ res, req를 등록하는 이유는 하나의 큐 JSFW.Queue에 등록하게되므로

자기가 올린 메세지를 자기가 수신하지 않도록 구분해주는 역할로 selector를 지정한다.

 

 클라이언트 프로그램을 여러개 띄워서 동시간에 동시 요청 가능하도록 만들고 테스트해보니 

원하던 동작을 잘 했다. ( 아래는 두개만 찍었지만.. 네개정도 띄우고 10초단위로 확인 해봤다. )

 

결론 : 잘 된다. 

 

예외 : 내 샘플 코드가 문제인지? 

서버.Consumer 프로그램을 수신을 멈춰놓고 긴시간 대기하면

클라이언트.프로듀서 프로그램은 10초마다 등록을 한다. 동기로 구현해놔서 Receive가 안되어 지정시간 동안 대기...

나중에 서버.Consumer 프로그램에서 다시 수신시작을 했을때 한번에 밀려들어오는데... 

 

클라이언트.프로듀서 프로그램에서 Thread로 10초마다 Send걸어놔서 그런지.. 

껐다 켰다 하면 같은 데이타로 Send가 여러번 일어나는 현상이??? 이건 샘플이 잘못된걸꺼야... _)_;;; 

1. ActiveMQ 

          -프로듀서:컨슈머=1:1, 1:n 

          -토픽, 큐

 

2. MSMQ (netMSMQBinding : two-way)

 

4. SQL MQ? 이런게 있어?

 

3. 코파일럿 AI로 ppt 생성해보기 

          -이전 프로젝트에서 만들었던 PPT내용을 ai로 재현이 되는지... 확인해보기.

         :: 맨날 말로만 된다고 하는 건 봤는데... 진짜 필요한 화면은 어떻게 만들수 있나?

 

5. 골프?...

 

--- 모르던게 생겼으니... 또 공부를 해야 다음 일도 하는거고... 

          

  DAT 프로그래밍을 하면서... 

챠트도 그리고, 각종 로그도 남기면서... 쓰레드 현재 실시간으로 값을 보는 컨트롤도 만들고...

또 프로그램 원격 재시작, 모니터링등... PLC 신호에 맞춰 대응하는 프로그래밍이 재미있긴 했다.

다만 그 신호가 원치 않을때도 왔었다는게....

 

 암튼 플젝하면서 일정관리, 소스정리, PLC연동기획서 현행화, 이슈관리 등... 

좀 할게 있었지만... 초반엔 현장 대응하느라 시간이 안나서... 못했던걸 마지막 달에 주말엔 집에서 문서정리하면서 보냈다. 

 

 연동기획서를 재정리 할때는 PPT 헬퍼가 Office2021에서 동작을 이상하게 하는 바람에... 제대로 못 써먹었다. 

 

이번에 office 2007버전과 office2021버전에서 모두 사용이 가능하도록 수정하였다. 

 

일정관리 툴은 Todo를 써야 하는데... 무슨 이유였을까? 소스의 MainForm.cs 제일 위 상단에 회의록 겸, 일정을 적으면서 사용했다. git에 올라가니 기록은 유지되었을 것이다. 

 

Visual Studio Extention 프로그램에 함수목록 보기 프로그램을 수정하여 사용했다. 

함수명만 보이니까 함수의 역할이나 기능에 대한 코멘트를 함수목록에서 보고 싶어서.... 

 음... 좀 아쉬운건 회의록 정리하는게... 부족했다?

아침 10시 반이면 회의를 1시간 반이나 하는데... 딱히 이렇다할 기록이 없으니. 

회의록 정리하는 걸 고민해봐야겠다. 

 

이후 후속 DAT개발자 분이 드디어 출근을 했다하니... 잊어버려도 될 듯....