【发布时间】:2015-08-16 01:59:10
【问题描述】:
我有一个 C++ 组件,它使用 ActiveMQ 通过 tcp 将消息传递给 JMS 代理。我的经纪人是用 JAVA 编写的。我希望这两个交流;向 C++ 组件发送消息到 JAVA 代理。
在 C++ 方面,我正在做的是创建一条消息(使用协议缓冲区),将其转换为字节向量并将其传递给代理。在 JAVA 方面(代理),我一直在收听并根据收到的消息采取行动。
现在,我可以说系统以某种方式工作,因为当我执行我的 C++ 组件(以及当它传递消息时)时,我看到我的 JAVA 代理打印一条错误消息:unexpected error:null 每条我发送的消息来自我的 C++ 组件。这意味着至少我的消息确实到达了代理,但不知何故它们无法解密,因此出现了 null 问题。
我正在使用以下内容从 C++ 端编写消息:
// convert pointmsg to byte
int size = pointmsg.ByteSize();
char* byteArray = new char[size];
pointmsg.SerializeToArray(byteArray, size);
// convert bytearray to vector
vector<unsigned char> v(byteArray, byteArray + sizeof byteArray / sizeof byteArray[0]);
// pass as a vector
BytesMessage *message = session->createBytesMessage();
message->writeBytes(v);
producer->send(message);
printf("Sent message #%d from thread %s\n", ix + 1, threadIdStr.c_str());
pointmsg 只是我创建并填写的一个对象,它不为空,我已经对其进行了测试,并且其中有数据。我正在将 pointmsg 转换为字节数组,因为这是我在文档中读到的传递对象的方法。由于writeBytes() 函数需要一个向量,因此我将字节数组转换为向量。我怀疑这部分可能有问题。
在 JMS 方面,我只是通过以下方式收听即将到来的消息:
public void onMessage(final javax.jms.Message message) {
final Timer traceTimer = new Timer();
final long messageReceived = System.currentTimeMillis();
try {
if (message instanceof ActiveMQBytesMessage) {
final ActiveMQBytesMessage amqBytesMsg = (ActiveMQBytesMessage) message;
final byte[] buffer = amqBytesMsg.getContent().data;
final String msgType = amqBytesMsg.getStringProperty(LLCom.MSG_PROP_CLASS_NAME);
final String topic = amqBytesMsg.getStringProperty(LLCom.MSG_PROP_TOPIC_NAME);
String msgLookUpType;
if (topic == null || topic.isEmpty()) {
// get message class name: foo.bar$MessageMsg
msgLookUpType = msgType.split("\\$")[1];
} else {
// it's a topic we assume, that all subscribers have the
// correct type
msgLookUpType = topic;
}
if (logger.isDebugEnabled())
logger.debug("Router(" + name + ") received message ( " + buffer.length + "bytes)of type or topic " + msgLookUpType);
final Message req = parsers.createMessage(buffer, msgType);
// process explicit topic/queue subscriber
processServiceMessage(msgLookUpType, messageReceived, amqBytesMsg, req, traceTimer);
} else {
logger.error("Not supported JMS MessageType: " + message);
}
} catch (final Exception e) {
logger.error("Unexpected error: " + e.getMessage());
// e.printStackTrace();
}
}
当我调试它时,我可以看到 msgType 和 topic 变量(在 JMS 端)为空,这意味着 activemq 消息在某种程度上没有被解密。这可能是什么原因?我可以看到消息正在发送,接收但不理解。
有什么想法吗?
更新:我注意到我希望在 JMS 端获得 stringProperties,我没有在 C++ 端设置它,但我不确定它是否会导致问题。
【问题讨论】: