2012-06-15 3 views
2

Java에서 Websphere MQ까지 메시지를 AS400으로 보낼 수 있습니다. WinXP에서 메시지를 보내면 전체 언어 현지화를 포함하여 액세스 가능한 Locale을 사용하면 차이가 없습니다. 영어 Locale에 문제가 없습니다. 올바른 인코딩의 중요성은 다음 코드 행에만 있습니다.EBCDIC에서 유니 코드/UTF8로 문자열 변환

msgId.characterSet = 1208; 

불행히도 유효하지 않습니다. 이 메시지를 MQ Queue에서 가져 오려는 경우에 차이가 있습니다. 나는 (언어 팩의없이 영어) 윈도우 OS에서 MQ Queue에서 메시지를받을 경우

  • , 나는 String 형태로 MQ Queue에서 메시지를 취할 수 있어요. (- 캐치 - 드디어 블록 시도에서 제거 balast)

    윈도우 OS는 언어 팩의 일부 현지화 전체 인 경우
  • , 나는 예외 코드에서

 
Exception occured while to message buffer : 
    java.io.UnsupportedEncodingException: Cp870 

를 수신하고

try { 
    Class.forName("com.ibm.mq.MQEnvironment"); 
    MQEnvironment.hostname = hostname; 
    MQEnvironment.port = port1; 
    MQEnvironment.channel = channel; 
    MQEnvironment.userID = userID; 
    MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES); 
    try { 
     qmgr1 = new MQQueueManager(qmanager); 
     MQGetMessageOptions gmo = new MQGetMessageOptions(); 
     int openOptions2 = MQC.MQOO_INPUT_SHARED; 
     gmo.options = MQC.MQGMO_NO_SYNCPOINT; //Set no sync point 
     gmo.options = MQC.MQGMO_CONVERT; //Handles ASCII/EBCDIC 
     gmo.options = MQC.MQGMO_WAIT; //Wait until message arrives 
     gmo.waitInterval = 3000; 
     getq = qmgr1.accessQueue(responseQueue, openOptions2); 
     while (true) { 
      try { 
       responseFromQUEUE = ""; 
       MQMessage msgId = new MQMessage(); 
       //putmsg.characterSet = 437;// Set code page to ASCII 
       //putmsg.characterSet = 1200;// Set code page to UNICODE 
       msgId.characterSet = 1208; 
       getq.get(msgId, gmo); 
       String str = msgId.readLine(); 
       //responseFromQUEUE = CpConv.tf870to1250(msgId.readLine()); 
       //own EncodePage doesn't works too 
       if (responseFromQUEUE.length() == 0) { 
        break; 
       } 
      } catch (MQException mqx) { 
       if (mqx.reasonCode == EMPTY_QUEUE) { 
       } else { 
       } 
      } 
     } 
    } catch (MQException mqx) { 
    } finally { 
    } 
} catch (IOException ex) { 
} catch (ClassNotFoundException e) { 
} 

하십시오

  • 여기에 내 질문에 내가 MQMessage#getBytes

    에서 Encode하지 어떤 문제를 약 String 변환,

  • 이되는 몇 가지 매개 변수 (들), 내가 MQMessage#readLine()

  • 에서 String을 위해이 그리워 무언가가

+1

도움말 [여기] (http://www-304.ibm.com/support/docview.wss?uid=swg1IZ86625)? – trashgod

+0

링크를 사용해 주셔서 감사하지만 [이 문제가 있습니다] (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4296969)와 같이 최종 사용자 PC가 어떤 문제라도 다른 UnsupportedEncodingException을 얻었습니다. 지금은 아무 생각이 없습니다. – mKorbel

+0

@ J-16 SDiZ는 메시지 가져 오기 옵션을 덮어 쓰므로 실제로 메시지 페이로드의 변환을 요청하지는 않습니다. 그러나 메시지 헤더는 항상 변환되며 오류가 발생하는 곳입니다. 이 변환은 API 호출이 아닌 QMgr의 CCSID 설정에 기초합니다. QMgrs CCSID는 무엇으로 설정되어 있습니까? –

답변

2

CP870은 EBCDIC 호스트 코드 페이지입니다. 예외가 발생했을 때 Windows를 어떤 로케일로 변경 하시겠습니까? 로컬이 변경된 후에도 여전히 msgId.characterSet = 1208;을 사용합니까? Java 라이브러리가 CP870에있는 수신 메시지를 현재 로케일로 변환 할 수없는 것 같습니다.

로캘을 변경할 때 Windows 코드 페이지를 확인하고 msgId.characterSet에 1208이 올바른지 확인하십시오.

+0

+1, 로케일에 문제가 없다, 언어 팩 (전체 언어 현지화), 제발 내 질문에 어디에 EBCDIC euqivalent Windows Charsets 찾을 수 있습니다 (내 의견을 @trashgod 참조) – mKorbel

2

이 코드는 잘못되었습니다.이 옵션을 덮어 쓰는 경우는 |입니다.

+0

+1,이 질문에 내 의견을 참조하십시오, 당신은'gmo.options = MQC.MQGMO_NO_SYNCPOINT | MQC.MQGMO_CONVERT | MQC.MQGMO_WAIT;'???, 나 예제는 IBM 패키지와 문서에서 나온 것입니다. – mKorbel

+0

예. (p.s. MQGMO_NO_SYNCPOINT는 나쁜 습관입니다) –

+1

@mKorbel 위의 IBM 패키지 또는 문서에 위의 오류가 있습니까? 그리고 @ J-16 SDiZ는 syncpoint에 대해 정확합니다. 네트워크를 통해 JMS API 호출을 실행할 때는 항상 syncpoint를 사용해야합니다. 만약 당신이 메시지를'GET '하고 그 메시지가 전달되기 전에 연결이 끊어 진다면, 그 메시지는 동기 점 (syncpoint)에 있지 않으면 회복 불가능하게 손실됩니다. 싱크 포인트를 사용한다면 최악의 경우 메시지 중복을 얻을 수 있습니다. (JMS 스펙은 "기능 중복"을 처리하는 세션 때문에 재전송 된 메시지를 호출하고 COMMIT 호출의 세션 실패 결과가 모호하기 때문에 발생합니다.) syncpoint와'COMMIT'을 사용하십시오! –