В опубликованном вами коде так много неправильного, что я не знаю, с чего начать.
Прежде всего, правила / политика StackOverflow заключается в том, что вы должны скопировать и вставить свой рабочий код из вашего редактора или IDE в StackOverflow. Очевидно, что вы этого не сделали, а просто создали новый код в окне редактирования StackOverflow - что неверно !!!
return stringbuilder.append(new String(convertToEbcidie(incomingData, "Cp1047")))
.append(incomingData)
.append(new String(convertToEbcidie(processingData, "Cp1047")))
.append(processing data).toString();
(1) Метод convertToEbcidi c принимает ОДИН параметр, а не 2. Вы ошиблись брекетингом.
(2) Имя метода - convertToEbcidi c, а не convertToEbcid ie (последняя буква - 'c', а не 'e')
private byte[] convertToEbcidic(String s) {
String hexStr = StringUtils.leftPad(s.length+4, 8, "0");
byte[] byteAry = new byte[hexStr.length()/2];
for (int i = 0; i < hexStr.length(); i+=2) {
byteAry[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
} return byteAry;
}
(3) Я понятия не имею, что вы пытаетесь сделать, но очевидно, что он не делает того, о чем вы думаете. Вы прошли код с помощью отладчика?
(3A) Длина переменной s - это метод, а не поле. Это должно быть s.length (), а не s.length.
(3B) Первый параметр метода StringUtils.leftPad должен быть String, а не int.
(3 C) hexStr будет «00000036» (32 + 4). hexStr имеет длину 8.
(3D) byteAry будет иметь размер 4 !!! Как вы думаете уместить 36 символов в 4 байта? т.е. 4 + 26 символов «Это из другого приложения».
(3E) Что делает ваш l oop ?? Он запускается 4 раза, и я совершенно не понимаю, о чем вы думали.
Хорошо. Теперь к вашей проблеме.
ANOTHER SAMPLE DATA :- OO25THIS IS ORIGINAL DATA FROM SOURCE001APROCESSED SUCCESSFULLY
Хорошо. Итак, основываясь на этом примере, мне кажется, что макет выглядит следующим образом:
{строковое представление длины «символьных данных 1» в шестнадцатеричном формате} {символьные данные 1} {строковое представление длины «символа» данные 2 "в шестнадцатеричном формате} {символьные данные 2}
Поскольку вся полезная нагрузка сообщения будет строкой, гораздо лучше поместить строку как сообщение в локальную кодовую страницу (ASCII), отметьте Формат MQMD в виде строки и пусть MQ выполнит преобразование. Преобразование будет выполнено, когда приложение мэйнфрейма выдаст вызов «MQGET with Convert».
Вот правильный код для вашей проблемы:
String incomingData = "This is from another application";
String processingData = "This data is processed";
StringBuilder sb = new StringBuilder();
MQQueueManager qMgr = null;
MQQueue outQ = null;
String inHexLen = Integer.toHexString(incomingData.length()+4).toUpperCase();
inHexLen = StringUtils.leftPad(inHexLen, 4, '0');
sb.append(inHexLen);
sb.append(incomingData);
String outHexLen = Integer.toHexString(processingData.length()+4).toUpperCase();
outHexLen = StringUtils.leftPad(outHexLen, 4, '0');
sb.append(outHexLen);
sb.append(processingData);
System.out.println("sb="+sb.toString());
try
{
qMgr = new MQQueueManager("MQA1");
outQ = qMgr.accessQueue("TEST.Q1",
CMQC.MQOO_OUTPUT + CMQC.MQOO_FAIL_IF_QUIESCING);
MQMessage sendmsg = new MQMessage();
sendmsg.format = CMQC.MQFMT_STRING;
sendmsg.writeString(sb.toString());
outQ.put(sendmsg, new MQPutMessageOptions());
}
catch (MQException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
if (outQ != null)
outQ.close();
}
catch (MQException e)
{
e.printStackTrace();
}
try
{
if (qMgr != null)
qMgr.disconnect();
}
catch (MQException e)
{
e.printStackTrace();
}
}