EJB3.0 Как использовать MDB - PullRequest
0 голосов
/ 12 мая 2011

Эй, я новичок в кодировании в j2ee. Мой вопрос касается MDB. Я уже настроил свой сервер weblogic 11g. и очередь была создана.

Я написал код клиента, который является клиентом Java, который отправляет сообщение в очередь.

import java.util.Hashtable;
import java.util.Properties;

import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;

public class MyMDBClient {

    /**
     * @param args
     */
    public static void main(String[] args) {
         QueueConnection cnn = null;
            QueueSender sender = null;
            QueueSession session = null;
            InitialContext ctx;
            Hashtable ht = new Hashtable();

            try {
                ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
                ht.put(Context.PROVIDER_URL,"t3://localhost:7001");

                ctx = new InitialContext(ht);
                Queue queue = (Queue) ctx.lookup("jms/testQueue");
                QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("jms/connectionFactory");
                cnn = factory.createQueueConnection();
                session = cnn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
                TextMessage msg = session.createTextMessage();
                msg.setText("helloworld");
                sender = session.createSender(queue);
                sender.send(msg);

                System.out.println("Message sent successfully to remote queue.");
                session.close(); // this is important.
            } catch (Exception e) {
                e.printStackTrace();
            }
    }
}

Я вижу сообщение в очереди на моей административной консоли weblogic.

однако, мой mdb на стороне сервера не вызывается.

Может кто-нибудь сказать мне, что не так. Я предпочитаю, чтобы решение было в аннотациях Java. Спасибо всем за чтение этого.

вот мой код сервера:

/**
 * import
 *
 */

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import weblogic.ejbgen.*;


/**
 * Message-Driven Bean implementation class for: MyMDB
 *
 */
@MessageDriven(ejbName="mdb", destinationType="javax.jms.queue",destinationJndiName="jms/testQueue"  )
public class mdb implements MessageListener {

    /**
     * Default constructor. 
     */
    public mdb() {
    }

    /**
     * @see MessageListener#onMessage(Message)
     */
    public void onMessage(Message message) {
        TextMessage tmsg = null;
        tmsg = (TextMessage) message; 

        System.out.println("----------------");
        System.out.println("Received message : ");        
        try {
            System.out.println(tmsg.getText());
        } catch (JMSException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   

        System.out.println("----------------");        
    }
}

1 Ответ

1 голос
/ 12 мая 2011

Вот пример аннотаций, которые у меня есть на работающей MDB:

@MessageDriven(
    messageListenerInterface = javax.jms.MessageListener.class,
    name = "EventQueueListenerMDB",
    mappedName = Constants.EVENT_QUEUE_JNDI,
    activationConfig = {
            @ActivationConfigProperty(
                    propertyName = "connectionFactoryJndiName",
                    propertyValue = Constants.CONNECTION_FACTORY_JNDI),
            @ActivationConfigProperty(
                    propertyName = "destinationType",
                    propertyValue = "javax.jms.Queue")
    })

Кроме того, похоже, что у вас есть javax.jms.queue, а не javax.jms.Queue.

...