当前位置: 首页 > 知识库问答 >
问题:

Spring集成-使用Java配置转换服务激活器

吕亮
2023-03-14

我试图从Spring集成示例中转换“Hello World示例”(https://github.com/spring-projects/spring-integration-samples/tree/master/basic/helloworld)从XML到Java配置(使用@Configuration注释也是如此)。

配置类如下所示:

@Configuration
@EnableIntegration
public class BasicIntegrationConfig{

    @Bean
    public DirectChannel inputCHannel() {
        return new DirectChannel();
    }

    @Bean
    public QueueChannel outputChannel() {
        return new QueueChannel();
    }

    @Bean
    @ServiceActivator(inputChannel= "inputChannel", outputChannel= "outputChannel" )
    public MessageHandler fileWritingMessageHandler() {
        MessageHandler mh =  new MessageHandler() {
            @Override
            public void handleMessage(Message<?> message) throws MessagingException {
                System.out.println("Message payload: " + message.getPayload());
            }
        };
        return mh;
    }
}

为了测试它,我使用示例项目提供的main()

DirectChannel fileChannel = applicationContext.getBean("inputChannel", DirectChannel.class);
QueueChannel outputChannel = applicationContext.getBean("outputChannel", QueueChannel.class);
System.out.println("********** SENDING MESSAGE");
fileChannel.send(new GenericMessage<>("test"));
System.out.println(outputChannel.receive(0).getPayload());

我在控制台中看到“Message payload:test”,但不幸的是,我没有在outputchannel上接收消息(我在outputchannel.receive(0)上有一个NullPointerException)。您知道为什么Service Activator不将消息发送到输出通道吗?

共有2个答案

沈畅
2023-03-14

谢谢你,加里,切换到以下位置后效果很好:

    @Bean
    @ServiceActivator(inputChannel= "inputChannel")
    public AbstractReplyProducingMessageHandler fileWritingMessageHandler() {
        AbstractReplyProducingMessageHandler  mh = new AbstractReplyProducingMessageHandler() {
            @Override
            protected Object handleRequestMessage(Message<?> message) {
                String payload= (String)message.getPayload();
                return "Message Payload : ".concat(payload);
            }
        };
        mh.setOutputChannelName("outputChannel");
        return mh;
    }

作为旁注,我必须删除@ServiceActivator注释中的输出通道属性,并将其放在方法体中(如果没有,则为Bean验证异常)。

双浩涆
2023-03-14

你的MessageHandler返回void

您需要子类AbstractReplyProducingMessageHandler来代替。

 类似资料:
  • 我在一个简单的POJO中配置了一个服务激活器,我想将其转换为Java DSL。 现在,我的Java DSL如下所示, 有一个带有服务激活器的POJO, 在XML中,相应的配置如下所示, 如何在Java DSL中调用ServiceActivator方法?我正在考虑使用,但参数应该是什么 在使用Java DSL时,是否有空通道的概念?如果是,我们如何指定

  • 我有一个队列通道和一个带有轮询器的服务激活器,轮询器从该队列中读取数据。我希望配置为“我希望50个线程轮询该队列,每次轮询并返回消息时,在此线程上调用服务激活器指向的服务。” 该服务没有异步注释,但无状态,可以以并发方式安全运行。 下面的方法能做到吗?有没有其他首选的方法来实现这一点?

  • 我有一个Web服务,每个版本将有多个版本和多个类。我想在启动时动态创建服务激活器,这样我就可以减少配置量,从而更容易维护。开发人员可以放入一个新类,SI会自动拾取它。 我编码了一个Application Listener: 稍后在路由器中,我有以下代码: 但当路由器尝试路由时,我会出现以下错误: 我该怎么做?我需要动态创建服务激活器,并在以后将消息路由到这些激活器。 没有办法在ServiceAct

  • 我有一个非常简单的集成流程: 服务激活器调用的方法尝试将消息中的数据与数据库中的某些数据相匹配。如果是,则返回匹配的数据。如果没有,它将返回。 如果我没有设置必需回复为真,那么回复似乎会从集成流中消失,导致服务接口永远不会返回,从而导致应用程序挂起。如果我设置了必需回复为真,我至少会得到一个异常,但是应用程序仍然挂起,因为网关的服务接口永远不会返回: spring集成参考资料中似乎没有记录这种行为

  • 服务器使用java,并通过TCP与C客户端通信。当用户离开计算机超过5分钟时,客户端将向服务器发送一个字节数组。java服务器由spring集成ip编写。我不知道是否应该使用nio=“true”设置?并发有什么问题吗?如何使用自定义协议转换字节数组?我是TCP和spring集成的新手,谢谢你的帮助! 我在按照示例编写应用程序时遇到了一个问题。服务器对字节流进行反序列化,然后回显服务,但在回显服务返

  • 如何将具有approle[in vault]的微服务连接到具有vault后端的Spring Cloud Config Server。 我可以看到使用根令牌的示例,如curl-x GET http://localhost:8888/my-service/default-h“x-config-token:s.tmqara2lasdnhjzqqzy7y8px”。但是我找不到任何使用approle连接sp