我有一个C ++组件,它使用ActiveMQ通过tcp将消息传递给JMS代理。我的经纪人是用JAVA写的。我想要这两个人沟通;到C ++组件向JAVA代理发送消息。
在C ++方面,我正在做的是创建一条消息(使用协议缓冲区),将其转换为字节向量并将其传递给代理。在JAVA方面(经纪人),我一直在倾听并根据收到的消息采取行动。
现在,我可以告诉系统以某种方式工作,因为当我执行我的C ++组件时(以及当它传递消息时),我看到我的JAVA代理打印了一条错误消息:unexpected error:null
每条消息我我从我的C ++组件发送。这意味着至少我的消息确实到达代理,但不知何故它们无法解密,因此无效。
我正在使用以下内容编写来自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
只是我创建并填写的一个对象,它不是null,我已经测试过它并且里面有数据。我正在将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 ++端设置,但我不确定它是否会导致问题。
答案 0 :(得分:-1)
好的,似乎错误与设置属性msgType
和topic
有关,我给了他们预期的字符串,在C ++端使用setStringProperty()
和所需的方法,现在初始错误消失了。
message->setStringProperty();