我需要使用服务激活器。我想在运行时将它绑定到输入和输出通道,而不是在开发或部署时。因此不能使用基于XML的服务激活器实例化。我在程序执行期间声明了交换和队列。因此,需要在程序执行期间动态地实例化服务激活器。
我希望实现以下功能但使用代码而不是XML:
<service-activator input-channel="exampleChannel" output-channel="replyChannel"
ref="somePojo" method="someMethod"/>
上述XML代码段的等效代码是什么?似乎Spring-Integration中没有ServiceActivator类。
感谢。
答案 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
基础设施:beanFactory
,beanClassLoader
属性等。
请致电afterPropertiesSet()
。
主要目标 - 订阅该exampleChannel
的处理程序。
这取决于该频道的类型。如果它是直接一个或执行者,那么构建EventDrivenConsumer
就足够了。
但如果排队,您应该构建PollingConsumer
。
这只是一个如何实现您的任务的草案,可能还有其他东西可以构建复杂的解决方案。