0

Java EE プログラミングは初めてです。Java EE を使用して Eclipse で JMS センダーを作成しようとしています。新しい Java EE プロジェクトを作成しましたが、フォルダー構造とは何か、JMS 送信側の Java ファイルをどこに書き込むべきか疑問に思っています。

JBoss AS を使用しています。私の要件は、この JMS 送信側アプリケーションを使用してメッセージを JMS キューにプッシュする必要があるということです。

4

1 に答える 1

1

まず、JMS メッセージを消費するために MDB (メッセージ駆動型 Bean) を作成する必要があります。わかりやすくするために、小さな例を示します。

@MessageDriven(activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue =   "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/offlinemsg"),
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class MessageHandlerMDB implements MessageListener {

private static final Logger log = Logger.getLogger(MessageHandlerMDB.class);


@Override
public void onMessage(Message message) {

    log.info("Message received in MessageHandlerMDB");


}

}

アプリのデプロイ時に、サーバーは注釈に基づいてメッセージ駆動型 Bean を識別し、キューを作成します。その後、通常どおり ConnectionFactory を介してこのキューにメッセージを送信できます。Jboss 内の同じアプリケーションを介してメッセージを送信する場合は、次のように記述できます。

 private void sendObjectToQueue(Serializable object) {


    Session session = null;
    MessageProducer sender = null;
    Connection connect = null;

    if (logger.isDebugEnabled()) {
    logger.debug("Entered sendObjectToQueue(" + object.getClass());
    }

    try {

        Context context = new InitialContext();
        ConnectionFactory factory = (ConnectionFactory) context
                .lookup("ConnectionFactory");

        Queue queue = (Queue) context.lookup("queue/offlinemsg");
        connect = factory.createConnection();
        session = connect.createSession(false,
                Session.AUTO_ACKNOWLEDGE);
        sender = session.createProducer(queue);

        ObjectMessage message = session.createObjectMessage();

        message.setObject(object);
        sender.send(message);
        sender.close();
        connect.close();

        if (logger.isDebugEnabled()) {
        logger.debug("The " + object.getClass() + " object was sent to jms queue");
        }

    } catch (JMSException e) {
        logger.error("Sending object to queue failed", e);


    } catch (Exception e) {
        logger.error("Sending object to queue failed", e);


    } finally {

        if (sender != null) {
            try {
                sender.close();
                if (logger.isDebugEnabled()) {
                    logger.debug("Closed jms session");
                }
            } catch (JMSException e) {
                logger.error("Closing jms session failed", e);
            }
        }

        if (connect != null) {
            try {
                connect.close();
                if (logger.isDebugEnabled()) {
                    logger.debug("Closed jms session");
                }
            } catch (Exception e) {
                logger.error("Closing jms session failed", e);
            }
        }

        if (session != null) {
            try {
                session.close();
                if (logger.isDebugEnabled()) {
                    logger.debug("Closed jms session");
                }
            } catch (Exception e) {
                logger.error("Closing jms session failed", e);
            }
        }
    }
}

さらに説明が必要な場合はお知らせください。お役に立てれば。

編集済み*

通常の Java クラスから呼び出す場合は、次のコードが必要です (これは JBoss に固有のものであることに注意してください)。

Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL, "jnp://localhost:1099");
env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");

Context ctx = new InitialContext(env);
ConnectionFactory cf = (ConnectionFactory)ctx.lookup("/ConnectionFactory");
Queue queue = (Queue)ic.lookup("/queues/MyQueue");
Connection connection = cf.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(queue);
connection.start();
TextMessage message = session.createTextMessage("Test");
producer.send(message);

ベスト プラクティスとして、接続の作成とセッションの作成を再利用する必要があることに注意してください...

于 2012-11-19T06:13:45.577 に答える