2015-02-19 4 views
3

У меня есть 2 проекта с такими же файлами «Chatter.java».
Я хочу общаться между программами.
Но только один из них может отправлять сообщения другому.
Вот как это выглядит no description
Тим может написать Xerox, но если Xerox попытаться отправить он получаетКак исправить «Сообщение в режиме только для чтения»

javax.jms.MessageNotWriteableException: [C4008]: Message in read-only mode. 

Я использую GlassFish сервер с настройками: enter image description here enter image description here

Таким образом, мой код

package aero; 

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Date; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.jms.Connection; 
import javax.jms.Queue; 
import javax.annotation.Resource; 
import javax.jms.ConnectionFactory; 
import javax.jms.JMSException; 
import javax.jms.MapMessage; 
import javax.jms.Message; 
import javax.jms.MessageConsumer; 
import javax.jms.MessageProducer; 
import javax.jms.Session; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 

public class Chatter extends JFrame implements Runnable{ 
    @Resource(mappedName = "aeroPool") 
    private static ConnectionFactory connectionFactory; 
    @Resource(mappedName = "aeroJNDI") 
    private static Queue queue; 

    private JTextArea msgArea = new JTextArea(); 
    private JTextField input = new JTextField("Message"); 
    private JButton button = new JButton("Send"); 
    private JPanel lowerPanel = new JPanel(new GridLayout(2, 1)); 

    MessageConsumer consumer = null; 
    Message message = null; 
    MapMessage mapMessage = null; 
    Connection queueConnection = null; 
    Session session = null; 
    MessageProducer producer = null; 

    Thread th = null; 

    String nickname = "Xerox"; 

    public Chatter(){ 
     connect(); 
     initGUI(); 
     th = new Thread(this); 
     th.start(); 
    } 

    public void initGUI(){ 
     this.setLayout(new BorderLayout()); 
     this.setTitle("Chat - " + nickname); 
     this.setSize(300, 100); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.add(msgArea, BorderLayout.CENTER); 
     lowerPanel.add(input); 
     lowerPanel.add(button); 
     this.add(lowerPanel, BorderLayout.SOUTH); 

     button.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       try {  
        sendMessage(); 
       } catch (JMSException ex) { 
        Logger.getLogger(Chatter.this.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     }); 
    } 

    public void connect(){ 
     try { 
      queueConnection = connectionFactory.createConnection(); 
      session = queueConnection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
      producer = session.createProducer(queue); 
      mapMessage = session.createMapMessage(); 
      consumer = session.createConsumer(queue); 
      queueConnection.start(); 
     } catch (JMSException ex) { 
      Logger.getLogger(Chatter.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public void sendMessage() throws JMSException{ 
     Date date = new Date(mapMessage.getJMSTimestamp()); 
     String time = date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds(); 
     String textMessage = input.getText(); 
     mapMessage.setString("Time", time); 
     mapMessage.setString("Nickname", nickname); 
     mapMessage.setString("Message", textMessage); 
     producer.send(mapMessage); 
     msgArea.append(System.lineSeparator() + nickname + " @ " + time + " - " + textMessage); 
    } 

    public void run(){ 
     while(true){ 
      try { 
       th.sleep(500); 
       getMessage(); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(this.getName()).log(Level.SEVERE, null, ex); 
      } catch (JMSException ex) { 
       Logger.getLogger(this.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    } 

    public void getMessage() throws JMSException{ 
     do{ 
      message = consumer.receive(10000);     
      if(message != null){ 
       if(message instanceof MapMessage){ 
        mapMessage = (MapMessage) message; 
        if(!mapMessage.getString("Nickname").equals(nickname)){ 
         String msg = mapMessage.getString("Nickname"); 
         msg += " @ "; 
         msg += mapMessage.getString("Time"); 
         msg += " - "; 
         msg += mapMessage.getString("Message"); 
         msgArea.append(System.lineSeparator() + msg); 
        } 
       } 
      } 
     }while(message != null); 
    } 

    public static void main(String[] args) { 
     new Chatter().setVisible(true); 
    } 
} 
+0

для моего назидания, вы можете включить код 'MessageProducer'? – Thufir

+1

Это класс из пакета JMS «javax.jms.MessageProducer» – Aero

ответ

2

Ваш метод sendMessage() использует поле под названием mapMessage. Проблема mapMessage также записывается getMessage(). В большинстве реализаций JMS полученные сообщения не могут быть изменены.

Вы должны устранить поле mapMessage вместе и заменить его локальной переменной в каждом из sendMessage() и getMessage(). Создайте новое сообщение через session.createMapMessage() каждый раз, когда вы хотите отправить сообщение. Аналогично, когда вы получаете сообщение, вы должны прочитать содержимое сообщения, а затем отбросить его.

+0

Спасибо большое! Он работает сейчас! – Aero

Смежные вопросы