You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaFX应用中实现JMS相关操作的日志展示?

实现JavaFX应用日志输出到指定TextArea

步骤1:修正TextArea的FXML配置

先把你的TextArea组件fx:id改为有效标识,同时设置不可编辑防止误改:

<TextArea layoutX="20.0" layoutY="755.0" prefHeight="80.0" prefWidth="560.0" fx:id="logTextArea" editable="false" />

步骤2:在Controller中注入TextArea并实现日志工具方法

在FXML对应的Controller类中注入TextArea,编写线程安全的日志追加方法(确保UI操作在JavaFX应用线程执行):

import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.scene.control.TextArea;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class MainController {
    @FXML
    private TextArea logTextArea;

    // 初始化时输出应用启动日志
    public void initialize() {
        logMessage("应用启动完成,等待JMS操作...");
    }

    // 线程安全的日志追加方法
    private void logMessage(String message) {
        Platform.runLater(() -> {
            // 添加时间戳提升日志可读性
            String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            logTextArea.appendText(String.format("[%s] %s%n", timestamp, message));
            // 自动滚动到日志底部
            logTextArea.setScrollTop(Double.MAX_VALUE);
        });
    }
}

步骤3:改造JMS连接方法,添加状态日志与异常捕获

修改connectBrokerSend方法,覆盖连接成功、失败及异常场景的日志输出:

import javax.jms.JMSException;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSession;
import javax.jms.Session;
import org.apache.activemq.ActiveMQQueueConnectionFactory;
import java.io.PrintWriter;
import java.io.StringWriter;

public void connectBrokerSend(String urlBroker) {
    logMessage("尝试连接JMS Broker:tcp://" + urlBroker);
    QueueConnectionFactory connectionFactory;
    QueueConnection connection = null;
    QueueSession queueSession = null;

    try {
        connectionFactory = new ActiveMQQueueConnectionFactory("tcp://" + urlBroker);
        connection = connectionFactory.createQueueConnection();
        queueSession = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
        
        connection.start();
        logMessage("JMS Broker连接成功,会话已创建,连接已启动");
    } catch (JMSException e) {
        logMessage("JMS连接失败:" + e.getMessage());
        // 输出异常堆栈便于调试
        StringWriter sw = new StringWriter();
        e.printStackTrace(new PrintWriter(sw));
        logMessage("异常详情:" + sw.toString());
    } finally {
        // 示例:关闭资源时的日志(可根据业务场景调整执行时机)
        /*
        if (queueSession != null) {
            try {
                queueSession.close();
                logMessage("JMS会话已关闭");
            } catch (JMSException e) {
                logMessage("关闭JMS会话失败:" + e.getMessage());
            }
        }
        if (connection != null) {
            try {
                connection.close();
                logMessage("JMS连接已关闭");
            } catch (JMSException e) {
                logMessage("关闭JMS连接失败:" + e.getMessage());
            }
        }
        */
    }
}

步骤4:添加消息读取与其他JMS操作的日志

在消息监听、发送等逻辑中调用logMessage记录状态:

// 示例:消息接收日志
queueSession.createReceiver(yourQueue).setMessageListener(message -> {
    try {
        if (message instanceof javax.jms.TextMessage textMessage) {
            logMessage("收到JMS文本消息:" + textMessage.getText());
        } else {
            logMessage("收到非文本类型JMS消息");
        }
    } catch (JMSException e) {
        logMessage("处理JMS消息出错:" + e.getMessage());
    }
});

// 示例:消息发送日志
public void sendMessage(QueueSession session, Queue queue, String content) {
    try {
        javax.jms.TextMessage message = session.createTextMessage(content);
        session.createSender(queue).send(message);
        logMessage("JMS消息发送成功:" + content);
    } catch (JMSException e) {
        logMessage("发送JMS消息失败:" + e.getMessage());
    }
}

关键注意事项

  • 所有更新TextArea的操作必须用Platform.runLater包裹,避免非UI线程操作组件引发异常
  • 加入时间戳可提升日志的可追溯性
  • 异常处理时记录堆栈信息,便于排查深层问题

内容的提问来源于stack exchange,提问作者Alex Dipayen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:05:25