这里采用的是用本机做为服务器,写的一个发送与接受消息简单的Java消息服务,它的缺点是只能接受一次
服务器发送来的消息,消费者没有对服务器发送的消息进行监听,还有一旦服务器崩溃,服务器中的消息,会丢失。
步骤:
预备工作导入3个包:
分别是:activemq-all-5.13.0.jar ,commons-collections-3.2.2.jar,
commons-pool2-2.4.2.jar
1,建立与消息服务器的连接,建立消息工厂
2,创建一个队列
3,通过连接工厂创建一个会话,即session
创建session时注意:
createSession(paramA,paramB);
paramA是设置事务的,paramB设置acknowledgment mode
paramA设置为false时:paramB的值可为 Session.AUTO_ACKNOWLEDGE,Session.CLIENT_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE其中一个。
paramA设置为true时:paramB的值忽略, acknowledgment mode被jms服务器设置为SESSION_TRANSACTED 。
Session.AUTO_ACKNOWLEDGE为自动确认,客户端发送和接收消息不需要做额外的工作。
Session.CLIENT_ACKNOWLEDGE为客户端确认。客户端接收到消息后,必须调用javax.jms.Message的acknowledge方法。jms服务器才会删除消息。
DUPS_OK_ACKNOWLEDGE允许副本的确认模式。一旦接收方应用 程序的方法调用从处理消息处返回,会话对象就会确认消息的接收;而且允许重复确认。在需要考虑资源使用时,这种模式非常有效。
4,通过会话创建一个消息
5,创建一个消息生产者,并由生产者将消息发送给服务器
6,创建一个消费者,用来接受消息
注意最后输出的消息时,需要强制转换类型
详细代码:
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
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 Test1 {
/**
* @param args
* @throws JMSException
*/
public static void main(String[] args) throws JMSException {
//1,建立与消息服务器的连接
//这里用的是本机作为消息的存储没有用activemq服务器
ConnectionFactory factory =new ActiveMQConnectionFactory("vm://localhost");
Connection connerction=factory.createConnection();
connerction.start();
//2,创建一个队列
Queue queue=new ActiveMQQueue("testQueue");
//3,创建一个回话
final Session session=connerction.createSession(false, Session.AUTO_ACKNOWLEDGE);
//通过会话来创建一个消息
Message message=session.createTextMessage("hello jms");
//创建一个生产者
MessageProducer messageProducer=session.createProducer(queue);
//生产者将消息发送给服务器
messageProducer.send(message);
System.out.println("消息已经发送到服务器");
//创建一个消费者来接受消息
MessageConsumer messageConsumer=session.createConsumer(queue);
Message recevicemesage=messageConsumer.receive();
System.out.println("接到了消息:"+((TextMessage)(recevicemesage)).getText());