Java 为什么JMS'&引用;createTextMessage";使用字符串变量参数抛出异常,但不在普通字符串上抛出异常?

Java 为什么JMS'&引用;createTextMessage";使用字符串变量参数抛出异常,但不在普通字符串上抛出异常?,java,jms,Java,Jms,我目前正在使用JMS创建一个聊天演示应用程序,在创建消息发布者时,我遇到了一个奇怪的错误。以下是我的代码: public类MessageEmission实现可运行{ 私有字符串队列名称; 私有字符串消息; public MessageEmission(字符串queueName,字符串message){ queueName=this.queueName; message=this.message; } 公开募捐{ 试一试{ 连接=CreateConnection(); 会话会话=connectio

我目前正在使用JMS创建一个聊天演示应用程序,在创建消息发布者时,我遇到了一个奇怪的错误。以下是我的代码:

public类MessageEmission实现可运行{
私有字符串队列名称;
私有字符串消息;
public MessageEmission(字符串queueName,字符串message){
queueName=this.queueName;
message=this.message;
}
公开募捐{
试一试{
连接=CreateConnection();
会话会话=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
TextMessage=session.createTextMessage(消息);
目的地=session.createQueue(queueName);
MessageProducer=session.createProducer(目的地);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
生产者。发送(消息);
session.close();
connection.close();
}
捕获(例外e){
System.out.println(“捕获:+e”);
e、 printStackTrace();
}
}
专用连接CreateConnection(){
ActiveMQConnectionFactory connectionFactory=新的ActiveMQConnectionFactory(Configuration.getActiveMqServerHost());
连接=空;
尝试
{
connection=connectionFactory.createConnection();
connection.start();
}
捕获(例外e)
{
System.out.println(“捕获:+e”);
e、 printStackTrace();
}
回路连接;
}
}
我在VS代码中突出显示的错误在这里

TextMessage=session.createTextMessage(message);
错误如下:

The method createTextMessage(String) in the type Session is not applicable for the arguments
每当我用类似这样的字符串替换参数消息时,错误就会消失

TextMessage=session.createTextMessage(“这很好!:fire:”);
如果我使用消息字符串变量作为函数的参数,我不会得到编译错误,但是当我运行它时应用程序崩溃。。。我不知道我做错了什么,有人能解释一下是什么问题吗

在我的主应用程序类中,我使用以下命令运行Runnable:

@springboot应用程序
公共类演示应用程序{
公共静态void main(字符串[]args)引发异常{
线程(newmessageemission(“MESSAGE”,“This”),false);
线程(newmessageemission(“MESSAGE”,“is”),false);
线程(newmessageemission(“MESSAGE”,“a”),false);
线程(新消息发射(“消息”,“测试”),false);
线程(newmessageemission(“MESSAGE”,“and”),false);
线程(newmessageemission(“MESSAGE”,“it”),false);
线程(newmessageemission(“MESSAGE”,“is”),false);
线程(新消息发射(“消息”,“工作”),false);
线程(newmessageemission(“MESSAGE”,“as”),false);
线程(新消息发射(“消息”、“预期”),false);
//run(DemoApplication.class,args);
}
公共静态无效线程(可运行、可运行、布尔守护进程){
Thread brokerThread=新线程(可运行);
brokerThread.setDaemon(守护进程);
brokerThread.start();
}
}

您在构造函数中的赋值顺序错误:

public MessageEmission(String queueName, String message) {
    this.queueName = queueName;   // assign the value of argument to field variable
    this.message = message;
}
您可能还希望重命名
TextMessage
变量,以避免与字段
message
冲突:

TextMessage textMessage = session.createTextMessage(message);  // here, message is equivalent to this.message
我还注意到,您使用的
连接
会话
接口都实现了
自动关闭
,您还可以在
try with resources语句中使用该对象:

    // this ensures connection and session are closed at the end of the try block
    try (Connection connection = createConnection();
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)) {
        
        TextMessage message = session.createTextMessage(message);
        Destination destination = session.createQueue(queueName);
        MessageProducer producer = session.createProducer(destination);
        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
        producer.send(message);
    }
    catch (Exception e) {
        System.out.println("Caught: " + e);
        e.printStackTrace();
    }

还值得注意的是,您正在为发送的每封邮件创建连接、会话、生产者等。这是一个重要的反模式,除非您在幕后使用连接池之类的东西,它只是将连接返回到池中,而不是物理关闭连接。