1

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

我想实现以下但使用代码而不是 XML:

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

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

谢谢。

4

2 回答 2

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"));

}

}

于 2014-06-22T02:50:53.147 回答
3

有一堂课适合你—— ServiceActivatingHandler。但是在运行时做到这一点并不容易。当然,您可以简单地向该类的构造函数提供您的 POJO 及其方法。进一步和重要的选择是outputChannel. 在这里你应该以某种方式提供BeanFactory基础设施:beanFactorybeanClassLoader属性等。调用它的afterPropertiesSet(). 主要目标 -将该处理程序订阅exampleChannel. 这取决于该频道的类型。如果它是直接的或执行者,它就足够了EventDrivenConsumer。但如果它排队,你应该建立PollingConsumer.

这只是如何完成您的任务的草稿,可能还有其他东西要构建复杂的解决方案。

于 2013-11-13T10:28:24.007 回答