【问题标题】:Spring integration service-activator isn't workingSpring集成服务激活器不起作用
【发布时间】:2017-07-20 16:13:19
【问题描述】:

我的程序将 json 字符串消息发送到队列,将消息转换为 json 对象,然后调用服务激活器。服务激活器将 json 对象作为参数,并检查“employer”属性是否在哈希表中,然后将属性“count”添加到 json 对象中:如果属性在表中,则 count 设置为 1,并且如果不是,则为 -1。

然后,更新的 json 对象被转换回字符串并发送到另一个队列。

但是,服务激活器不起作用。我收到此错误(完整的堆栈跟踪位于附加代码下):

java.lang.NoSuchMethodError: org.springframework.messaging.MessageHandlingException:
 method <init>(Lorg/springframework/messaging/Message;Ljava/lang/Throwable;)V not found

但是方法显然是存在的。为什么它要求我将 Throwable 放在我的论点中?我试过这样做,然后得到这个错误(完整的堆栈跟踪在附加代码下):

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.integration.config.ConsumerEndpointFactoryBean#2': Cannot resolve reference to bean 'org.springframework.integration.config.ServiceActivatorFactoryBean#0' while setting bean property 'handler'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.integration.config.ServiceActivatorFactoryBean#0': FactoryBean threw exception on object creation;
nested exception is java.lang.IllegalArgumentException: Target object of type [class SpringMessaging.MessageImprover] has no eligible methods for handling Messages.

我正在使用一个名为 MessageCreator 的类来创建原始 json 字符串消息,然后使用一个名为 MessageImprover 的类来更新它。 代码:

package SpringMessaging;

public class MessageCreator {
public String messageJson;
public String employer;
public int sourceID;

 public void add(String name, int age) {

   messageJson = "{" +
            "\"employer\": \"" + name + "\"" +
            ", \"sourceID\": " + age + 
            '}';

}
 public String getJson(){
return messageJson;
}

}

消息改进器:

package SpringMessaging;

import java.util.HashMap;
import org.json.JSONObject;


public class MessageImprover {

   public JSONObject improve(JSONObject object) {
       int count;
       HashMap<String, Integer> table = new HashMap<String, Integer>();
            table.put("Icelantic", 8);
            table.put("Nordica", 9);
            table.put("Atomic", 10);
            table.put("Volkl", 11);
            table.put("Marker", 12);
        if(table.containsKey(object.getString("employer"))) {
           count = 1;
      } else {
            count = -1;
    }
        object.put("count", count);

     return object;
}

}

字符串到 json 对象转换器:

import org.json.JSONObject;

public class stringtoJsonObject {

    public  JSONObject jsonFromString(String messageJson) {
        JSONObject object = new JSONObject(messageJson);
        return object;
    }
}

配置:

发送:

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:int="http://www.springframework.org/schema/integration"
   xmlns:int-amqp="http://www.springframework.org/schema/integration/amqp" 
   xmlns:rabbit="http://www.springframework.org/schema/rabbit" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="http://www.springframework.org/schema/beans    
                        http://www.springframework.org/schema/beans/spring-beans.xsd    
                        http://www.springframework.org/schema/integration    
                        http://www.springframework.org/schema/integration/spring-integration.xsd
                        http://www.springframework.org/schema/integration/amqp
                        http://www.springframework.org/schema/integration/amqp/spring-integration-amqp.xsd
                        http://www.springframework.org/schema/rabbit
                        http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">

   <rabbit:connection-factory id="connectionFactory" host="bigdata-rdp" username="myuser" password="mypass" />
   <rabbit:template id="amqpTemplate" connection-factory="connectionFactory" />
   <rabbit:admin connection-factory="connectionFactory" />
   <rabbit:queue name="first" auto-delete="false" durable="true" />
   <rabbit:queue name="second" auto-delete="false" durable="true" />

   <rabbit:fanout-exchange name="first-exchange" auto-delete="true" durable="true">
    <rabbit:bindings>
     <rabbit:binding queue="first" />
    </rabbit:bindings>
   </rabbit:fanout-exchange>

  <int:channel id="senderChannel">    
   </int:channel>

  <int-amqp:outbound-channel-adapter channel="senderChannel" exchange-name="first-exchange"  amqp-template="amqpTemplate" />

   <int-amqp:outbound-gateway id="outbound" request-channel="senderChannel" exchange-name="first-exchange" amqp-template="amqpTemplate" />

   <int:gateway id="Sender" service-interface="SpringMessaging.Sender" default-request-channel="senderChannel">
  <int:method name="sendMessage" />
   </int:gateway>

  <int:poller default="true" fixed-rate="100"/>

</beans>

