J2EE - MDB は初めてですが、単純にキューをリッスン (メッセージを読み取り) し、そのメッセージを処理して別のキューにプッシュするメッセージ駆動型 Bean (MDB) を作成しようとしています。Google でこれら 2 つのタスクを別々の方法で実行するための実用的な例をいくつか見つけましたが、同じ MDB で両方を実行しようとすると問題が発生しました。
これは私のMDBのコードです
@MessageDriven(mappedName = "jms/propuestasQ")
public class ObtenerNumPolizaBean implements MessageListener {
@Resource(name="jms/polizasQCF")
private QueueConnectionFactory connectionFactory;
private Connection connection;
@Resource(name = "jms/polizasQ")
private Destination targetQueue;
@PostConstruct
private void initJMS() {
try {
connection = connectionFactory.createConnection();
} catch (JMSException e) {
throw new RuntimeException(e);
}
}
@PreDestroy
private void closeJMS() {
try {
connection.close();
} catch (JMSException e) {
throw new RuntimeException(e);
}
}
/**
* @see MessageListener#onMessage(Message)
*/
@Override
public void onMessage(Message message) {
//validate the received message type
if (message instanceof FolioEntity) {
try {
//generate Web Service proxy
GenerarFoliosImplService serviceGenerarFolios = new GenerarFoliosImplService();
GenerarFoliosImplDelegate delGenerarFolios = serviceGenerarFolios.getGenerarFoliosImplPort();
//call the method with the object
FolioEntity responseFolio = delGenerarFolios.generarFolios((FolioEntity)message);
System.out.println("Bean generated the following FolioNumber: " + responseFolio.getNumeroFolio());
//put the message on the next queue
putMessage(responseFolio);
}
catch (JMSException e) {
throw new RuntimeException(e);
}
}
else {
throw new IllegalArgumentException("Message must be of type FolioEntity");
}
}
private void putMessage(final FolioEntity folio) throws JMSException {
final Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
final MessageProducer producer = session.createProducer(targetQueue);
final ObjectMessage objectMessage = session.createObjectMessage();
producer.send(objectMessage);
session.close();
}
これが私のejb-jar.xmlファイルの内容です
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">
<display-name>MDBRenovarPolizaEJB </display-name>
<enterprise-beans >
<message-driven>
<ejb-name>ObtenerNumPolizaBean</ejb-name>
<message-destination-ref>
<description />
<message-destination-ref-name>
jms/polizasQ
</message-destination-ref-name>
<message-destination-type>
javax.jms.Queue
</message-destination-type>
<message-destination-usage>
ConsumesProduces
</message-destination-usage>
<message-destination-link>
jms/polizasQ
</message-destination-link>
</message-destination-ref>
<message-destination-ref>
<description />
<message-destination-ref-name>
jms/polizasQCF
</message-destination-ref-name>
<message-destination-type>
javax.jms.QueueConnectionFactory
</message-destination-type>
<message-destination-usage>
ConsumesProduces
</message-destination-usage>
<message-destination-link>
jms/polizasQCF
</message-destination-link>
</message-destination-ref>
私が抱えている問題は、WAS コンソール 8.5.5 で「メッセージ駆動型 Bean リスナー バインディング」を設定できないことです。アクティベーション スペックを設定しようとすると、次のエラーが表示されます。
MDBRenovarPolizaModelEJB.jar\META-INF\ejb-jar_merged.xml (The system cannot find the file specified.)
この例外の意味がわかりません。私は常に「Activation Specification」をこのように設定して特定のキューをリッスンしているので、このファイル「ejb-jar_merged.xml」が何であるかわかりません。
どんな手掛かり?前もって感謝します。
または、誰かがこれを達成するための実用的な例を持っていれば、それを一歩一歩、WebSphere の下で機能させることができます。