我正在尝试连接到JMS服务器并向队列发布消息。当我运行创建一个简单MapMessage并将其插入队列的Java程序时,我得到了这个异常:
javax.jms.JMSException: Invalid character 'n' in value part of property
我不知道它指的是什么"属性",因为没有一个配置文件在其任何值中都有'n'。
导致这个异常的代码块是:InitialContext ctx = new InitialContext();
Queue queue = (Queue)ctx.lookup("MyQueue");
ConnectionFactory factory = (ConnectionFactory)ctx.lookup("ConnectionFactory");
Connection connection = factory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
最后一行抛出"Invalid character JMSException"
MapMessage基本上包含键/值(或属性名称/值)对格式的数据。看起来属性的值不喜欢ActiveMQ JMS客户端,因此它抛出异常。示例代码会有所帮助。您需要进一步调试并隔离导致此问题的代码行。
更新其他人也看到了类似的问题- https://stackoverflow.com/questions/35650656/invocation-of-init-method-failed-nested-exception-is-javax-jms-jmsexception-in
我怀疑问题是JNDI解析代码Java 1.8。
在我的团队的帮助下,我发现了导致JMSException的原因。每个系统上的ActiveMQ日志文件都包含代理属性行。
服务器上的代理属性(Java 1.5)如下所示:
ActiveMQ Broker (localhost, ID:<hostname>) started
服务器上不工作的代理属性(Java 1.8)如下所示:
ActiveMQ Broker (localhost, ID:<hostname a>
<hostname b>) started
在后一种系统中,'n'位于正确部分<hostname a>
和错误部分<hostname b>
之间。
这意味着服务器ID属性损坏了,因此这是一个只有系统管理员才能解决的问题。一旦他将服务器属性重置为只有<hostname a>
而没有<hostname b>
,程序就会正常工作。