跳到主要内容

发送消息

要向目标发送消息,请从获取的 MessageProducer 对象调用 send(),并传入要发送的消息。

也可以通过 send(...) 方法传入以下消息参数,或者在创建 MessageProducer 时设置这些参数:

  • destination — 要发送消息的目标。
  • deliveryMode — 要使用的消息传输模式(持久化或非持久化)。
  • priority — 消息的优先级。

当端点配置为强制执行消息优先级时,它会增加在连接故障恢复后向消费客户端传递重复消息的机会(参阅消息优先级)。

  • timeToLive — 消息的生存时间(TTL)值(以毫秒为单位)。值为 0 表示消息永不过期。

如果在消息级别提供了这些值,则会覆盖在 MessageProducer 级别设置的默认值(参阅创建消息生产者)。

以下示例展示了如何发送文本消息:

ConnectionFactory cf = (ConnectionFactory)context.lookup("cf/default");
Destination destination = (Destination)context.lookup("topic/testDest");
connection = cf.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
producer = session.createProducer(destination);
Message message = session.createTextMessage("This is a text message");
producer.send(message);

在发送消息时使用预发送钩子

您可以使用 JMS API 中的生产者拦截器(或预发送钩子)来实现应用程序的核心关注点,例如在发送消息之前进行日志记录或加密。此预发送钩子用于在生产者处理过程中拦截 JMS 消息,并允许您实现核心关注点。当您发送消息时,生产者拦截器会在底层 Solace JMS API 处理消息之前透明地运行。要使用它,您必须实现 MessageProducerInterceptor 接口,并使用 SupportedProperty.SOLACE_JMS_MESSAGE_PRODUCER_INTERCEPTOR_CLASS_NAME 激活该接口,该属性指定实现 MessageProducerInterceptor 接口的消息生产者拦截器的完全限定名称。当您调用任何发送方法时,您的实现将在消息发送之前运行。有关更多信息,请参阅 Solace JMS API 参考中的以下内容:

  • MessageProducerInterceptor
  • MessageProducerInterceptingContext.MessageProducerInterceptingContext
  • SupportedProperty.SOLACE_JMS_MESSAGE_PRODUCER_INTERCEPTOR_CLASS_NAME

例如,假设您有一个方法,在 MyMessageProducerInterceptor.java 文件中,在消息发送之前对其进行操作:

package com.myexample.MyMessageProducerInterceptor;
import com.solacesystems.jms.interceptors.MessageProducerInterceptor;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.TextMessage;

/**
* 一个可用于透明消息加密的示例生产者拦截器。
*/
public class MyMessageProducerInterceptor implements MessageProducerInterceptor {
public MyMessageProducerInterceptor () {
}
@Override
public void onPrePublish(MessageProducerInterceptingContext interceptingContext) throws JMSException {
Message msg = interceptingContext.getMessage();
if (msg instanceof TextMessage) {
String text = ((TextMessage)msg).getText();
msg.clearBody();
((TextMessage)msg).setText(text + ": intercepted");
}
}
}

以下是如何启用生产者拦截器的示例:

import com.solacesystems.jms.SolConnectionFactory;
import com.solacesystems.jms.SolJmsUtility;
import com.solacesystems.jms.SupportedProperty;
import java.util.Hashtable;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public static class ConfigureProducerInterceptor {

private static final String SOLJMS_INITIAL_CONTEXT_FACTORY = "com.solacesystems.jndi.SolJNDIInitialContextFactory";
private static final String PRODUCER_INTERCEPTOR_CLASS_NAME = MyMessageProducerInterceptor.class.getName();

/**
* 一个如何使用初始上下文和 JNDI 配置拦截器的示例。
*
* @throws NamingException 当 JNDI 查找失败时可能会抛出
* @throws JMSException 由于内部 API 原因可能会抛出
*/
public void exampleOfConfigureInterceptorWithInitialContextAndJNDI() throws NamingException, JMSException {
// 默认连接工厂的 JNDI 名称。
// SolConnectionFactory 需要通过 JNDI 配置用于默认连接

final Hashtable<String, Object> env = new Hashtable<String, Object>();
env.put(InitialContext.INITIAL_CONTEXT_FACTORY, SOLJMS_INITIAL_CONTEXT_FACTORY);
//...
//... 其他配置
// 在此示例中未定义用户名和密码,仅作为示例变量提供
env.put(Context.SECURITY_PRINCIPAL, username);
env.put(Context.SECURITY_CREDENTIALS, password);
// 启用 SMFs 的使用,无需指定信任库
// 仅用于说明目的;不建议在生产中使用
env.put(SupportedProperty.SOLACE_JMS_SSL_VALIDATE_CERTIFICATE, false);
// 在初始上下文中启用拦截器
env.put(SupportedProperty.SOLACE_JMS_MESSAGE_PRODUCER_INTERCEPTOR_CLASS_NAME, PRODUCER_INTERCEPTOR_CLASS_NAME);
// 根据环境创建新上下文
final InitialContext initialContext = new InitialContext(env);
// 创建连接
final ConnectionFactory cf = (ConnectionFactory) initialContext.lookup("cf/default");
final Connection connection = cf.createConnection();
// 创建会话
final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 设置要发送消息的主题
final Destination destination = session.createTopic("myTopic");
// 发布消息,在发送消息之前透明地调用生产者拦截器
TextMessage textMessage = session.createTextMessage("this message was intercepted to transparently do something like encryption, logging, etc.");
final MessageProducer producer = session.createProducer(destination);
producer.send(textMessage);
}
}