Spring Rabbitを使用して、RabbitTemplate.convertAndSendを使用して複数のメッセージをRabbitキューに配置して終了するスクリプトを作成しました。しかし、ウサギの接続は、メッセージがエンキューされた後でもアプリを生かし続けるように見えます。メッセージがエンキューされた後、Rabbitサーバーに停止するように通知する方法はありませんでした。Spring RabbitのRabbitTemplateをきれいにシャットダウンできますか?
最高の解決策は、convertAndSend呼び出しをconvertSendAndReceiveに変更して、メッセージが正常にエンキューされたことを確認してから、System.exit(0)を使用して終了することです。私はconvertAndSendAndSendがバックグラウンドスレッドやsomesuchで起こっているように見えるのでconvertSendAndReceiveに切り替えました。これらの呼び出しをいくつか行った後にSystem.exit(0)を実行すると、最初のものだけが成功するためです。
RabbitTemplateを作成してもこの動作は発生しません。 "send"メソッドの1つを使ってそれを使用します。
次のコードは、この問題を示しています。
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import static issues.RabbitSettings.*; //Static fields containing my test Rabbit connection info
public class RabbitTemplateShutdownIssue {
public static void main(String[] args) {
RabbitTemplate rabbitTemplate = createRabbitTemplate();
rabbitTemplate.convertAndSend(ROUTING_KEY, "Test"); // Or convertSendAndReceive
// The app never exits
}
private static RabbitTemplate createRabbitTemplate() {
RabbitTemplate rabbitTemplate = new RabbitTemplate(getConnectionFactory());
rabbitTemplate.setExchange(EXCHANGE);
rabbitTemplate.setMandatory(true);
return rabbitTemplate;
}
private static ConnectionFactory getConnectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory(HOSTNAME);
connectionFactory.setPublisherConfirms(true);
connectionFactory.setVirtualHost(VIRTUAL_HOST);
connectionFactory.setUsername(USERNAME);
connectionFactory.setPassword(PASSWORD);
return connectionFactory;
}
}
シャットダウンするようにウサギのクライアントを伝える方法があり、理想的に後のすべてのメッセージがエンキューされていますか?
** **を停止します。 Spring Beansを 'ApplicationContext'で使用しています - これは対処するPITAです。あなたが例外を出さないように物事をシャットダウンする必要があるからです。シンプルなソリューションですか?それを正しくしてください! –
@BoristheSpider私の例ではSpringコンテナは実行されていないので、シャットダウンするSpringはありません。 –
それは**正確に**私のポイントです。 –