У меня вопрос: как настроить объект EJB 3.0, управляемый сообщениями, для использования настроенного источника данных JMS в jboss.
Например, мой 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 {
.....
}
Но я бы хотел, чтобы компонент был прикреплен к данному источнику данных JMS (в случае jboss 4.2.2 это находится в deploy / jms / jms-ds.xml). Возможно, это даже невозможно, но стоит спросить.




Если я правильно понял вашу проблему, MyMDB прослушивает тему в WebLogic, и вы хотите использовать дополнительное место назначения JMS, предоставляемое JBoss, определенное в развернутом файле конфигурации и идентифицированное его именем JNDI (по умолчанию deploy/jms/jms-ds.xml содержит только конфигурацию для поставщик JMS и фабрики соединений - без источников данных).
Самый простой способ - позволить контейнеру внедрить назначение JMS и фабрику соединений через свое имя JNDI (в JBoss назначения JMS настраиваются с помощью развертывание файлов xxx-service.xml). Затем при запуске вы можете инициализировать соединение и выполнить очистку, как только MDB будет выпущен.
В следующих примерах показано внедрение (@Resource) и управление ресурсами (@PostConstruct и @PreDestroy). Соединение и место назначения JMS используются в useJmsDestination(String) для отправки текстового сообщения.
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
}
}
}
Я надеюсь это тебе поможет.
Я думаю, что вы спрашиваете "Как указать расположение JNDI источника данных JMS для использования в MDB?"
В этом случае ответ:
@ActivationConfigProperty(propertyName = "providerAdapterJNDI", propertyValue = "java:/DefaultJMSProvider")
Также обратите внимание на следующую страницу, которая предоставляет множество полезных сведений о настройке MDB в jBoss: http://www.jboss.org/community/docs/DOC-9352
Вы имеете в виду, что хотите управлять источником данных из метода onMessage ()?