我正在尝试将现有的和正在运行的Java代码导入并运行到Intellij中,但我遇到了一些问题,这使我在这里写下这个问题:
我的Storm拓扑(java)代码正在从Websphere MQ读取数据,并且收到的消息是一个字节流,并由“Message Parser”项目解析;它解析这些字节流“字符串”并根据某些规则生成有意义的消息。
当我在Eclipse中运行它时没有任何问题,但是在Intellij中它显示了与消息解析器相关的问题。我将其视为编码问题并尝试:
但这并没有让我解决问题。
因为您在Java IDE中都有很好的专业知识,所以我希望您必须多次遇到IDE的Java代码兼容性问题。 如果有任何方法可以解决这个问题,请告诉我。
出现问题的代码如下:
public void execute(Tuple input) {
String strMessage = null;
Message posMsg = null;
Object jmsMsg = input.getValueByField(FieldEnum.FIELD_MESSAGE
.getFieldName());
posMsg = ((JMSMessage) jmsMsg);
strMessage = convertStreamToString(posMsg);
System.out.println("Message recieved from MQ : "+ strMessage);
@SuppressWarnings("rawtypes")
Map parsedSegments = MessageParser.instance().parseMessage(
strMessage);
@SuppressWarnings("serial")
Type nposMessageType = new TypeToken<Map<String, Map<String, String>>>() {
}.getType();
String segmentsJson = gson.toJson(parsedSegments, nposMessageType);
System.out.println(" testing the messages "+segmentsJson);
MessageDetail MessageDetail = new MessageDetail(
Constant.TOPOLOGY_NAME, segmentsJson);
this.outputCollector.emit(Constant.STREAM_MSG_PARSER_SUCCESS,
new Values(MessageDetail));
this.outputCollector.ack(input);
}
/**
* Convert stream to string
*
* @param jmsMsg
* @return
* @throws Exception
*/
private static String convertStreamToString(final Message jmsMsg) throws Exception {
String stringMessage = "";
BytesMessage bMsg = (BytesMessage) jmsMsg;
byte[] buffer = new byte[40620];
int byteRead;
ByteArrayOutputStream bout = new java.io.ByteArrayOutputStream();
while ((byteRead = bMsg.readBytes(buffer)) != -1) {
bout.write(buffer, 0, byteRead);
}
bout.flush();
stringMessage = new String(bout.toByteArray());
bout.close();
return stringMessage;
}
答案 0 :(得分:2)
你的代码应该受到指责。你正在使用
new String(bout.toByteArray());
将字节转换为字符。它使用平台默认编码。从Eclipse运行时与使用IntelliJ运行时不同,因为IntelliJ,如果我没有弄错,会传递一个JVM选项,强制默认编码为UTF-8。
但这不是IntelliJ问题。如果您在任何IDE上运行程序,在默认编码为UTF-8(例如Linux和Mac)的平台上,您的代码将以相同的方式失败。
每次将字节转换为字符,反之亦然,请确保明确指定编码。如果MQ正在生成消息,请阅读其文档以了解它使用的编码,并确保使用相同的编码。例如,如果是ISO-8859-1,请使用
new String(bytes, StandardCharsets.ISO_8859_1)