gpt4 book ai didi

java - 如何在 JMS 中初始化初始上下文

转载 作者:行者123 更新时间:2023-11-30 03:21:41 25 4
gpt4 key购买 nike

我想使用 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,并提供必要的(传输)参数。

由于您不是从 Java EE 容器中检索它,因此相关 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);
}
}

请注意,连接、 session 和生产者应该被重用(不是为每次使用创建和释放但不在线程之间共享),并且最好是池化。

参见https://developer.jboss.org/wiki/ShouldICacheJMSConnectionsAndJMSSessions

关于java - 如何在 JMS 中初始化初始上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31177515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com