Java 如何在JMS中初始化初始上下文

Java 如何在JMS中初始化初始上下文,java,jakarta-ee,jms,mq,Java,Jakarta Ee,Jms,Mq,我想使用JMS队列在独立应用程序中创建一个消息队列。我没有使用像tomcat和JBoss这样的容器。传递给初始上下文对象的参数应该是什么。?它完全是一个独立的应用程序 注:如果有人希望对这一问题投反对票,请在评论中说明理由并投反对票。谢谢 InitialContext ctx = new InitialContext(?????); Queue queue = (Queue) ctx.lookup("queue/queue1"); QueueConnec

我想使用JMS队列在独立应用程序中创建一个消息队列。我没有使用像tomcat和JBoss这样的容器。传递给初始上下文对象的参数应该是什么。?它完全是一个独立的应用程序

注:如果有人希望对这一问题投反对票,请在评论中说明理由并投反对票。谢谢

       InitialContext ctx = new InitialContext(?????);
       Queue queue = (Queue) ctx.lookup("queue/queue1");
       QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx.lookup("queue/connectionFactory");
       QueueConnection queueConn = connFactory.createQueueConnection();
       QueueSession queueSession = queueConn.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);
       QueueSender queueSender = queueSession.createSender(queue);
       queueSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
       TextMessage message = queueSession.createTextMessage("Hello");
       queueSender.send(message);
       System.out.println("sent: " + message.getText());
       queueConn.close();

您无法通过jndi解析connectionFactory,因为没有提供它的容器

您必须自己实例化connectionFactory,提供必要的(传输)参数

由于您没有从JavaEE容器中检索它,因此相关的JSR没有涵盖此行为,并且它是特定于提供者的

下面是使用HornetQ的示例:

// Transport parameters
final Map< String, Object > connectionParams = new HashMap< String, Object >();
connectionParams.put(TransportConstants.PORT_PROP_NAME, port);
connectionParams.put(TransportConstants.HOST_PROP_NAME, host);

final TransportConfiguration transportConfiguration = new TransportConfiguration(
    NettyConnectorFactory.class.getName(), connectionParams);

// this should be created only once and reused for the whole app lifecycle
connectionFactory = (ConnectionFactory) org.hornetq.api.jms.HornetQJMSClient
    .createConnectionFactoryWithoutHA(JMSFactoryType.QUEUE_CF, transportConfiguration);

final jmsQueue = HornetQJMSClient.createQueue(queueName)   

try {
    // connection is thread safe
    Connection connection = null;

    // session is not
    Session session = null;

    connection = connectionFactory.createConnection(user, password);
    connection.start();

   /* following objects must be propper to a thread (but should be reused if possible) */

    // Create a non transacted Session (no XA support outside of Java EE container)
    session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

    final MessageProducer producer = session.createProducer(jmsQueue);
    final ObjectMessage objectMessage = session.createObjectMessage();

    objectMessage.setObject(myMessageSerializableObject);

    producer.send(objectMessage);
}
finally {
    // Release resources
    try {
        if (session != null) {
          session.close();
        }
        if (connection != null) {
          connection.close();
        }
    }
    catch (final JMSException e) {
        LOG.warn("An error occurs while releasing JMS resources", e);
    }
}
//传输参数
最终映射connectionParams=newhashmap();
connectionParams.put(TransportConstants.PORT_PROP_NAME,PORT);
connectionParams.put(TransportConstants.HOST_PROP_NAME,HOST);
最终传输配置传输配置=新传输配置(
NettyConnectorFactory.class.getName(),connectionParams);
//这应该只创建一次,并在整个应用程序生命周期中重复使用
connectionFactory=(connectionFactory)org.hornetq.api.jms.HornetQJMSClient
.createConnectionFactoryWithoutHA(JMSFactoryType.QUEUE_CF,transportConfiguration);
final jmsQueue=HornetQJMSClient.createQueue(queueName)
试一试{
//连接是线程安全的
连接=空;
//会话不可用
会话=空;
connection=connectionFactory.createConnection(用户、密码);
connection.start();
/*以下对象必须支持线程(但如果可能,应重新使用)*/
//创建非事务性会话(JavaEE容器之外不支持XA)
会话=connection.createSession(false,session.AUTO_-ACKNOWLEDGE);
final MessageProducer=session.createProducer(jmsQueue);
final ObjectMessage ObjectMessage=session.createObjectMessage();
setObject(myMessageSerializableObject);
producer.send(objectMessage);
}
最后{
//释放资源
试一试{
if(会话!=null){
session.close();
}
if(连接!=null){
connection.close();
}
}
捕获(最终JME){
LOG.warn(“释放JMS资源时发生错误”,e);
}
}
请注意,应该重用连接、会话和生产者(不为每次使用创建和发布,但不在线程之间共享),理想情况下应将其合并


请参见

这取决于JMS提供程序,但如果您不使用容器,则通常必须使用与提供程序相关的类和api来访问消息传递提供程序。谢谢@Gab。你的解释对我很有用。得到你的学分。!!