一.JMS的概念
JMS是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输
二.点对点模式(P2P)
Point-to-Point(P2P)
涉及到的概念 :
1,消息队列(Queue)
2,发送者(Sender)
3,接收者(Receiver)
每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。
P2P的特点:
1,每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)
2,发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列
3,接收者在成功接收消息之后需向队列应答成功
如果你希望发送的每个消息都应该被成功处理的话,那么你需要P2P模式。
三.安装下载ActiveMQ
1、下载
下载地址:http://activemq.apache.org
2、安装
如果是在windows系统中运行,可以直接解压 *.bin.zip,并运行bin目录下的activemq.bat文件,此时使用的是默认的服务端口:61616和默认的console端口:8161。
如果是在linux或unix下运行,在bin目录下执行命令:./activemq setup
3、修改ActiveMQ的服务端口和console端口
A、修改服务端口:打开conf/activemq.xml文件进行修改
<transportConnectors>
<transportConnector name="openwire" uri="tcp://10.42.220.72:61618"discoveryUri="multicast://default"/>
</transportConnectors>
B、修改console的地址和端口:打开conf/jetty.xml文件进行修改
<bean id="jettyPort"class="org.apache.activemq.web.WebConsolePort"init-method="start">
<property name="port" value="8162"/>
登陆http://localhost:8161/admin/queues.jsp,默认的用户名和密码:admin/admin
四.代码实现
1,创建一个连接类Connec
public class Connec {
public static String USER=ActiveMQConnection.DEFAULT_USER;
public static String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;
public static String BROKER_URL=ActiveMQConnection.DEFAULT_BROKER_URL;
}
2,创建一个消息生产者类JmsProducer
public class JmsProducer {
private static final int SEND_NUMBER=9;
public static void main(String[] args){
ConnectionFactory connectionFactory;//连接工厂
Connection connection = null;//连接
Session session;//会话
Destination destination;//连接目的地
MessageProducer messageProducer;//消息制造者
//实例化工厂
connectionFactory=new ActiveMQConnectionFactory(Connec.USER,Connec.PASSWORD,Connec.BROKER_URL);
try {
connection=connectionFactory.createConnection();
connection.start();//启动连接
session=connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
destination=session.createQueue("myActiveMQ1");
messageProducer=session.createProducer(destination);
sendMessage(session,messageProducer);
session.commit();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if (null != connection) {
connection.close();
}
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void sendMessage(Session session,MessageProducer messageProducer) throws JMSException {
for(int i=0;i<SEND_NUMBER;i++) {
TextMessage message= session.createTextMessage("ActiveMQ发送的消息"+i);
System.out.println("发送的消息:"+message.getText());
messageProducer.send(message);
}
}
}
3,创建一个消息消费者类JmsConsumer
public class JmsConsumer {
public static void main(String[] args) {
ConnectionFactory connectionFactory;//连接工厂
Connection connection = null;//连接
Session session;//会话
Destination destination;//连接目的地
MessageConsumer messageConsumer;
//实例化工厂
connectionFactory=new ActiveMQConnectionFactory(Connec.USER,Connec.PASSWORD,Connec.BROKER_URL);
try {
connection=connectionFactory.createConnection();
connection.start();//启动连接
session=connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
destination=session.createQueue("myActiveMQ1");
messageConsumer=session.createConsumer(destination);
while(true) {
TextMessage textMessage= (TextMessage) messageConsumer.receive();
if(textMessage!=null) {
System.out.println("ActiveMQ接受到的消息:"+textMessage.getText());
}else {
break;
}
}
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if (null != connection) {
connection.close();
}
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
4,运行代码
在运行代码之前要确保下载了ActiveMQ已经启动
先运行生产者类,然后运行消费者类