【问题标题】:JMS sending messageJMS 发送消息
【发布时间】:2021-02-09 22:18:54
【问题描述】:

我想发布消息,我正在为此编写一个 JMS 应用程序,该应用程序会将消息发布到 Tibco EMS 队列。有两个队列,一个用于正常日志记录,另一个用于异常日志记录。现在如何将消息发送到 JMS 中的两个不同队列。谁能帮我解决这个问题,因为它非常关键?

【问题讨论】:

  • 我看不出问题出在哪里?
  • 一般我们将消息发送到一个队列。但是在这里我需要将两种不同类型的消息发送到两个不同的队列。一个用于记录日志,另一个用于错误。

标签: jms tibco-ems ems


【解决方案1】:

将消息发送到队列的非常基本的 JMS API 代码如下所示。您需要根据您的环境调整连接工厂以及队列名称。还需要调整初始上下文设置。

void sendMessage() {
    Connection con = null;
    try {

        // Get the initial context
        Hashtable<String, String> hTable = new Hashtable<String, String>();
        hTable.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
        hTable.put(Context.PROVIDER_URL, "t3://localhost:7001");
        Context ctx = new InitialContext(hTable);

        // Create ConnectionFactory
        ConnectionFactory cf = (ConnectionFactory) ctx.lookup("JMS-JNDI-ConFactory");

        // Create connection
        con = cf.createConnection();

        // Create Non transacted Session with auto ack
        Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE);

        // Create the destination
        Queue queue = (Queue) ctx.lookup("JMS-JNDI-Queue");

        // Create MessageProducer for the destination
        MessageProducer producer = session.createProducer(queue);

        // Create empty Message with header and properties only
        TextMessage message = session.createTextMessage();

        // set the message body
        message.setText("Message-1");

        // Send the message
        producer.send(message);

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (con != null) {
            try {
                con.close();
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }
}

【讨论】:

  • 谢谢.. 但我需要将两种不同类型的消息发送到两个不同的队列。一个用于记录日志,另一个用于错误。
  • 这只是一个详细说明如何发送消息的示例。您可以重用代码将任何类型的消息发送到任何其他队列。
【解决方案2】:

这是一个老话题,但也许它可以提供帮助。

要将消息发送到 JMS 队列实际上需要以下内容:

Context context = null;
QueueConnection queueConnection = null;
QueueSession queueSession = null;
Queue queue;

这就是它的工作原理:

context = getContext(host, port, user, password);
queueConnection = getConnectionFactory(context, connectionFactoryJndi);
queueSession = getQueueSession(queueConnection);
queue = getQueue(context, queueJndi);

// send a text message
queueConnection.start();
String message = "hello";
sendMessageToQueue(verbose, message, queueSession, queue);
queueConnection.stop();

要获取你需要连接到服务器的上下文:

private Context getContext(String host, int port, String user, String password) throws NamingException {
    String url = String.format("%s://%s:%d", protocol, host, port);

    Hashtable<String, String> env = new Hashtable<>();
    env.put(Context.INITIAL_CONTEXT_FACTORY, initialContextFactory);
    env.put(Context.PROVIDER_URL, url);
    env.put(Context.SECURITY_PRINCIPAL, user);
    env.put(Context.SECURITY_CREDENTIALS, password);
    return new InitialContext(env);
}

获取连接工厂:

private QueueConnection getConnectionFactory(Context context, String jndiName)
        throws NamingException, JMSException {

    QueueConnectionFactory connectionFactory = (QueueConnectionFactory) context.lookup(jndiName);
    return connectionFactory.createQueueConnection();
}

打开一个队列会话:

private QueueSession getQueueSession(QueueConnection queueConnection) throws JMSException {
    return queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
}

获取队列:

private Queue getQueue(Context context, String jndiName) throws NamingException {
    return (Queue) context.lookup(jndiName);
}

最后,将您的消息发送到队列:

私有静态 void sendMessageToQueue(boolean verbose, 字符串消息, 队列会话队列会话, 队列队列)抛出 JMSException {

TextMessage textMessage = queueSession.createTextMessage(message);

try (QueueSender queueSender = queueSession.createSender(queue)) {
    queueSender.send(textMessage);
}

}

这些代码 sn-ps 来自这里:https://github.com/zappee/jms-message-sender 这是一个JMS sender命令行工具,可以以本项目为例。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2016-01-11
    • 2018-07-30
    • 2012-01-07
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    相关资源
    最近更新 更多