Java 如何在JMS中初始化初始上下文
我想使用JMS队列在独立应用程序中创建一个消息队列。我没有使用像tomcat和JBoss这样的容器。传递给初始上下文对象的参数应该是什么。?它完全是一个独立的应用程序 注:如果有人希望对这一问题投反对票,请在评论中说明理由并投反对票。谢谢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
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。你的解释对我很有用。得到你的学分。!!