У меня есть 2 проекта с такими же файлами «Chatter.java».
Я хочу общаться между программами.
Но только один из них может отправлять сообщения другому.
Вот как это выглядит
Тим может написать Xerox, но если Xerox попытаться отправить он получаетКак исправить «Сообщение в режиме только для чтения»
javax.jms.MessageNotWriteableException: [C4008]: Message in read-only mode.
Я использую GlassFish сервер с настройками:
Таким образом, мой код
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);
}
}
для моего назидания, вы можете включить код 'MessageProducer'? – Thufir
Это класс из пакета JMS «javax.jms.MessageProducer» – Aero