当前位置: 首页 > news >正文

福田做网站的公司网络销售平台排名前十

福田做网站的公司,网络销售平台排名前十,北京做网站设计公司,做国外有那些网站比较好的同步和异步 异步调用 MQ MQ优势:①服务解耦 ②异步调用 ③流量削峰 结构 消息模型 RabbitMQ入门案例,实现消息发送和消息接收 生产者: public class PublisherTest {Testpublic void testSendMessage() throws IOException, TimeoutExce…

同步和异步

异步调用

MQ

MQ优势:①服务解耦   ②异步调用   ③流量削峰

结构

消息模型

 RabbitMQ入门案例,实现消息发送和消息接收

生产者:
public class PublisherTest {@Testpublic void testSendMessage() throws IOException, TimeoutException {// 1.建立连接ConnectionFactory factory = new ConnectionFactory();// 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码factory.setHost("192.168.136.132");factory.setPort(5672);factory.setVirtualHost("/");factory.setUsername("itcast");factory.setPassword("123321");// 1.2.建立连接Connection connection = factory.newConnection();// 2.创建通道ChannelChannel channel = connection.createChannel();// 3.创建队列String queueName = "simple.queue";channel.queueDeclare(queueName, false, false, false, null);// 4.发送消息String message = "hello, rabbitmq!";channel.basicPublish("", queueName, null, message.getBytes());System.out.println("发送消息成功:【" + message + "】");// 5.关闭通道和连接channel.close();connection.close();}
}
消费者:
public class ConsumerTest {public static void main(String[] args) throws IOException, TimeoutException {// 1.建立连接ConnectionFactory factory = new ConnectionFactory();// 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码factory.setHost("192.168.136.132");factory.setPort(5672);factory.setVirtualHost("/");factory.setUsername("itcast");factory.setPassword("123321");// 1.2.建立连接Connection connection = factory.newConnection();// 2.创建通道ChannelChannel channel = connection.createChannel();// 3.创建队列String queueName = "simple.queue";channel.queueDeclare(queueName, false, false, false, null);// 4.订阅消息channel.basicConsume(queueName, true, new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body) throws IOException {// 5.处理消息String message = new String(body);System.out.println("接收到消息:【" + message + "】");}});System.out.println("等待接收消息。。。。");}
}

SpringAMQP

引入依赖

        <!--AMQP依赖,包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>

普通队列 

 第一步:publisher服务配置文件,发消息

spring:rabbitmq:host: 192.168.136.132port: 5672username: itcastpassword: 123321virtual-host: /
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringAMQPTest {//获取RabbitTemplateAPI@Resourceprivate RabbitTemplate rabbitTemplate;@Testpublic void test(){String queueName = "simple.queue";String message = "hello SpringAMQP";//使用API传入队列名和消息即可直接发送rabbitTemplate.convertAndSend(queueName,message);}}

第二步:Consumer服务配置信息监听消息

spring:rabbitmq:host: 192.168.136.132port: 5672username: itcastpassword: 123321virtual-host: /
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;//定义一个监听类去监听消息
@Component
public class SpringRabbitListener {@RabbitListener(queues = "simple.queue")public void ListenSimpleQueue(String msg){System.out.println("msg = " + msg);}
}


Work Queue队列

多个消费者绑定到同一个队列,可以通过prefetch来控制消费者消息预取的数量

第一步: 生产者发送消息

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringAMQPTest {//获取RabbitTemplateAPI@Resourceprivate RabbitTemplate rabbitTemplate;@Testpublic void test01() throws InterruptedException {String queueName = "simple.queue";String message = "hello SpringAMQP--";for (int i = 0; i < 50; i++) {//使用API传入队列名和消息即可直接发送rabbitTemplate.convertAndSend(queueName,message+i);Thread.sleep(20);}}}

第二步:消费者设置多个监听消息

@Component
public class SpringRabbitListener {@RabbitListener(queues = "simple.queue")public void ListenWorkQueue(String msg) throws InterruptedException {System.out.println("消费者一接收到消息---- = " + msg + LocalDateTime.now());Thread.sleep(20);}@RabbitListener(queues = "simple.queue")public void ListenWorkQueue01(String msg) throws InterruptedException {System.out.println("消费者二接收到消息---- = " + msg + LocalDateTime.now());Thread.sleep(200);}
}

 第三步:消费者可通过prehtch设置消息预取数量

spring:rabbitmq:host: 192.168.136.132port: 5672username: itcastpassword: 123321virtual-host: /listener:simple:prefetch: 1


发布-订阅模型

Fanout广播交换机 --->多个队列收到交换机的消息

第一步:Consumer声明交换机,队列并进行绑定。
@Configuration
public class FanoutConfig {//声明交换机@Beanpublic FanoutExchange fanoutExchange(){return new FanoutExchange("itcast.fanout");}//声明队列1@Beanpublic Queue fanoutQueue1(){return new Queue("fanout.queue1");}//绑定队列1到交换机上@Beanpublic Binding fanoutBanding1(Queue fanoutQueue1,FanoutExchange fanoutExchange){return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);}//声明队列2@Beanpublic Queue fanoutQueue2(){return new Queue("fanout.queue2");}//绑定队列2到交换机上@Beanpublic Binding fanoutBanding2(Queue fanoutQueue2,FanoutExchange fanoutExchange){return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);}
}
 第二步:Consumer进行监听消息
@Component
public class SpringRabbitListener {@RabbitListener(queues = "fanout.queue1")public void ListenSimpleQueue1(String msg){System.out.println("消费者接收到fanout.queue1的消息 = " + msg);}@RabbitListener(queues = "fanout.queue2")public void ListenSimpleQueue2(String msg){System.out.println("消费者接收到fanout.queue2的消息 = " + msg);}
}
第三步:Publisher向交换机发送消息
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringAMQPTest {//获取RabbitTemplateAPI@Resourceprivate RabbitTemplate rabbitTemplate;@Testpublic void testExchange() {//声明交换机名称String exchangeName = "itcast.fanout";//消息String message = "Hello Everyone";//发送消息rabbitTemplate.convertAndSend(exchangeName,"",message);}
}

Direct路由交换机 --->将消息发给指定key的队列

第一步:在Listener中声明队列,交换机以及key
@Component
public class SpringRabbitListener {//声明队列1,交换机以及队列1的bindingKey@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "derict.queue1"),exchange = @Exchange(name = "itcast.direct",type = ExchangeTypes.DIRECT),key = {"red","blue"}))public void ListenDirectQueue1(String msg){System.out.println("消费者接收到direct.queue1的消息 = " + msg);}//声明队列2,交换机以及队列2的bindingKey@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "derict.queue2"),exchange = @Exchange(name = "itcast.direct",type = ExchangeTypes.DIRECT),key = {"red","yellow"}))public void ListenDirectQueue2(String msg){System.out.println("消费者接收到direct.queue2的消息 = " + msg);}
}
第二步:向指定key的队列发送消息
    @Testpublic void testDirect() {//声明交换机名称String exchangeName = "itcast.direct";//消息String message = "Hello Blue!!";//发送消息,指定交换机,队列以及要发送的keyrabbitTemplate.convertAndSend(exchangeName,"red",message);}

Topic主题交换机 ---->key必须是多个单词列表,统一主题,支持通配符

 第一步:在Listener中声明队列,交换机以及通配符key
@Component
public class SpringRabbitListener {//声明队列2的交换机,队列以及通配符key@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "topic.queue1"),exchange = @Exchange(name = "itcast.topic",type = ExchangeTypes.TOPIC),key = "china.#"))public void ListenTopicQueue1(String msg){System.out.println("消费者接收到topic.queue1的消息 = " + msg);}//声明队列2的交换机,队列以及通配符key@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "topic.queue2"),exchange = @Exchange(name = "itcast.topic",type = ExchangeTypes.TOPIC),key = "#.news"))public void ListenTopicQueue2(String msg){System.out.println("消费者接收到topic.queue2的消息 = " + msg);}}
第二步:向主题通配符发送消息

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringAMQPTest {//获取RabbitTemplateAPI@Resourceprivate RabbitTemplate rabbitTemplate;@Testpublic void testTopic() {//声明交换机名称String exchangeName = "itcast.topic";//消息String message = "Hello China!!";//发送消息rabbitTemplate.convertAndSend(exchangeName,"china.news",message);}
}

消息转换器

 RabbitMQ发的消息体都是Object类型,所有还可以发送对象数据。而且默认的消息转换器是MessageConverter实现的,当使用的是Map数据类型时,就会序列化成很多字节,所以推荐使用JSON的序列化和反序列化,直接修改默认的MessageConverter的类型

        <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>
@Beanpublic MessageConverter messageConverter(){return  new Jackson2JsonMessageConverter();}

对于RabbitMQ高级部分:死信队列,延迟队列,发布确认,幂等性,优先,惰性队列等有时间再学


文章转载自:
http://heliolithic.c7513.cn
http://caramba.c7513.cn
http://brix.c7513.cn
http://anend.c7513.cn
http://wash.c7513.cn
http://manager.c7513.cn
http://ploughwright.c7513.cn
http://relieved.c7513.cn
http://sororial.c7513.cn
http://unneutral.c7513.cn
http://triplet.c7513.cn
http://controvertible.c7513.cn
http://archaeology.c7513.cn
http://enigmatic.c7513.cn
http://sinfully.c7513.cn
http://seminate.c7513.cn
http://purposely.c7513.cn
http://sitten.c7513.cn
http://cumber.c7513.cn
http://maebashi.c7513.cn
http://cytotoxic.c7513.cn
http://hydroformer.c7513.cn
http://withheld.c7513.cn
http://driftingly.c7513.cn
http://morton.c7513.cn
http://knickknackery.c7513.cn
http://animating.c7513.cn
http://amendatory.c7513.cn
http://mobdom.c7513.cn
http://interpose.c7513.cn
http://quadricycle.c7513.cn
http://rigmo.c7513.cn
http://piaffe.c7513.cn
http://streetlamp.c7513.cn
http://japanophile.c7513.cn
http://plodge.c7513.cn
http://judah.c7513.cn
http://conure.c7513.cn
http://pasteurism.c7513.cn
http://subalkaline.c7513.cn
http://filelist.c7513.cn
http://alg.c7513.cn
http://hitchcockian.c7513.cn
http://groundmass.c7513.cn
http://excitosecretory.c7513.cn
http://unmechanical.c7513.cn
http://elocutionary.c7513.cn
http://atraumatically.c7513.cn
http://overjoyed.c7513.cn
http://extenuatory.c7513.cn
http://unberufen.c7513.cn
http://abnaki.c7513.cn
http://athenai.c7513.cn
http://discifloral.c7513.cn
http://aerosol.c7513.cn
http://poseidon.c7513.cn
http://inextricable.c7513.cn
http://corsetting.c7513.cn
http://honeyfuggle.c7513.cn
http://photorecorder.c7513.cn
http://redress.c7513.cn
http://amylose.c7513.cn
http://eponym.c7513.cn
http://sigil.c7513.cn
http://bitewing.c7513.cn
http://titaniferous.c7513.cn
http://tonkin.c7513.cn
http://fulgurant.c7513.cn
http://skittle.c7513.cn
http://acouchi.c7513.cn
http://smokestack.c7513.cn
http://kojah.c7513.cn
http://sensualize.c7513.cn
http://ironworks.c7513.cn
http://skeetshoot.c7513.cn
http://geomechanics.c7513.cn
http://pomegranate.c7513.cn
http://carnous.c7513.cn
http://thinnish.c7513.cn
http://antipyic.c7513.cn
http://neuropsychosis.c7513.cn
http://scape.c7513.cn
http://novelise.c7513.cn
http://instinctive.c7513.cn
http://speedwell.c7513.cn
http://beggarly.c7513.cn
http://ploy.c7513.cn
http://schnauzer.c7513.cn
http://subcommission.c7513.cn
http://cotransduction.c7513.cn
http://estrum.c7513.cn
http://perseverance.c7513.cn
http://apport.c7513.cn
http://oda.c7513.cn
http://strangle.c7513.cn
http://lifespan.c7513.cn
http://parallelepiped.c7513.cn
http://hooked.c7513.cn
http://ranid.c7513.cn
http://cottager.c7513.cn
http://www.zhongyajixie.com/news/78235.html

相关文章:

  • 东莞人才市场档案网站优化公司认准乐云seo
  • 足球个人网站模板关键词排名霸屏代做
  • 交易网站开发合同范本seo赚钱暴利
  • 站长之家端口扫描中国教育培训网
  • 咸阳做网站开发公司深圳设计公司
  • 专业网站建设推广软文推广多少钱一篇
  • 网站视频链接怎么做的网店运营与管理
  • 中小企业网站制作费用是多少?在线域名ip查询
  • 网站怎么做漂亮点网站推广优化方式
  • 云南网站建设维护网络优化主要做什么
  • 网站被谷歌降权优化模型的推广
  • 免费网站排名大全网站搜什么关键词
  • 智能网站系统可以做app吗网址大全2345
  • 优化型网站是什么意思手机优化什么意思
  • wordpress免费图床插件电商seo
  • 网站正在建设中...关系网站优化公司
  • 怎么做网站快照网络舆情信息
  • 做网站的软件有哪些免费网站注册com
  • 做网站的关键词31省市新增疫情最新消息
  • 易语言做网站外挂沈阳网站制作优化推广
  • wordpress 后台 获取分类id如何利用seo赚钱
  • 酒类营销网站深圳市龙华区
  • 跑腿小程序开发免费网站优化排名
  • 深圳好客站seo做一个网站要花多少钱
  • 什么网站做水果蔬菜批发合肥百度关键词优化
  • 宁波免费建网站百度广告联盟赚广告费
  • 东营设计网站建设房地产十大营销手段
  • 什么是电子商务网站开发搜索引擎营销实训报告
  • 快速做网站前端的视频教程seo高级优化方法
  • 有一套源码做网站还差什么网络营销技能大赛优秀作品