繁体   English   中英

具有JBoss createConnection()的Spring Integration入站JMS:IllegalArgumentException:ClassCastException

[英]Spring Integration inbound JMS with JBoss createConnection(): IllegalArgumentException: ClassCastException

我正在尝试获得一个简单的Spring Integration测试,该测试可以从以独立模式(standalone.bat -c Standalone-full)运行的JBoss EAP(在Windows 7 Pro上运行的版本6.4.0.GA)上的HornetQ托管的JMS队列中检索消息.XML)。

使用简单的Java JMS程序时,JMS测试运行良好。 现在,我试图添加Spring Integration,但出现以下错误:

18:29:03,197 ERROR [org.springframework.jms.listener.DefaultMessageListenerContainer]
(org.springframework.jms.listener.DefaultMessageListenerContainer#0-1) 
Could not refresh JMS Connection for destination 'anotherQueue' - 
retrying in 5000 ms. Cause: AOP configuration seems to be invalid: 
tried calling method [public abstract javax.jms.Connection javax.jms.ConnectionFactory.createConnection() 
throws javax.jms.JMSException] on target [HornetQQueue[anotherQueue]]; 
nested exception is java.lang.IllegalArgumentException: java.lang.ClassCastException@511504f4

Spring配置文件为:

的applicationContext排序,入站JMS-弹簧integration.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:aop=...

    <bean id="jndiTemplateBilling" class="org.springframework.jndi.JndiTemplate">
        <property name="environment">
            <props>
                <prop key="java.naming.factory.initial">org.jboss.as.naming.InitialContextFactory</prop>
                <prop key="java.naming.provider.url">remote://localhost:4447</prop>
            </props>
        </property>
    </bean>

    <bean id="jndiObjectFactoryBeanBilling" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiTemplate" ref="jndiTemplateBilling" />

        <property name="jndiName" value="java:jboss/exported/jms/queue/anotherQueue" />
        <property name="lookupOnStartup" value="false" />
        <property name="proxyInterfaces">
            <list>
                <value>javax.jms.QueueConnectionFactory</value>
                <value>javax.jms.TopicConnectionFactory</value>
                <value>java.io.Externalizable</value>
            </list>
        </property>
    </bean>

    <bean id="jndiDestinationResolver"
        class="org.springframework.jms.support.destination.JndiDestinationResolver">
        <property name="jndiTemplate" ref="jndiTemplateBilling" />
        <property name="cache" value="true" />
    </bean>

    <int-jms:inbound-gateway
        request-destination-name="anotherQueue"
        request-channel="inboundOrderingBillingJms" 
        destination-resolver="jndiDestinationResolver"
        connection-factory="jndiObjectFactoryBeanBilling" />

    <int:channel id="inboundOrderingBillingJms" /> <!-- handled by OrderingBillingInboundEndpoint -->

    <context:component-scan base-package="com.att.ordering.endpoints.jms" />
    <context:annotation-config />
    <context:spring-configured />
    <int:annotation-config />

</beans>

applicationContext-ordering-inbound-jms.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans ...">

    <context:annotation-config />
    <context:spring-configured />
    <int:annotation-config />

    <context:component-scan base-package="com.att.ordering.endpoints.jms"/>

</beans>

ServiceActivator类

package com.att.ordering.endpoints.jms;

    import javax.xml.bind.JAXBElement;

    import org.springframework.integration.annotation.ServiceActivator;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;

    @Component
    public class OrderingBillingInboundEndpoint
    {
        @ServiceActivator(inputChannel = "inboundOrderingBillingJms")
        //public void handleMessage(JAXBElement<String> accountNumber)
        public void handleMessage(String accountNumber)
        {
            System.out.println("In OrderingBillingInboundEndpoint.handleMessage - accountNumber=" + accountNumber);
        }
    }

我用WAR引导弹簧; WEB-INF / web.xml是:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>parentContextKey</param-name>
        <param-value>ordering-spring-bootstrap.war.context</param-value>
    </context-param>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value></param-value>
    </context-param>

</web-app>

WEB-INF / classes / beanRefContext.xml是:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
    <bean id="ordering-spring-bootstrap.war.context"
        class="org.springframework.context.support.ClassPathXmlApplicationContext">
        <constructor-arg>
            <list>
                <value>/applicationContext-ordering-inbound-jms-spring-integration.xml</value>
                <value>/applicationContext-ordering-inbound-jms.xml</value>
            </list>
        </constructor-arg>
    </bean>
</beans>

在Artem首次回复后进行补充

我的JNDI名称是java:jboss / exported / jms / queue / anotherQueue 它绑定到HornetQQueue [anotherQueue]

下面在JBoss中显示了它-注意:有2个JNDI条目。 我正在使用第二个: 在此处输入图片说明

这是正确的-我能够按以下方式运行Java JMS程序(不带Spring集成):

final Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
env.put(Context.PROVIDER_URL, "remote://localhost:4447");
env.put(Context.SECURITY_PRINCIPAL, "appuser");
env.put(Context.SECURITY_CREDENTIALS, "appuser1!");
context = new InitialContext(env);

// JNDI name in JBoss is: java:jboss/exported/jms/queue/anotherQueue
connectionFactory = (ConnectionFactory) context.lookup("jms/RemoteConnectionFactory");
destination = (Destination) context.lookup("jms/queue/anotherQueue");
connection = connectionFactory.createConnection("appuser", "appuser1!");
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
consumer = session.createConsumer(destination);
consumer.setMessageListener(new MyListener());
connection.start();

我现在正在尝试使用Spring Integration获得相同的简单示例。

问题:

(A)我应该把用户名和密码放在哪里?

(B)以下正确吗? 如果没有,那应该是什么?

<bean id="jndiTemplateBilling" class="org.springframework.jndi.JndiTemplate">
    <property name="environment">
        <props>
            <prop key="java.naming.factory.initial">org.jboss.as.naming.InitialContextFactory</prop>
            <prop key="java.naming.provider.url">remote://localhost:4447</prop>
        </props>
    </property>
</bean>

(C)我应该如何更改以下内容? 我删除了proxyInterfaces; 还有什么应该改变? 我不知道如何使用jee:jndi-lookup

<bean id="jndiObjectFactoryBeanBilling" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiTemplate" ref="jndiTemplateBilling" />
        <property name="jndiName" value="java:jboss/exported/jms/queue/anotherQueue" />
        <property name="lookupOnStartup" value="false" />
    </bean>

(D)以下内容保持不变吗?

<bean id="jndiDestinationResolver"
        class="org.springframework.jms.support.destination.JndiDestinationResolver">
        <property name="jndiTemplate" ref="jndiTemplateBilling" />
        <property name="cache" value="true" />
    </bean>

(E)以下改变吗?

<int-jms:inbound-gateway
        request-destination-name="anotherQueue"
        request-channel="inboundOrderingBillingJms" 
        destination-resolver="jndiDestinationResolver"
        connection-factory="jndiObjectFactoryBeanBilling" />

您似乎对jndiObjectFactoryBeanBilling bean定义有误。 那是为了

<property name="jndiName" value="java:jboss/exported/jms/queue/anotherQueue" />

日志确认了什么:

在目标[HornetQQueue [anotherQueue]]上;

但这确实必须用于javax.jms.ConnectionFactory

connection-factory="jndiObjectFactoryBeanBilling" 

因此,只需尝试将JNDI名称更改为正确的名称即可。

另一方面,我从未将所有那些proxyInterfaces选项用于JBOSS JNDI资源。 它们按原样运行良好,例如:

<jee:jndi-lookup id="jndiMqConnectionFactory" jndi-name="${mqConnectionFactory}"/>

<jee:jndi-lookup id="auditQueue" jndi-name="queue/AuditQueue"/>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM