Если я правильно понимаю проблему, у вас возникла проблема, потому что, хотя источник данных DefaultDS сообщает, что он запущен, так как он не установил никаких соединений, вы не обязательно знаете, что Соединения могут быть сделаны .
К сожалению, даже с включенной опцией prefill служба источника данных будет по-прежнему нормально запускаться, даже если не сможет установить соединение.
Лучше всего внедрить ServiceMBean , который проверяет фактическое соединение из источника данных, прежде чем сообщает о запуске. В этом примере мы назовем его org.bob.ConnChecker и развернем с использованием ObjectName org.bob: service = ConnChecker .
Ваш дескриптор развертывания должен выглядеть примерно так:
<mbean code="org.bob.ConnChecker" name="jboss.mq:service=DestinationManager">
<depends optional-attribute-name="DataSource">jboss.jca:name=DefaultDS,service=ManagedConnectionPool</depends>
</mbean>
Таким образом, ваша служба не будет запущена, пока не будет запущен источник данных. Ваша служба не запустится, если не сможет подключиться. Теперь вам просто нужно добавить org.bob: service = ConnChecker в качестве зависимости DestinationManager:
jboss.mq:service=MessageCache
jboss.mq:service=PersistenceManager
jboss.mq:service=StateManager
jboss.mq:service=ThreadPool
JBoss: Сервис = Нейминг
org.bob: Сервис = ConnChecker
Код для ConnChecker будет выглядеть примерно так:
....
import org.jboss.system.ServiceMBeanSupport;
....
public class ConnChecker extends ServiceMBeanSupport implements ConnCheckerMBean {
/** The ObjectName of the data source */
protected ObjectName dataSourceObjectName = null;
/** The Datasource reference */
protected DataSource dataSource = null;
/**
* Called by JBoss when the dataSource has started
* @throws Exception This will happen if the dataSource cannot provide a connection
* @see org.jboss.system.ServiceMBeanSupport#startService()
*/
public void startService() throws Exception {
Connection conn = null;
try {
// Get the JNDI name from the DataSource Pool MBean
String jndiName = (String)server.getAttribute(dataSourceObjectName, "PoolJndiName");
// Get a ref to the DataSource from JNDI
lookupDataSource(jndiName);
// Try getting a connection
conn = dataSource.getConnection();
// If we get here, we successfully got a connection and this service will report being Started
} finally {
if(conn!=null) try { conn.close(); } catch (Exception e) {}
}
}
/**
* Configures the service's DataSource ObjectName
* @param dataSourceObjectName The ObjectName of the connection pool
*/
public void setDataSource(ObjectName dataSourceObjectName) {
this.dataSourceObjectName = dataSourceObjectName;
}
/**
* Acquires a reference to the data source from JNDI
* @param jndiName The JNDI binding name of the data source
* @throws NamingException
*/
protected void lookupDataSource(String jndiName) throws NamingException {
dataSource = (DataSource)new InitialContext().lookup(jndiName);
}
}
Код для ConnCheckerMBean выглядит следующим образом:
....
import org.jboss.system.ServiceMBeanSupport;
....
public interface ConnCheckerMBean extends ServiceMBean {
public void setDataSource(ObjectName dataSourceObjectName);
}
Таким образом, вы будете все еще получать ошибки, если невозможно установить соединения с базой данных, но DestinationManager не запустится, и, надеюсь, это будет лучше, чем головные боли, которые у вас сейчас есть.