在下面的例子中,分别发送一个Persistent和nonpersistent的消息,然后关闭退出JMS。
import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
public class DeliveryModeSendTest {
public static void main(String[] args) throws Exception {
ActiveMQConnectionFactory factory = new
ActiveMQConnectionFactory("vm://localhost");
Connection connection = factory.createConnection();
connection.start();
Queue queue = new ActiveMQQueue("testQueue");
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(queue);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
producer.send(session.createTextMessage("A persistent
Message"));
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
producer.send(session.createTextMessage("A non persistent
Message"));
System.out.println("Send messages sucessfully!");
}
}
运行上面的程序,当输出“Send messages
sucessfully!”时,说明两个消息都已经发送成功,然后我们结束它,来停止JMS Provider。
接下来我们重新启动JMS Provicer,然后添加一个消费者:
import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
public class DeliveryModeReceiveTest {
public static void main(String[] args) throws Exception {
ActiveMQConnectionFactory factory = new
ActiveMQConnectionFactory("vm://localhost");
Connection connection = factory.createConnection();
connection.start();
Queue queue = new ActiveMQQueue("testQueue");
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
MessageConsumer comsumer = session.createConsumer(queue);
comsumer.setMessageListener(new MessageListener(){
public void onMessage(Message m) {
try {
System.out.println("Consumer get " +
((TextMessage)m).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
}
}
运行上面的程序,可以得到下面的输出结果:
Consumer get A persistent Message
可以看出消息消费者只接收到一个消息,它是一个Persistent的消息。而刚才发送的non persistent消息已经丢失了。
另外, 如果发送一个non persistent消息, 而刚好这个时候没有消费者在监听, 这个消息也会丢失.
分享到:
相关推荐
以下是一个简单的例子: ```java Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Queue queue = session.createQueue("myQueue"); MessageProducer producer = session....
在这个例子中,我们展示了两种消费消息的方式。第一种是旧版方法,通过调用BasicConsume并提供回调函数来处理接收到的消息。另一种方式是使用BasicGet,但这种方式通常不推荐,因为它不支持批量获取和确认机制。 ...
javax.jms.DeliveryMode.class javax.jms.Destination.class javax.jms.ExceptionListener.class javax.jms.IllegalStateException.class javax.jms.InvalidClientIDException.class javax.jms....
- **属性**:如`deliveryMode`用于设置消息持久化,`expiration`设置消息过期时间,`MessageId`作为消息唯一标识。 - **类和注解**:`connectionFactory`用于建立连接,`AmqpAdmin`管理Exchange、Queue和Binding,`...
在发送消息时,我们需要设置`DeliveryMode`为2,这表示消息应被持久化: ```java Properties props = new BasicProperties.Builder() .deliveryMode(2) // 持久化 .build(); channel.basicPublish("", queueName,...
javax.jms.DeliveryMode.class javax.jms.Connection.class javax.jms.Session.class javax.jms.ConnectionMetaData.class javax.jms.ExceptionListener.class javax.jms.ServerSessionPool.class javax.jms....
消息的持久性是通过 `DeliveryMode` 属性来控制的,包括 `PERSISTENT` 和 `NON_PERSISTENT` 两种模式。对于不需要极高可靠性的场景,推荐使用 `NON_PERSISTENT` 模式,以换取更快的入队速度。这种方式牺牲了一定程度...
<deliveryMode>NON_PERSISTENT</deliveryMode> <autoDelete>false <queueSize>1024 <discardingThreshold>80 <maxFlushTime>2000 <neverBlock>true ``` 这段配置会将`com.basis`包下所有级别的错误...
setJMSDeliveryMode(int deliveryMode) throws JMSException; boolean getJMSRedelivered() throws JMSException; void setJMSRedelivered(boolean redelivered) throws JMSException; String ...
4. **枚举和异常**:RabbitMQ Java 客户端中可能包含一些枚举类型,如 `DeliveryMode`,表示消息的持久化级别,以及自定义的异常类,如 `IOException` 的子类,用于处理与网络或数据传输相关的错误。 5. **示例代码...
我们可以通过设置请求选项来控制图像的质量和大小,例如使用`PHImageRequestOptions`的`deliveryMode`和`resizeMode`属性。当图片加载完成后,可以将其显示在一个自定义的视图控制器中,提供缩放和平移等交互功能,...
发送消息时,使用持久化模式(`DeliveryMode.PERSISTENT`)。 - 在点对点模式中,消息默认会存储直到被消费者消费,所以消息丢失不是问题。 3. **解决消息重复问题** - 防止消息重复执行的关键是记录消息的处理...
2) 发布消息时的deliveryMode设置为2,表示持久化;3) 消息已到达持久化交换器和队列。RabbitMQ通过将持久化消息写入磁盘日志,保证了即使在服务器重启后也能恢复消息。 面试中,RabbitMQ的相关知识点可能包括但不...
同时,利用`PHImageRequestOptions`的`deliveryMode`设置为`PHImageRequestOptionsDeliveryModeHighQualityFormat`,在不牺牲画质的情况下降低内存消耗。 6. **预览与选择**: 当用户点击某张图片进入预览模式,...
requestOptions.deliveryMode = .highQualityFormat requestOptions.isNetworkAccessAllowed = true imageManager.requestImageData(for: asset, options: requestOptions) { (data, _, _, _) in // 处理图片数据,...
在提供的Java代码中,如果将`DeliveryMode.PERSISTENT`设置为非持久化(默认值),则消息将不会被持久化保存。 2. **持久化**:相反,如果使用持久化模式,即使服务器关闭,未消费的消息也会被存储在ActiveMQ的数据...
9. **性能优化**:在加载大量图片时,使用`PHImageRequestOptions`的`networkAccessAllowed`和`deliveryMode`属性可以优化加载策略,例如后台加载或低质量预览。 10. **用户界面设计**:模仿微信的界面设计,应考虑...
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat; [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(100, 100) contentMode:...