2014-02-16 2 views
0

Im новое для java-сообщений, управляемых beans, и у меня есть небольшая проблема. Я сделал тестовый веб-проект (сервер - это стеклянная рыба 4.0).Управляемые сообщениями bean-модули только одно значение

В messageclient я отправляю 3 строки в очередь сообщений. Если я правильно понимаю управляемые сообщениями компоненты, bean с сообщениями должен записывать все значения в моей консоли, но вместо этого он записывает только первое значение в очереди. Я пытаюсь реализовать это, потому что мне нужен другой поток для отправки электронной почты клиенту из моего веб-приложения. Может быть, лучший способ?

вот код моего клиента сообщения:

@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); 
    } 
} 

} 

И мой управляемый сообщениями компонент:

@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

Я бы так подумал. Не уверен, что это вносит свой вклад в это, но я не вижу, чтобы вы закрывали сеанс и соединение в клиентском коде. Возможно, попробуйте добавить это к клиенту. – mikemil

+0

Пробовал, но не повезло .... – Salko

ответ

0

Это очень распространенная ошибка, на самом деле. В спецификации JMS всякий раз, когда вы подключаетесь, вы всегда имеете дело с объединенным соединением на сервере приложений. Соединения всегда транслируются.

Вы не можете повторно использовать сообщения таким образом. Пожалуйста, создайте новое сообщение для каждого раза, когда вы его отправляете.

Попробуйте добавить message.acknowledge() в код вашего MDB.

Редактировать: Кроме того, если вы действительно используете Java EE 7, вам следует перейти на класс JMSContext для отправки сообщений. Очень чистый API.