我的问题是如何配置EJB 3.0样式的消息驱动bean以在jboss中使用已配置的JMS数据源。
例如,我的MDB看起来像:
@MessageDriven(mappedName = "ExampleMDB", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "MyTopic"),
@ActivationConfigProperty(propertyName = "channel", propertyValue = "MyChannel"),
})
@ResourceAdapter(value = "wmq.jmsra.rar")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
@TransactionManagement(TransactionManagementType.BEAN)
public class MyMDB implements MessageListener {
.....
}
但我希望bean附加到给定的JMS数据源(在jboss 4.2.2的情况下,这是在deploy / jms / jms-ds.xml中)。也许这甚至不可能,但值得一提。
答案 0 :(得分:1)
如果我正确理解您的问题,MyMDB
会侦听WebLogic上的主题,并且您希望使用JBoss提供的其他JMS目标,在已部署的配置文件中定义并由其JNDI名称标识(默认情况下) ,deploy/jms/jms-ds.xml
仅包含JMS提供程序和连接工厂的配置 - 无数据源。
最简单的方法是让容器通过其JNDI名称注入JMS目标和连接工厂(在JBoss中,JMS目标由deploying xxx-service.xml files配置)。在启动时,您可以初始化连接,并在MDB释放后立即执行清理。
以下示例显示了注入(@Resource
)和资源管理(@PostConstruct
和@PreDestroy
)。 useJmsDestination(String)
中使用JMS连接和目标来发送文本消息。
public class MyMDB implements MessageListener {
@Resource(mappedName = "queue/YourQueueName") // can be topic too
private Queue targetDestination;
@Resource(mappedName = "QueueConnectionFactory") // or ConnectionFactory
private QueueConnectionFactory factory;
private Connection conn;
public void onMessage(Message m) {
// parse message and do what you need to do
...
// do something with the message and the JBoss JMS destination
useJmsDestination(messageString);
}
private void useJmsDestination(String text) {
Session session = null;
MessageProducer producer = null;
try {
session = conn.createSession(true, Session.AUTO_ACKNOWLEDGE);
producer = session.createProducer(targetDestination);
TextMessage msg = session.createTextMessage(text);
producer.send(msg);
} catch (JMSException e) {
throw new RuntimeException(e);
} finally {
try {
if (producer != null) {
producer.close();
}
if (session != null) {
session.close();
}
} catch (JMSException e) {
// handle error, should be non-fatal, as the message is already sent.
}
}
}
@PostConstruct
void init() {
initConnection();
// other initialization logic
...
}
@PreDestroy
void cleanUp() {
closeConnection();
// other cleanup logic
...
}
private void initConnection() {
try {
conn = factory.createConnection();
} catch (JMSException e) {
throw new RuntimeException("Could not initialize connection", e);
}
}
private void closeConnection() {
try {
conn.close();
} catch (JMSException e) {
// handle error, should be non-fatal, as the connection is being closed
}
}
}
我希望这可以帮到你。
答案 1 :(得分:1)
我认为您要问的是“如何指定用于MDB 的JMS数据源的JNDI位置?”
在这种情况下答案是:
@ActivationConfigProperty(propertyName = "providerAdapterJNDI", propertyValue = "java:/DefaultJMSProvider")
另外,请查看以下页面,其中提供了有关在jBoss中配置MDB的大量有用详细信息: http://www.jboss.org/community/docs/DOC-9352