У нас есть сервер Tomcat, использующий Azure ServiceBus для получения сообщений от другой службы. Мы обнаруживаем, что простое создание SubscriptionClient приводит к тому, что отключение tomcat занимает более минуты - т.е. нам не нужно ничего делать с SubscriptionClient, нам просто нужно создать его, чтобы вызвать проблема случиться Ничего необычного в журналах не видно.
SubscriptionClient создается следующим образом:
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class UserSyncListener implements InitializingBean, DisposableBean, ApplicationContextAware
{
private ApplicationContext applicationContext;
private SubscriptionClient client;
@Override
public void afterPropertiesSet() throws ServiceBusException, InterruptedException
{
/* ... obtain connectionString and entityPath ... */
client = new SubscriptionClient(
new ConnectionStringBuilder(connectionString,
entityPath,
ReceiveMode.PEEKLOCK);
}
@Override
public void destroy() throws Exception
{
if (client != null) {
client.close();
}
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
this.applicationContext = applicationContext;
if (applicationContext instanceof AbstractApplicationContext) {
((AbstractApplicationContext)applicationContext).registerShutdownHook();
}
}
Мы можем успешно получать сообщения с этим, поэтому connectionString и entityPath верны. Но, как я уже говорил, нам даже не нужно отправлять или потреблять какие-либо сообщения - этого кода достаточно, чтобы tomcat очень медленно закрывался.
[отредактировано] Я думаю, проблема в том, что мой хук отключения никогда не регистрируется. Если я добавлю запись в журнал или точку останова в метод destroy (), он никогда не будет достигнут.
В нашей среде есть сценарии, которые иногда требуют перезапуска tomcat, поэтому tomcat, требующий более 60 секунд для отключения, вызовет у нас настоящие проблемы.
Любая помощь приветствуется!