如何在代码中以编程方式(不使用xml文件)实例化Spring-Integration的服务激活器?

时间:2013-11-13 09:38:14

标签: spring spring-integration

我需要使用服务激活器。我想在运行时将它绑定到输入和输出通道,而不是在开发或部署时。因此不能使用基于XML的服务激活器实例化。我在程序执行期间声明了交换和队列。因此,需要在程序执行期间动态地实例化服务激活器。

我希望实现以下功能但使用代码而不是XML:

<service-activator input-channel="exampleChannel" output-channel="replyChannel"
                   ref="somePojo" method="someMethod"/>

上述XML代码段的等效代码是什么?似乎Spring-Integration中没有ServiceActivator类。

感谢。

2 个答案:

答案 0 :(得分:4)

这个问题已经回答,但我认为一个例子可能会有所帮助。

public class NoContextExample {
private static final Logger logger = Logger.getLogger(NoContextExample.class);

public static void main(String[] args) {
    //register an input channel
    SubscribableChannel inputChannel = new DirectChannel();
    //register a service-activator message handler
    ServiceActivatingHandler serviceActivator = new ServiceActivatingHandler(new somePojo(),"someMethod");
    //set service activator as a handler for input channel
    inputChannel.subscribe(serviceActivator);

    //register an output channel
    SubscribableChannel outputChannel = new DirectChannel();
    //set the service activator's output channel to outputChannel
    serviceActivator.setOutputChannel(outputChannel);
    //register a message handler for output channel
    MessageHandler handler = new MessageHandler(){
                                 @Override
                                 public void handleMessage(Message<?> message) throws MessagingException{
                                    logger.info("MessageChannel.handleMessage ["+message.getPayload()+"]");
                                  }
                              };
    //subscribe message handler to output channel
    //this is equivalent to EventDrivenConsumer consumer = new EventDrivenConsumer(outputChannel, handler);
    //and then doing consumer.start(); then inputChannel.send(); then consumer.stop();
    outputChannel.subscribe(handler);

    // we are now ready to send the message on input channel
    inputChannel.send(new GenericMessage<String>("World"));

}

}

答案 1 :(得分:3)

有一节课 - ServiceActivatingHandler。 但是在运行时这样做并不容易。 当然,您可以简单地向该类的构造函数提供您的POJO及其方法。 更重要的选项是outputChannel。 在这里,您应该以某种方式提供BeanFactory基础设施:beanFactorybeanClassLoader属性等。 请致电afterPropertiesSet()。 主要目标 - 订阅exampleChannel的处理程序。 这取决于该频道的类型。如果它是直接一个或执行者,那么构建EventDrivenConsumer就足够了。 但如果排队,您应该构建PollingConsumer

这只是一个如何实现您的任务的草案,可能还有其他东西可以构建复杂的解决方案。