- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有 2 个项目,其中包含相同的“Chatter.java”文件。
我想在节目之间聊天。
但是只有其中一个可以向另一个发送消息。
这是它的样子
Tim 可以写信给 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);
}
}
最佳答案
您的sendMessage()
方法使用了一个名为mapMessage
的字段。问题是 mapMessage
也由 getMessage()
写入。在大多数 JMS 实现中,无法修改接收到的消息。
您应该一起删除 mapMessage
字段,并在每个 sendMessage()
和 getMessage()
中用局部变量替换它。每次要发送消息时,通过 session.createMapMessage()
创建一条新消息。同样,当您收到一条消息时,您应该阅读消息内容,然后将其丢弃。
关于java - 我该如何修复 "Message in read-only mode",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28619172/
我正在开发基于桌面 (Windows 7) 的应用程序,并使用 Qt Creator v 5.6.0 开发程序。我有一个非常奇怪的问题,即 我的程序在 DEBUG 模式下崩溃,但在 RELEASE 模
我爱org-tables ,我用它们来记录各种事情。我现在正在为 Nix 记录一些单行代码(在阅读了 Domen Kožar 的 excellent guide 后,在 this year's Eur
org-mode 是否有一个键绑定(bind)可以在编号/项目符号列表项之间移动,就像您可以对标题一样? 喜欢的功能: org-forward-heading-same-level 大纲下一个可见标题
我知道这有点小,但它一直困扰着我。我正在为一个项目使用 Org-mode,我倾向于经常导出为 PDF 或 HTML,这使我的目录中散落着 PDF、Tex 和 HTML 文件。有没有办法将 Org 模式
有什么方法可以让 org-mode 继续编号列表而不是重新启动? 这是情况。你列了一个类似的列表: Sometimes you can restart the display by doing som
如何在组织模式文件中生成所有标签的枚举列表(例如 :tag:)?假设我有一个以下形式的列表: * Head1 :foo:bar: ** Subhead1 :foo: * Head2
我正在使用 org-mode(Emacs:24.3.1,org-mode: 7.9.3f 8.0.6)作为不同代码片段的数据库语言(目前主要是 elisp 和 python)。这在使用 org-mod
相关问题:org-mode: fontify code blocks natively 截至 2012 年 11 月 1 日,我已经获得了最新的 org-mode 和 emacs 版本(组织存储在 o
有谁知道在使用 ido 模式时区分 dired 模式缓冲区名称与迷你缓冲区中其他类型缓冲区的好方法吗?例如...在 dired 模式缓冲区名称末尾显示正斜杠? 最佳答案 您可以简单地更改dired-m
在这个示例脚本中 import argparse parser = argparse.ArgumentParser() parser.add_argument('--modes', help="tes
我第一次学习“操作系统”。在我的书中,我发现了关于“用户模式”和“内核模式”的这句话: "Switch from user to kernel mode" instruction is execute
我刚刚下载了 Processing 2.0 并尝试从“模式管理器”安装 Android 模式。但是在安装时出现错误提示:“无法将模式“Android 模式”移动到速写本”。我怎样才能摆脱这个错误? 最
在 android L 中,我尝试将相机闪光灯模式设置为 TORCH,它工作正常,但我无法将其更改回闪光灯模式 AUTO 或闪光灯模式 打开。我只能返回闪存模式 OFF。我尝试了像 camera360
有 2 台机器,A 和 B。有 2 个分支,p16 和 c2。 A 有一个 ext3 文件系统,但在 B 上,存档位于带有 vfat 的 truecrypt 驱动器上,mount 显示 rw,uid=
我有 linum-mode在我的 Emacs 配置中全局启用。全局启用意味着它也适用于不受欢迎的速度条。 我为这个问题找到的唯一建议是在存档的 Emacs 帮助邮件列表中,它建议以下 speedbar
Google Cloud Firestore 将很快取代旧的 Google Cloud Datastore。然后可以选择在“ native 模式”或“数据存储模式”下使用 Cloud Firestor
org-mode的版本我的版本 Emacs 附带的(24.5.2) 是 8.2.10 .我已安装版本 8.3.1从 ELPA 并将其添加到我的 init 文件中: (add-to-list 'load
The org-mode manual指出 org-mode 将“”“...在 shell 链接”“”中执行命令,但它不显示此类链接的语法。 我希望能有一个简单完整的示例来说明这种 shell 链接是
我正在尝试在 emacs 24 中使用 dart 模式和 d 模式。如果我单独使用任何一种模式,一切都很好。如果我分别对每种类型的文件使用这两种模式,我在尝试缩进 D 代码时会出错。 以下是在初始化时
我的应用程序中有 CupertinoDatePicker 以使用以下代码选择日期和时间: formatColumn( widget: Consumer( builder: (_, mcProvide
我是一名优秀的程序员,十分优秀!