从JBoss 7.1中的另一个会话bean注入Session bean

时间:2013-05-28 13:35:58

标签: ejb-3.1 stateless-session-bean

我无法在另一个SLSB中注入SLSB。实际创建了3个项目 1)使用MDB创建了一个EJB项目 2)创建了一个带有无状态会话bean的EJB项目,用于发布消息 3)创建了一个带有无状态会话bean的EJB项目,用于注入上面的会话bean 但是在注入时我无法注入EJB,它返回null

代码如下 1)MDB:

@MessageDriven(
    activationConfig = {
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "activemq/queue/TestQueue"),
        @ActivationConfigProperty(propertyName="acknowledgeMode", propertyValue="Auto-acknowledge")
    })
@ResourceAdapter("activemq-ra.rar")
public class ConsumerMDB implements MessageListener {

public void onMessage(Message message) {
    try {
         System.out.println("Queue: Received a TextMessage at " + new Date());
         TextMessage msg = (TextMessage) message;
         System.out.println("Message is : " + msg.getText());
    } catch (JMSException e) {
        e.printStackTrace();
    }

}

}

2)会话Bean 1

package com.springboard.session;

import javax.annotation.Resource;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.TextMessage;

@Stateless
@LocalBean
public class ProducerSession implements ProducerSessionLocal {

@Resource(mappedName="java:jboss/activemq/QueueConnectionFactory")
public static QueueConnectionFactory factory;

@Resource(mappedName = "java:jboss/activemq/queue/TestQueue")
public static Queue queue;  

@Override
public void sendMessage(String msg) {
        System.out.println("****************Entering into method********************");

        try {
            System.out.println(queue.getQueueName());
            QueueConnection qConnection = factory.createQueueConnection();
            QueueSession qSession = qConnection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
            TextMessage message = qSession.createTextMessage();
            message.setText(msg);

            QueueSender qSender = qSession.createSender(queue);

            qSender.send(message);

            qSender.close();
            qSession.close();
            qConnection.close();
        } catch (JMSException e) {          
            e.printStackTrace();
        }

        System.out.println("****************Exiting into method********************");
}
}

,界面是     包com.springboard.session;

import javax.ejb.Local;

@Local
public interface ProducerSessionLocal {
public void sendMessage(String msg);
}

3)第二个会话bean注入第一个会话

@Stateless
public class TestProducerLocalBean implements TestProducerLocalBeanLocal {

@EJB(mappedName = "java:global/ProducerSessionActiveMQ/ProducerSession!com.springboard.session.ProducerSessionLocal")
public ProducerSessionLocal producer;

public TestProducerLocalBean() {
    System.out.println("*************Testing Producer****************");
    if(producer!=null){
    producer.sendMessage("This Message is from SessionBean to Session Bean to MDB");
    }
    else{
        System.out.println("EJB is null");
    }
    System.out.println("**********End************************");

}

@Override
public void messageSend(String msg) {
    // TODO Auto-generated method stub

}

并且为了测试目的使用了一个类     import javax.ejb.EJB;

import com.springboard.session.test.TestProducerLocalBean;


public class testEJB {

@EJB
public static TestProducerLocalBean local =new TestProducerLocalBean();

public static void main(String[] args) {        

}
}

在生产者EJB中,总是返回null。使用servlet注入ProducerSession我能够做到。但注入另一个EJB我无法得到它。 任何人都可以帮助我解决我所缺少的问题

提前致谢

1 个答案:

答案 0 :(得分:0)

使用注入时使用初始化... = new Xyz()是不正确的,因为这些字段的初始化是容器的责任。您可能尝试过,因为您注意到该字段为null,这是因为除非您使用应用程序客户端容器,否则主类中不支持注入(包括@EJB)。