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

Spring集成@ServiceActivator或@Bean定义以支持@Profile使用

公羊喜
2023-03-14

我对服务激活器的用法及其定义方式有疑问。

我有3个服务激活器,它们从不同的输入通道接收消息,并将它们发送到单个输出通道。这是在"dev"环境下设计的...

@ServiceActivator(inputChannel = "irregularMessageChannel_1", outputChannel = "combinedChannel")
public String handlerSite1(String data, @Header(IpHeaders.IP_ADDRESS) String connectionId) {
    if (log.isDebugEnabled())
        log.debug("content received from : {} data : {} ", connectionId, data);
    return data;
}

@ServiceActivator(inputChannel = "irregularMessageChannel_2", outputChannel = "combinedChannel")
public String handlerSite2(String data, @Header(IpHeaders.IP_ADDRESS) String connectionId) {
    if (log.isDebugEnabled())
        log.debug("content received from : {} data : {} ", connectionId, data);
    return data;
}

@ServiceActivator(inputChannel = "irregularMessageChannel_3", outputChannel = "combinedChannel")
public String handlerSite3(String data, @Header(IpHeaders.IP_ADDRESS) String connectionId) {
    if (log.isDebugEnabled())
        log.debug("content received from : {} data : {} ", connectionId, data);
    return data;
}

但在prod或prepod环境中,我需要再添加一个。。。因此,我选择使用@Profile注释和@ServiceActivator,如下所示

@ServiceActivator(inputChannel = "irregularMessageChannel_X", outputChannel = "combinedChannel")
@Profile("prod")
public String handlerSiteX(String data, @Header(IpHeaders.IP_ADDRESS) String connectionId) {
    if (log.isDebugEnabled())
        log.debug("content received from : {} data : {} ", connectionId, data);
    return data;
}

但是据我所知,@Profile不能与@ServiceActivator一起工作,它也需要@Bean定义。

但是

当我谷歌了它,它写着,如果我使用@Bean定义,我应该返回MessageHandler...我只是创建MessageHandler并返回它...

@Bean
@ServiceActivator(inputChannel = "irregularMessageChannel_X",outputChannel = "combinedChannel")
@Profile("prod")
public MessageHandler handlerSiteX() {
    MessageHandler handler = new MessageHandler() {
        @Override
        public void handleMessage(Message<?> message) throws MessagingException {
            if (log.isDebugEnabled())
                log.debug("content received from : {} data : {} ", message.getHeaders().get(IpHeaders.IP_ADDRESS), message);
        }
    };
    return handler ;
}

问题第1部分

现在我有一个问题,我如何才能像@ServiceActivator中使用的那样将消息发送到输出通道?

与@Bean注释一起,不允许在@ServiceActivator中使用outputChannel属性。或者有没有办法在不使用@Bean但使用@ServiceActivator的情况下使用@Profile注释?

编辑

问题第2部分

我也应该自己创建输入通道吗?如果使用@Bean定义,还是像@ServiceActivator一样自动创建?

谢谢你的帮助。

共有2个答案

孙承弼
2023-03-14

你必须赢得客户的信任,这就是为什么你必须利用你的资源来提供一个优秀的定制包装解决方案。定制的包装解决方案需要指定,因此,您需要使用具有卓越最高质量的个性化产品包装。定制包装

呼延珂
2023-03-14

只能在@Bean上使用@Profile,而不能在@ServiceActivator方法中使用@Bean

请参见@Bean方法的注释。

您的@Bean应该如下所示:

@Bean
@Profile("...")
@ServiceActivator(inputChannel = "...")
public MessageHandler profiledHandler() {
    ServiceActivatingHandler handler = new ServiceActivatingHandler(myServiceBean, 
        "handlerSiteX");
    handler.setOutputChannelName("combinedChannel");
    return handler;
{

输出通道在处理器上运行;是,如果需要,将创建输入通道。

 类似资料:
  • 在我们的Spring web应用程序中,我们使用Spring bean概要文件区分三种场景:开发、集成和生产。我们使用它们连接到不同的数据库或设置其他常量。 我可以使用使它在本地运行,但这是硬编码的,会导致我们的测试在构建服务器上失败。 我还尝试使用,希望它能以某种方式从Maven导入属性,但这不起作用。 另一个注意事项是,我们还需要配置代码,以便开发人员可以运行web应用程序,然后使用Intel

  • 25.3. 定义动态语言支持的bean 这一节描述了如何针对Spring所支持的动态语言定义受Spring所管理的bean。 请注意本章不会解释这些支持的动态语言的语法和用法。例如,如果你想在你的某个应用中使用Groovy来编写类,我们假设你已经了解Groovy这门语言。如果你需要了解和动态语言本身有关的更多细节,请参考本章末尾第 25.5 节 “更多的资源”一节。 25.3.1. 公共概念 使用

  • 由 Spring IoC 容器管理的对象称为 Bean,Bean 根据 Spring 配置文件中的信息创建。 我们可以把 Spring IoC 容器看作是一个大工厂,Bean 相当于工厂的产品。如果希望这个大工厂生产和管理 Bean,就需要告诉容器需要哪些 Bean,以哪种方式装配。 Spring 配置文件支持两种格式,即 XML 文件格式和 Properties 文件格式。 Properties

  • 我们有一个产品有一个客户,当我们作为服务提供商并且idp在客户端时,我们使用Spring Security SAML为该客户实现了SAML流。 现在,我们有另一个客户也希望身份验证与 SAML 一起使用,并且我们希望同一 SP 为此客户实现 SAML 流,第二个客户还将有 2 个用于 SAML 的流,一个用于移动设备,另一个用于使用相同 IDP 的其他设备。两个客户的 IDP 是不同的。 问题 两

  • 是否可以使用地图作为支持对象?

  • 本文向大家介绍spring 支持几种 bean 的作用域?相关面试题,主要包含被问及spring 支持几种 bean 的作用域?时的应答技巧和注意事项,需要的朋友参考一下 spring 支持 5 种作用域,如下: singleton:spring ioc 容器中只存在一个 bean 实例,bean 以单例模式存在,是系统默认值; prototype:每次从容器调用 bean 时都会创建一个新的示例