我是java消息驱动bean的新手,我有一点问题。我做了一个测试web项目(服务器是glassfish 4.0)。
在messageclient中,我将3个字符串发送到消息队列。如果我正确理解消息驱动的bean,消息驱动的bean 应该在我的控制台中写出所有值,而是只写入队列中的第一个值。 我正在尝试实现这一点,因为我需要不同的线程来从我的Web应用程序向客户发送电子邮件。可能有更好的方法吗?
这是我的留言客户端的代码:
@Named(value = "messageDrivenbean")
@ViewScoped
public class MessageDrivenBeanClient implements Serializable
{
ArrayList <String>mail;
@Resource(name="connFactory", mappedName="mailConnFactory")
private QueueConnectionFactory QueueConnectionFactory;
@Resource(name="jmsQueue", mappedName="Queue")
private Queue queue;
/**
* Creates a new instance of testingbean
*/
public MessageDrivenBeanClient()
{
}
@PostConstruct
public void init(){
}
Connection conn;
public void start() throws JMSException
{
String text;
Message msg = null;
final int NUM_MSGS = 3;
conn = QueueConnectionFactory.createConnection();
Session sesion=conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer msgProducer=sesion.createProducer(queue);
msg=sesion.createTextMessage();
for (int i = 0; i < NUM_MSGS; i++) {
text = "This is message " + (i + 1);
System.out.println("Sending message: " + text);
msg.setStringProperty("message", text);
msgProducer.send(msg);
}
}
}
我的消息驱动bean:
@MessageDriven(activationConfig =
{
@ActivationConfigProperty
(propertyName="destinationType",propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "Queue")
})
public class MsgDrivnBean implements MessageListener
{
@Resource
private MessageDrivenContext mdc;
public MsgDrivnBean()
{
}
@Override
public void onMessage(Message message)
{
TextMessage tm=null;
try{
if(message instanceof TextMessage){
tm= (TextMessage) message;
System.out.println(message.getStringProperty("message"));
System.out.print("sem v msgdrivenbeanu"+ tm.getStringProperty("message"));
//logger.error(tm.getText());
}
else
{
System.out.println("Error");
}
}
catch(JMSException jms)
{
jms.printStackTrace();
mdc.setRollbackOnly();
}
}
}
我目前的输出是:
Sending message: This is message 1
INFO: Sending message: This is message 2
INFO: Sending message: This is message 3
INFO: This is message 1
INFO: sem v msgdrivenbeanuThis is message 1
我认为它也应该写出消息2和消息3,但事实并非如此。
请帮帮我。
答案 0 :(得分:0)
实际上,这是一个非常常见的错误。在JMS规范中,无论何时连接,您总是在应用服务器中处理池连接。连接始终是交易的。
您不能以这种方式重复使用邮件。请在每次发送新消息时实例化。
请尝试将message.acknowledge()
添加到您的MDB代码中。
编辑:另外,如果你真的在Java EE 7上,你应该考虑切换到JMSContext
类来发送消息。更清洁的API。