首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring集成注释和SmartLifecycle接口

Spring集成注释和SmartLifecycle接口
EN

Stack Overflow用户
提问于 2014-12-01 15:38:35
回答 1查看 9.7K关注 0票数 2

我需要将一些遗留代码移植到基于spring集成的应用程序中。我决定通过@InboundChannelAdapter注释配置入站通道适配器,该注释按预期工作。

问题是,当调用入站通道适配器的start()stop()方法时,我需要执行一些代码。

我试图通过实现SmartLifecycle接口来实现这一点,但这并没有给我带来任何帮助。有谁有其他建议我应该试试吗?我现在有点卡住了..。

编辑:代码示例

代码语言:javascript
复制
@MessageEndpoint
@Component
public class InputSource implements SmartLifecycle {
    public void start() {
        //my code to be executed
    }

    public void stop() {
        //my code
    }

    @InboundChannelAdapter("some.channel")
    public Message<?> read() {
        //my code that returns a message
    }

}

在启动入站通道适配器时,将调用read()方法中的代码,但在创建上下文时不会调用start()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-01 17:18:04

什么版本的Spring集成?这对我来说很好用4.1.0。

代码语言:javascript
复制
@EnableIntegration
@MessageEndpoint
@Component
public class InputSource implements SmartLifecycle {

    private boolean running;

    @Override
    public void start() {
        System.out.println("start");
        running = true;
    }

    @Override
    public void stop() {
        running = false;
    }

    @InboundChannelAdapter(value = "toRabbit", poller = @Poller(fixedDelay = "5000", maxMessagesPerPoll = "1"))
    public Message<?> read() {
        return new GenericMessage<String>("foo");
    }

    @Override
    public boolean isRunning() {
        return running;
    }

    @Override
    public int getPhase() {
        return 0;
    }

    @Override
    public boolean isAutoStartup() {
        return true;
    }

    @Override
    public void stop(Runnable callback) {
        stop();
        callback.run();
    }

}

(即使没有@EnableIntegrationstart()方法也会被调用)。

无论如何,请记住,这里的start/stop位于不同的bean ( InputSource)上,而适配器上的start/stop位于它的SourcePollingChannelAdapter上。您可以使用phase控制订单。

编辑:

根据下面的注释,您希望适配器启动其源。即使我们这么做了..。

代码语言:javascript
复制
if (this.source implements Lifecycle) {
    ((Lifecycle) source).start();
}

...it在这里不能工作,因为源不是您的组件,它是一个对bean的其余部分一无所知的MethodInvokingMessageSource,它只知道read()方法。

一种解决方法是子类SourcePollingChannelAdapter并重写它的doStart()方法.

代码语言:javascript
复制
@Override // guarded by super#lifecycleLock
protected void doStart() {
     myInputSource.start();
     super.doStart();
}

您必须手动连接这个(和您的bean)。也许最简单的方法就是让你的InputSource实现MessageSource.

代码语言:javascript
复制
@Component
public class InputSource implements MessageSource<String>, Lifecycle {

    private boolean running;

    @Override
    public void start() {
        System.out.println("start");
        running = true;
    }

    @Override
    public void stop() {
        running = false;
    }

    @Override
    public Message<String> receive() {
        return new GenericMessage<String>("foo");
    }

    @Override
    public boolean isRunning() {
        return running;
    }

}

并将其连接到您的MySPCA中,以及轮询信息。

我创建了一个改进JIRA问题来支持这个用例。

谢谢!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27231833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档