gpt4 book ai didi

java - Spring Integration Annotations 和 SmartLifecycle 接口(interface)

转载 作者:行者123 更新时间:2023-11-30 11:11:49 26 4
gpt4 key购买 nike

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

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

我试图通过实现 SmartLifecycle 接口(interface)来实现这一点,但这并没有让我得到任何结果。有没有人有任何其他建议我应该尝试?我现在有点卡住了...

编辑:代码示例

@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() 方法中的代码在我启动入站 channel 适配器时被调用,但是 start() 在我的上下文创建时没有被调用。

最佳答案

什么版本的 Spring Integration?这对我来说很好用 4.1.0...

@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();
}

}

(即使没有 @EnableIntegration,也会调用 start() 方法)。

无论如何,请记住这里的开始/停止是在不同的 bean(InputSource)上,而适配器上的开始/停止是在它的 SourcePollingChannelAdapter。您可以使用 phase 控制顺序。

编辑:

根据您在下面的评论,您希望适配器启动其源代码。即使我们那样做了...

if (this.source implements Lifecycle) {
((Lifecycle) source).start();
}

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

一个解决方法是子类化 SourcePollingChannelAdapter 并覆盖它的 doStart() 方法...

@Override // guarded by super#lifecycleLock
protected void doStart() {
myInputSource.start();
super.doStart();
}

您必须手动连接这个(和您的 bean)。可能最简单的事情是让您的 InputSource 实现 MessageSource...

@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

我创建了一个 Improvement JIRA Issue以支持此用例。

谢谢!

关于java - Spring Integration Annotations 和 SmartLifecycle 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27231833/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com