缺点:业务逻辑耦合度高,业务拆分不明确
方案二:业务逻辑在shop-search中实现,调用服务在shop-manager实现。业务逻辑分开。缺点:服务之间的耦合度变高。服务的启动有先后顺序。
方案三:使用消息队列。MQ是一个消息中间件。
MQ是一个消息中间件,ActiveMQ、RabbitMQ、kafka。
安装环境:
1、需要jdk
2、安装Linux系统。生产环境都是Linux系统。
安装步骤:
第一步: 把ActiveMQ 的压缩包上传到Linux系统。
第二步:解压缩。
第三步:启动。
使用bin目录下的activemq命令启动:
[root@localhost bin]# ./activemq start 关闭: [root@localhost bin]# ./activemq stop 查看状态: [root@localhost bin]# ./activemq status注意:如果ActiveMQ整合spring使用不要使用activemq-all-5.12.0.jar包。建议使用5.11.2
进入管理后台用户名:admin,密码:admin
Host文件的配置(/stc/hosts):
重新启动Activemq的服务。
第一步:创建ConnectionFactory对象,需要指定服务端ip及端口号。org.apache.activemq activemq-all
/** * 点到点形式发送消息 */ @Test public void testQueueProducer() throws Exception { //1、创建一个连接工厂对象,需要指定服务的ip及端口。 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.161:61616"); //2、使用工厂对象创建一个Connection对象。 Connection connection = connectionFactory.createConnection(); //3、开启连接,调用Connection对象的start方法。 connection.start(); //4、创建一个Session对象。 //第一个参数:是否开启事务。如果true开启事务,第二个参数无意义。一般不开启事务false。 //第二个参数:应答模式。自动应答或者手动应答。一般自动应答。 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //5、使用Session对象创建一个Destination对象。两种形式queue、topic,现在应该使用queue Queue queue = session.createQueue("test-queue"); //6、使用Session对象创建一个Producer对象。 MessageProducer producer = session.createProducer(queue); //7、创建一个Message对象,可以使用TextMessage。 /*TextMessage textMessage = new ActiveMQTextMessage(); textMessage.setText("hello Activemq");*/ TextMessage textMessage = session.createTextMessage("hello activemq"); //8、发送消息 producer.send(textMessage); //9、关闭资源 producer.close(); session.close(); connection.close(); }
@Test public void testQueueConsumer() throws Exception { //创建一个ConnectionFactory对象连接MQ服务器 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.161:61616"); //创建一个连接对象 Connection connection = connectionFactory.createConnection(); //开启连接 connection.start(); //使用Connection对象创建一个Session对象 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //创建一个Destination对象。queue对象 Queue queue = session.createQueue("test-queue"); //使用Session对象创建一个消费者对象。 MessageConsumer consumer = session.createConsumer(queue); //接收消息 consumer.setMessageListener(new MessageListener() { @Override public void onMessage(Message message) { //打印结果 TextMessage textMessage = (TextMessage) message; String text; try { text = textMessage.getText(); System.out.println(text); } catch (JMSException e) { e.printStackTrace(); } } }); //等待接收消息 System.in.read(); //关闭资源 consumer.close(); session.close(); connection.close(); }
@Test public void testTopicProducer() throws Exception { //1、创建一个连接工厂对象,需要指定服务的ip及端口。 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.161:61616"); //2、使用工厂对象创建一个Connection对象。 Connection connection = connectionFactory.createConnection(); //3、开启连接,调用Connection对象的start方法。 connection.start(); //4、创建一个Session对象。 //第一个参数:是否开启事务。如果true开启事务,第二个参数无意义。一般不开启事务false。 //第二个参数:应答模式。自动应答或者手动应答。一般自动应答。 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //5、使用Session对象创建一个Destination对象。两种形式queue、topic,现在应该使用topic Topic topic = session.createTopic("test-topic"); //6、使用Session对象创建一个Producer对象。 MessageProducer producer = session.createProducer(topic); //7、创建一个Message对象,可以使用TextMessage。 /*TextMessage textMessage = new ActiveMQTextMessage(); textMessage.setText("hello Activemq");*/ TextMessage textMessage = session.createTextMessage("topic message"); //8、发送消息 producer.send(textMessage); //9、关闭资源 producer.close(); session.close(); connection.close(); }
@Test public void testTopicConsumer() throws Exception { //创建一个ConnectionFactory对象连接MQ服务器 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.161:61616"); //创建一个连接对象 Connection connection = connectionFactory.createConnection(); //开启连接 connection.start(); //使用Connection对象创建一个Session对象 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //创建一个Destination对象。topic对象 Topic topic = session.createTopic("test-topic"); //使用Session对象创建一个消费者对象。 MessageConsumer consumer = session.createConsumer(topic); //接收消息 consumer.setMessageListener(new MessageListener() { @Override public void onMessage(Message message) { //打印结果 TextMessage textMessage = (TextMessage) message; String text; try { text = textMessage.getText(); System.out.println(text); } catch (JMSException e) { e.printStackTrace(); } } }); System.out.println("topic消费者3启动。。。。"); //等待接收消息 System.in.read(); //关闭资源 consumer.close(); session.close(); connection.close(); }