在将 JBoss 5 应用程序迁移到 JBoss AS 7 (7.1.1.FINAL) 时,我遇到了新的 JMS 消息驱动的 EJB 问题。在消息处理中,必须检查一些主数据字段。为提高性能,应使用@Singleton @StartupEJB将此主数据预加载到缓存结构中,加载数据需要大约 30 秒。
我的问题是,即使缓存尚未完全初始化,队列消息处理也会启动,从而导致消息验证错误。
我试图定义 MDB 和启动 EJB 之间的依赖关系,但据我所知,@DependsOn注释仅适用于@SingletonEJB。所以很明显我的解决方案不起作用;-)
启动bean代码:
@Singleton
@Startup
public class StartupBean {
@PostConstruct
void atStartup() {
// TODO load master data cache (takes about 30 seconds)
}
@PreDestroy()
void atShutdown() {
// TODO free master data cache
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我从示例中删除了真正的代码,以便于阅读:-)
消息驱动bean代码:
@MessageDriven(name="SampleMessagingBean", activationConfig = {
@ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination", propertyValue="jms/SampleQueue"),
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge")
})
@DependsOn("StartupBean") …Run Code Online (Sandbox Code Playgroud) 我已经使用standalone-full.xml配置文件配置了在JBoss AS 7.1.1.FINAL上运行的JMS队列.
然后我编写了一个独立的 Java程序来连接队列并根据JBoss示例代码发送消息.
public class RemoteProducer {
private static final Logger log = Logger.getLogger(RemoteProducer.class.getName());
// Set up all the default values
private static final String DEFAULT_CONNECTION_FACTORY = "jms/RemoteConnectionFactory";
private static final String DEFAULT_DESTINATION = "jms/queue/test";
private static final String DEFAULT_USERNAME = "jmstest";
private static final String DEFAULT_PASSWORD = "fluppy";
private static final String INITIAL_CONTEXT_FACTORY = "org.jboss.naming.remote.client.InitialContextFactory";
private static final String PROVIDER_URL = "remote://localhost:4447";
/**
* @param args
*/
public static void main(String[] args) {
ConnectionFactory …Run Code Online (Sandbox Code Playgroud)