比较方法违反了它的总契约!尝试向 Websphere mq 发送消息时
Comparison method violates its general contract! when trying to send message to Websphere mq
我正在使用 spring jms 连接到 Websphere MQ。我正在尝试通过本地主机连接,现在不使用 jndi 信息。
Connection names (all as an example): hostname: <Websphere ip address> http://localhost:9043
given hostname 12.123.0.12
In Resources->JMS->Queue connection Factories
name: MQDemo
JNDI name: MQDemo
2 Queues:
name: MQ.T11.UPDATE.REQUEST
JNDI name: jms/MQ.T11.UPDATE.REQUEST
name: MQ.T11.INQUIRY.REPLY
JNDI name: jms/MQ.T11.UPDATE.REQUEST
DemoMain.java
在主要方法中:
ApplicationContext ctx = new ClassPathXmlApplicationContext("app-context.xml");
// get bean from context
JmsMessageSender jmsMessageSender = (JmsMessageSender)ctx.getBean("jmsMessageSender");
// send to default destination
jmsMessageSender.send();
JMSMessageSender.java
package name: com.java.geek
@Autowired
private JmsTemplate jmsTemplate;
/**
* send text to default destination
* @param text
*/
@Cacheable("message")
public void send() {
System.out.println("in send");
jmsTemplate.send(new MessageCreator() {
@Override
public Message createMessage(Session session)throws JMSException {
System.out.println("in create message");
Message message = (Message) session.createTextMessage("Hello JMS");
return message;
}
});
}
public JmsTemplate getJmsTemplate()
{
return jmsTemplate;
}
public void setJmsTemplate(JmsTemplate jmsTemplate)
{
this.jmsTemplate = jmsTemplate;
}
应用-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.java.geek" />
<bean id="amqConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
<property name="hostName">
<value>http://localhost:9043</value>
</property>
<property name="port">
<value>1415</value>
</property>
<property name="queueManager">
<value>MQDemo</value>
</property>
<property name="transportType">
<value>1</value>
</property>
</bean>
<!-- Pooled Spring connection factory -->
<bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean" lazy-init="true">
<property name="MQDemo" value="java:comp/env/jms/MQDemo" />
<property name="lookupOnStartup" value="false"/>
<property name="cache" value="true" />
<property name="proxyInterface" value="javax.jms.QueueConnectionFactory"/>
<constructor-arg ref="amqConnectionFactory" />
</bean>
<!-- JmsTemplate Definition -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory"><ref bean="amqConnectionFactory" /> </property>
<property name="pubSubDomain"><value>false</value></property>
<!-- <property name="defaultDestination"><ref bean="senderQueue" /></property> -->
</bean>
<!-- ======================================================= -->
<!-- JMS Send, define default destination and JmsTemplate -->
<!-- ======================================================= -->
<!-- Default Destination Queue Definition -->
<bean id="senderQueue" class="com.ibm.mq.jms.MQQueue">
<constructor-arg value="MQ.T11.UPDATE.REQUEST"/>
</bean>
<bean id="jmsMessageSender" class="com.java.geek.JmsMessageSender">
<property name="jmsTemplate"><ref bean="JmsTemplate"/></property>
</bean>
</beans>
我收到一个错误,
Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(TimSort.java:758)
at java.util.TimSort.mergeAt(TimSort.java:494)
at java.util.TimSort.mergeCollapse(TimSort.java:421)
at java.util.TimSort.sort(TimSort.java:225)
at java.util.TimSort.sort(TimSort.java:184)
at java.util.Arrays.sort(Arrays.java:670)
at com.ibm.mq.constants.MQConstants.getFields(MQConstants.java:277)
at com.ibm.mq.constants.MQConstants.lookup(MQConstants.java:204)
at com.ibm.mq.constants.MQConstants.lookup(MQConstants.java:264)
at com.ibm.mq.constants.MQConstants.lookup(MQConstants.java:254)
at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1862)
at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1144)
at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:337)
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createV7ProviderConnection(WMQConnectionFactory.java:6772)
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:6151)
at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createConnection(JmsConnectionFactoryImpl.java:280)
at com.ibm.mq.jms.MQConnectionFactory.createCommonConnection(MQConnectionFactory.java:6138)
at com.ibm.mq.jms.MQQueueConnectionFactory.createQueueConnection(MQQueueConnectionFactory.java:115)
at com.ibm.mq.jms.MQQueueConnectionFactory.createConnection(MQQueueConnectionFactory.java:198)
at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:185)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:481)
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:566)
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:557)
at com.java.geek.JmsMessageSender.send(JmsMessageSender.java:34)
at com.java.geek.DemoMain.main(DemoMain.java:20)
第
行
jmsTemplate.send(new MessageCreator() {
我无法连接到 Websphere MQ。请指出代码中的错误。
这看起来像是 MQ 缺陷,似乎与以下 APAR 匹配:
http://www-01.ibm.com/support/docview.wss?uid=swg1IC88187
说在 7.0.1.10+、7.1.0.3+ 和 7.5.0.1+ 中已修复(暗示未来的主要版本)。升级客户端以超过这些级别,问题应该得到解决。
这是 jdk 错误:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7173464
您可以在虚拟机参数中附加 -Djava.util.Arrays.useLegacyMergeSort=true。
我正在使用 spring jms 连接到 Websphere MQ。我正在尝试通过本地主机连接,现在不使用 jndi 信息。
Connection names (all as an example): hostname: <Websphere ip address> http://localhost:9043
given hostname 12.123.0.12
In Resources->JMS->Queue connection Factories
name: MQDemo
JNDI name: MQDemo
2 Queues:
name: MQ.T11.UPDATE.REQUEST
JNDI name: jms/MQ.T11.UPDATE.REQUEST
name: MQ.T11.INQUIRY.REPLY
JNDI name: jms/MQ.T11.UPDATE.REQUEST
DemoMain.java
在主要方法中:
ApplicationContext ctx = new ClassPathXmlApplicationContext("app-context.xml");
// get bean from context
JmsMessageSender jmsMessageSender = (JmsMessageSender)ctx.getBean("jmsMessageSender");
// send to default destination
jmsMessageSender.send();
JMSMessageSender.java
package name: com.java.geek
@Autowired
private JmsTemplate jmsTemplate;
/**
* send text to default destination
* @param text
*/
@Cacheable("message")
public void send() {
System.out.println("in send");
jmsTemplate.send(new MessageCreator() {
@Override
public Message createMessage(Session session)throws JMSException {
System.out.println("in create message");
Message message = (Message) session.createTextMessage("Hello JMS");
return message;
}
});
}
public JmsTemplate getJmsTemplate()
{
return jmsTemplate;
}
public void setJmsTemplate(JmsTemplate jmsTemplate)
{
this.jmsTemplate = jmsTemplate;
}
应用-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.java.geek" />
<bean id="amqConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
<property name="hostName">
<value>http://localhost:9043</value>
</property>
<property name="port">
<value>1415</value>
</property>
<property name="queueManager">
<value>MQDemo</value>
</property>
<property name="transportType">
<value>1</value>
</property>
</bean>
<!-- Pooled Spring connection factory -->
<bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean" lazy-init="true">
<property name="MQDemo" value="java:comp/env/jms/MQDemo" />
<property name="lookupOnStartup" value="false"/>
<property name="cache" value="true" />
<property name="proxyInterface" value="javax.jms.QueueConnectionFactory"/>
<constructor-arg ref="amqConnectionFactory" />
</bean>
<!-- JmsTemplate Definition -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory"><ref bean="amqConnectionFactory" /> </property>
<property name="pubSubDomain"><value>false</value></property>
<!-- <property name="defaultDestination"><ref bean="senderQueue" /></property> -->
</bean>
<!-- ======================================================= -->
<!-- JMS Send, define default destination and JmsTemplate -->
<!-- ======================================================= -->
<!-- Default Destination Queue Definition -->
<bean id="senderQueue" class="com.ibm.mq.jms.MQQueue">
<constructor-arg value="MQ.T11.UPDATE.REQUEST"/>
</bean>
<bean id="jmsMessageSender" class="com.java.geek.JmsMessageSender">
<property name="jmsTemplate"><ref bean="JmsTemplate"/></property>
</bean>
</beans>
我收到一个错误,
Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(TimSort.java:758)
at java.util.TimSort.mergeAt(TimSort.java:494)
at java.util.TimSort.mergeCollapse(TimSort.java:421)
at java.util.TimSort.sort(TimSort.java:225)
at java.util.TimSort.sort(TimSort.java:184)
at java.util.Arrays.sort(Arrays.java:670)
at com.ibm.mq.constants.MQConstants.getFields(MQConstants.java:277)
at com.ibm.mq.constants.MQConstants.lookup(MQConstants.java:204)
at com.ibm.mq.constants.MQConstants.lookup(MQConstants.java:264)
at com.ibm.mq.constants.MQConstants.lookup(MQConstants.java:254)
at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1862)
at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1144)
at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:337)
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createV7ProviderConnection(WMQConnectionFactory.java:6772)
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:6151)
at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createConnection(JmsConnectionFactoryImpl.java:280)
at com.ibm.mq.jms.MQConnectionFactory.createCommonConnection(MQConnectionFactory.java:6138)
at com.ibm.mq.jms.MQQueueConnectionFactory.createQueueConnection(MQQueueConnectionFactory.java:115)
at com.ibm.mq.jms.MQQueueConnectionFactory.createConnection(MQQueueConnectionFactory.java:198)
at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:185)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:481)
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:566)
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:557)
at com.java.geek.JmsMessageSender.send(JmsMessageSender.java:34)
at com.java.geek.DemoMain.main(DemoMain.java:20)
第
行jmsTemplate.send(new MessageCreator() {
我无法连接到 Websphere MQ。请指出代码中的错误。
这看起来像是 MQ 缺陷,似乎与以下 APAR 匹配:
http://www-01.ibm.com/support/docview.wss?uid=swg1IC88187
说在 7.0.1.10+、7.1.0.3+ 和 7.5.0.1+ 中已修复(暗示未来的主要版本)。升级客户端以超过这些级别,问题应该得到解决。
这是 jdk 错误:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7173464 您可以在虚拟机参数中附加 -Djava.util.Arrays.useLegacyMergeSort=true。