2010-08-11 2 views
3

Windows에서 WebSphere MQ 7 용 API EXIT를 작성했습니다. "amqsput"또는 "amqsget"과 같은 간단한 메시지를 대기열에 넣거나 가져올 때 정보가 포함 된 일부 로그 파일을 얻었습니다 등 시간, 메시지 데이터, 큐 이름처럼Java를 기반으로 클라이언트 프로그램을 통해 메시지를 넣을 때 My WebSphere MQ (Windows에서) API Exit가 아무 것도 기록하지 못하는 이유는 무엇입니까?

내가 자바 writen 내 테스트 프로그램에 대한 기대,하지만 그건 내가 아래의 코드를 사용했을 때

MQMessage MSG = 새로운 MQMessage를();
msg.writeUTF ("Hello, World!");
MQPutMessageOptions pmo = new MQPutMessageOptions();
queue.put (msg, pmo);

빈 로그 파일이 있습니다. 그런 다음 아래 코드를 사용했습니다.

MQMessage msg = new MQMessage();
msg.writeString ("Hello, World!");
MQPutMessageOptions pmo = new MQPutMessageOptions();
queue.put (msg, pmo);

그런 다음 로그 파일에서 familar 데이터를 확인했습니다.
안녕하세요, 세계 :

나는 나는 "메시지 브라우저"에서 두 개의 메시지를보고, MQ 탐색기를 열어!
% 안녕하세요, 세계!

여기에서 완전히 분실되었습니다. "%"는 어디에서 왔습니까? 내 api exit가 인코딩 때문에 put 작업을 기록하지 않았습니까?

모든 조언을 부탁드립니다. 감사합니다.

답변

1

나는 writeUTF() 길이 정보와 문자열을 출력하는 어딘가의 기억이 확실합니다.


아, 그래, 여기있다 : WriteUTF()에 IBM의 자신의 doco에서

:

이 방법은 액티브 문자열을 받아 현재 위치에서 메시지 데이터 버퍼에 기록합니다 UTF 형식 으로 쓰여진 데이터는 2 바이트 길이와 문자 데이터으로 구성됩니다. 메서드가 성공하면 DataOffset은 문자열의 길이만큼 증가합니다.

(마이 이탤릭체). 이미 발견했듯이 WriteString()은 길이가 인 이 아닙니다.

+0

감사합니다. 팍스, 내 실제 메시지 데이터 앞에 왜 "%"가 있는지 알아. 하지만 put 작업을 로그에 기록하지 않은 이유는 무엇입니까? 내 API EXIT는 put, get과 같은 작업을 기록하도록 설계되었습니다. 어떤 충고? 다시 한 번 감사드립니다! – allan

+0

그걸로 확신 할 수는 없지만 하나의 _possibility를 주겠다 ._ 당신의 출구가 C (또는 널 종료 문자열을 사용하는 다른 언어)이고 출력이 ". % Hello"(여기서 "."는 널 바이트 임) 인 경우, , 그게 보이기 때문에 빈 문자열을 얻을 수 있습니다. ". %"는 2 바이트 길이 섹션입니다. 그것은 내 생각에 너무 추측 일 수 있습니다. 나는 아마도 당신이하는 _first_ 일과 마찬가지로 출구에서 뭔가 다른 일을 할 것이다. (파일을 생성/업데이트하는 것과 같다), 그래서 호출되는 것을 볼 수있다. – paxdiablo

+0

나는 네가 옳을 수도 있다고 생각한다. 내 출구는 C 다. 왜 writeUTF가 존재 하는가? 이 메서드는 실제 메시지 앞에 추가 정보를 추가합니다. 클라이언트 프로그램이 writeString 대신에 writeUTF를 사용했다면 어떻게해야합니까? 그런데 메시지 탐색기에서 "% Hello"만 보았습니다. "때문입니다." 눈에 보이지 않는가? 감사합니다. – allan

0

API exit를 설치할 때, exit를로드하려면 큐 관리자를 중지했다가 다시 시작해야합니다. QMgr을 첫 번째 프로그램과 두 번째 프로그램을 실행하는 사이에 재활용 한 적이 있습니까?

또한 출구가 출력 버퍼를 명시 적으로 플러시하지 않으면 즉시 출력을 볼 수 없습니다. 이것은 당신이 보는 행동에 대한 또 다른 가능한 설명입니다.

마지막으로, 어떤 WMQ 버전을 사용하고 있습니까? (dspmq을 찾으십시오.) APAR IC60172: 64-BIT WINDOWS APPLICATION DOES NOT FIND API EXIT IN EXITS64은 7.0.1.0에서 수정되었으며 종료와 관련하여 다르게 동작하는 32 비트 프로그램과 64 비트 프로그램 간의 차이점을 설명합니다.

출력의 차이는 pax가 링크를 제공합니다. 출력에는 자바뿐만 아니라 ActiveX의 길이 바이트가 포함되어 있으므로 문서가 귀하의 경우에도 똑같이 적용됩니다.

+0

고마워요, 롭. 이 두 프로그램간에 QMgr을 재활용하지 않았습니다. 로그 파일은 첫 번째 실행 직후에 만들어졌으며 검사를 마쳤습니다. 시작과 끝이 있지만 내용이 없습니다 (넣기 작업에 대한 정보). 내 MQ 버전은 7.0.1.1이며 이제는 32 비트 API EXIT 기능을 테스트했습니다. 길이 바이트 (내용이 변경되지 않음)를 포함하면 API EXIT의 기록이 중단됩니까? 감사합니다. 감사합니다. 지연을 위해 유감스럽게 생각합니다 ... – allan

+0

이제 우리는 딱딱 거리는 비트로 가고 있습니다 ... 길이는 2 바이트이고 문자열은 너무 짧아서 해당 바이트 중 하나가 0x00이어야합니다. 문자열이 null로 끝나기 때문에 로그 파일이 단순히 올바르게 표시되지 않을 수 있습니까? 로그를 16 진수로 덤프 했습니까? 여기에서는 데이터가 작성되었지만 올바르게 표시되지 않았거나 종료가 샘플 프로그램보다 Java 프로그램에 대해 다르게 작동한다는 점을 고려했습니다. 첫 번째는 확인할 수 있고 두 번째는 JVM에 따라 32 비트/64 비트 문제를 가리 킵니다. –

+0

당신들은 훌륭합니다! 로그를 16 진수로 덤프합니다. 이는 내 API 종료가 기록되지 않도록하는 널 바이트입니다. 대단히 감사합니다 !!! – allan