1

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 の下で機能させることができます。

4

1 に答える 1

1

同様の問題を解決しました(WAS 8.5.5ですが、MDB、EJB、サーブレット-すべてが1つの戦争モジュールに詰め込まれています)

これは明らかに WAS のバグです。これは回避策です:

  1. サーバー上のリソースを使用してサーバーを実行することを確認します

  2. パブリッシュしてエラーを繰り返します (ただし、今回はサーバー上のリソースを使用)

  3. WAS が予期するディレクトリを検索"ejb-jar_merged.xml":

    • WAS SystemErr.log を見つけます
    • 行方不明についてのメッセージがあります"ejb-jar_merged.xml"
    • 見つからないファイルのディレクトリ名を探しています。
  4. 見つかったディレクトリに移動します。(.IBM/WebSphere/AppServer/profiles/AppSrv01/wstemp/0/workspace/... .... deployments/.....-INF/のようなもの

  5. copy ejb-jar.xml ejb-jar_merged.xml

web_merged.xml が見つからない場合は、web.xml を web_merged.xml にコピーします。

この問題は、アプリケーションの更新時に再度表示されることはありません。アプリの削除/インストール後に再適用する必要がある場合があります。

于 2013-09-14T00:23:58.163 に答える