从第一个队列接收,转换,更新并发送到第二个队列:

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:int="http://www.springframework.org/schema/integration"
   xmlns:int-amqp="http://www.springframework.org/schema/integration/amqp" 
   xmlns:rabbit="http://www.springframework.org/schema/rabbit" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="http://www.springframework.org/schema/beans    
                        http://www.springframework.org/schema/beans/spring-beans.xsd    
                        http://www.springframework.org/schema/integration    
                        http://www.springframework.org/schema/integration/spring-integration.xsd
                        http://www.springframework.org/schema/integration/amqp
                        http://www.springframework.org/schema/integration/amqp/spring-integration-amqp.xsd
                        http://www.springframework.org/schema/rabbit
                        http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">

    <rabbit:connection-factory id="connectionFactory" host="bigdata-rdp" username="myuser" password="mypass" />
   <rabbit:template id="amqpTemplate" connection-factory="connectionFactory" />
   <rabbit:admin connection-factory="connectionFactory" />
   <rabbit:queue name="first" auto-delete="false" durable="true" />
   <rabbit:queue name="second" auto-delete="false" durable="true" />

  <int:poller default="true" fixed-rate="100"/>

   <rabbit:fanout-exchange name="second-exchange" auto-delete="true" durable="true">
     <rabbit:bindings>
       <rabbit:binding queue="second" />
     </rabbit:bindings>
   </rabbit:fanout-exchange>

    <int-amqp:outbound-channel-adapter channel="messageOutputChannel" exchange-name="second-exchange"  amqp-template="amqpTemplate" />

   <int-amqp:inbound-channel-adapter channel="messageInputChannel" queue-names="first" connection-factory="connectionFactory" />

   <int:channel id="messageInputChannel" />
   <int:channel id="jsonInputChannel"/>
   <int:channel id="jsonOutputChannel"/>
   <int:channel id="messageOutputChannel"/>

   <int:transformer input-channel="messageInputChannel" output-channel="jsonInputChannel" ref="messageToJsonObjectConverter" method="jsonFromString" />
   <bean id="messageToJsonObjectConverter" class="SpringMessaging.stringtoJsonObject" />

   <int:service-activator input-channel="jsonInputChannel" output-channel="jsonOutputChannel" ref="jsonObjectTransformer" method="improve" />
       <bean id="jsonObjectTransformer" class="SpringMessaging.MessageImprover" />

   <int:object-to-string-transformer input-channel="jsonOutputChannel" output-channel="messageOutputChannel" />

</beans>

第一个错误的完整堆栈跟踪:

java.lang.NoSuchMethodError: 
org.springframework.messaging.MessageHandlingException: method <init>(Lorg/springframework/messaging/Message;Ljava/lang/Throwable;)V not found
at org.springframework.integration.handler.MethodInvokingMessageProcessor.processMessage(MethodInvokingMessageProcessor.java:96)
at org.springframework.integration.handler.ServiceActivatingHandler.handleRequestMessage(ServiceActivatingHandler.java:89)
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:109)
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127)
at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116)
at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:148)
at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:121)
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:89)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:423)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:373)
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:114)
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:44)
at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:92)
at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:358)
at org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:269)
at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:186)
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:115)
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127)
at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116)
at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:148)
at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:121)
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:89)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:423)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:373)
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:114)
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:44)
at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:92)
at org.springframework.integration.endpoint.MessageProducerSupport.sendMessage(MessageProducerSupport.java:188)
at org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter.access$1100(AmqpInboundChannelAdapter.java:56)
at org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter$Listener.processMessage(AmqpInboundChannelAdapter.java:246)
at org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter$Listener.onMessage(AmqpInboundChannelAdapter.java:203)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:822)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:745)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$001(SimpleMessageListenerContainer.java:97)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$1.invokeListener(SimpleMessageListenerContainer.java:189)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.invokeListener(SimpleMessageListenerContainer.java:1276)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:726)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1219)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:1189)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1500(SimpleMessageListenerContainer.java:97)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1421)
 at java.lang.Thread.run(Thread.java:748)
org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer run
SEVERE: Stopping container from aborted consumer
org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer doShutdown
INFO: Waiting for workers to finish.
org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer doShutdown
INFO: Successfully waited for workers to finish.

如果我将 Throwable V 放在“改进”的参数中,则完整的堆栈跟踪:

Exception in thread "main" 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.integration.config.ConsumerEndpointFactoryBean#2': Cannot resolve reference to bean 'org.springframework.integration.config.ServiceActivatorFactoryBean#0' while setting bean property 'handler'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.integration.config.ServiceActivatorFactoryBean#0': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Target object of type [class SpringMessaging.MessageImprover] has no eligible methods for handling Messages.
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1531)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1276)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:742)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at SpringMessaging.Main.main(Main.java:15)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'org.springframework.integration.config.ServiceActivatorFactoryBean#0': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Target object of type [class SpringMessaging.MessageImprover] has no eligible methods for handling Messages.
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:175)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:103)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1634)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:254)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
... 15 more

我不明白为什么它甚至要求我将 Throwable 作为参数放在“改进”方法中。有什么想法吗?

【问题讨论】:

    标签: java json rabbitmq spring-integration


    【解决方案1】:
    java.lang.NoSuchMethodError: 
    org.springframework.messaging.MessageHandlingException: method <init>(Lorg/springframework/messaging/Message;Ljava/lang/Throwable;)V not found
    

    StackTrace 下面应该有一些cause。换句话说,你并没有展示整个画面。

    第二种情况很清楚。你有这样的签名:

    JSONObject improve(JSONObject object, Throwable e) 
    

    Frame 无法理解在未来的消息中处理 payload 的方法参数。

    我很确定 NoSuchMethodErrorservice-activator 定义无关。下游还有其他东西。

    【讨论】:

    • 嗨,Artem,非常感谢!我使用 try-catch 打印了更详细的堆栈跟踪,发现真正的问题是变量命名,所以现在一切正常!
    猜你喜欢
    • 2013-01-08
    • 1970-01-01
    • 2017-06-24
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 2019-01-15
    • 2017-01-30
    相关资源
    最近更新 更多