考虑一个代码:
@Configuration
public class MyConf {
@MessagingGateway(defaultRequestChannel = "channel")
public interface Sender {
void send(String out);
}
}
@Component
public class Consumer {
@ServiceActivator(inputChannel = "channel", poller = @Poller(fixedRate = "100"))
public void handle(String input) throws InterruptedException {
//
}
}
@Component
public class HistoricalTagRunner implements CommandLineRunner {
@Autowired
private Sender sender;
@Override
public void run(String... args) throws Exception {
List<String> input = ...
input.forEach(r -> sender.send(r));
//ok, now all input is send and application exit
//without waiting for message processing
}
}
因此所有消息都发送给使用者,但是应用程序退出时不希望所有消息都已处理 有没有办法告诉spring等待“频道”中的所有消息都被处理?
答案 0 :(得分:1)
Spring应用程序实际上只是Java应用程序,它不是Spring的责任来控制应用程序的运行方式。您可以使用任何Java功能来阻止主线程,直到发生某些事件为止。
例如,在我们的示例中,我们使用System.in.read()
来阻止主线程:
System.out.println("Hit 'Enter' to terminate");
System.in.read();
ctx.close();
在这种情况下,最终用户必须从CLI输入一些内容以解除对该线程的阻止并退出程序。
另一种方法是,如果您事先知道一些消息,则等待一些CountDownLatch
。因此,处理消息时,您的流程必须“倒计时”扣锁。