퇴근5분전

 늦은(?) 나이에 분가를 하게 되었다. 

 

프로젝트 끝나고 쉬는 중에 부모님의 분가요청으로... 나오게 되었다. 

 

그나마 본가에서 가까운 곳 오피스텔을 매매해서 자리를 잡았다. 

 

잔금 마치고 10일정도는 짐 실어나르면서 청소를 하였다. 

 

나름 짐 없이 산다했는데도 많이 들어 날렀다. 

 

벽한쪽에 TV놓는 자리처럼 휑한곳이 있길래... 컴퓨터를 놓기위해 

'고릴라랙'을 짜서 올려놓고 모니터 암을 달고 컴퓨터를 모니터 뒤에 두었다. 

보조 책상(ONA-804)으로 키보드 트레이( APL-KT65 )를 부착했다. 

 

# 컴퓨터 

 

 동향에 가까운 남동향이라 해가 아침부터 밝게 들어오고, 앞이 탁 트여서 답답하지도 않다. 

 

역앞이라 밤에 빛이 많이 들어와서 암막커튼도 했다.

 

층간소음은 그럭저럭... 조용한편인데, 발소리가 쿵쾅쿵쾅 들릴때가 있는데... 그래도 일찍 자는지 밤엔 조용하다. 

 

 

이제 혼자 생활하면서 어떻게 지내야 하는지 하나 하나 체크해보고 있는데... 

1. 식사시간? 밥을 차려서 먹고 치우고 하는데 대략 30~40분 가량 소요가 된다. 

   그래서 아침을 어떻게 먹을지?... 여러가지 시도중...

2. 세번정도 세탁기 돌려봤는데... 세탁기가 작아서 자주 돌려야 할 듯...

3. 음식쓰레기?... 

    아예 많이 나오면 자주 버리면 될 듯 하지만, 과일깍아먹으니 버리기도 애매하고 봉다리에 넣어놓았더니 곰팡이 피면서 썩더라... 3l짜리도 다 안찬거 버릴수밖에... 

4. 혼자 있는 시간에 익숙해져야 할듯 하다. 

   TV를 보는게 아니고... 본가에서는 귀로 듣기만 했는데... 너무 조용하니 이상하긴 하다.

 막 끝난 프로젝트에서 {설비 ---- 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. 골프?...

 

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