精华内容
下载资源
问答
  • 怎么 没人来呀 @中山野鬼###### 1、如果想去掉while(true),可以考虑通知实现;... 5、实在不行按照业务拆分成多模块,用redis 或mq扩展一下架构设计; ######回复 @OS小小小 : map =(Map)JSONObjec...

    怎么 没人来呀 @中山野鬼###### 1、如果想去掉while(true),可以考虑通知实现; 2、关于自动重连的问题,可以考虑重发送逻辑中抽离出来,采用心跳检测完成; 3、另外发送速率统计部分也应该抽离出来。 4、上多通道要考虑资源使用可控。 5、实在不行按照业务拆分成多模块,用redis 或mq类的扩展一下架构设计; ######回复 @OS小小小 : map =(Map)JSONObject.parse(SendMsgCMPP2ThredPoolByDB.ZhangYi.take()); 换成take,阻塞线程,试试。######回复 @OS小小小 : 1、通知只是告知队列里有新的数据需要处理了; 5、内存队列换成redis队列 实现成本增加,但是可扩展性增加;######1、通知实现的话 ,岂不是 无法保证 最少发送么,又会陷入另一个问题中 是吗? 或者是我的想法不对么? 2、嗯,这一块可以这样做。谢谢你 3、速率统计这里 我目前想不到怎么抽离、既可以控制到位,又可以保证不影响。。。 5、redis 是有的 但是 redis的队列的话 跟我这个 没啥区别吧,可能速度更快一点。######while(true) 里面 没数据最起码要休眠啊,不停死循环操作,又没有休眠cpu不高才怪######回复 @OS小小小 : 休眠是必须的,只是前面有数据进来,可以用wait notify 的思路通知,思路就是这样,CountDownLatch 之类多线程通讯也可以实现有数据来就能立即处理的功能######嗯,目前在测试 排除没有数据的情况,所以这一块没有去让他休眠,后面会加进去。 就针对于目前这种情况,有啥好办法吗###### 我的思路是:一个主线程,多个任务子线程。 主线程有一层while(true),这个循环是不断的扫描LinkedBlockingQueue是否有数据,有则交个任务子线程(也就是你这里定义的线程池)处理,而不是像你这样每个子任务线程都有一个while(true) ######这才是对的做法######嗯,这思路可以。谢谢哈######

    引用来自“K袁”的评论 我的思路是:一个主线程,多个任务子线程。 主线程有一层while(true),这个循环是不断的扫描LinkedBlockingQueue是否有数据,有则交个任务子线程(也就是你这里定义的线程池)处理,而不是像你这样每个子任务线程都有一个while(true)

    正确做法. 还有就是 LinkedBlockingQueue 本身阻塞的,while(true)没问题,主要在于不需要每个发送线程都去block######while(true)不加休眠就会这样###### java 的线程数量大致要和cpu数量一致,并不是越多越快,线程调度是很消耗时间的。要用好多线程,就需要设计出好的多线程业务模型,不恰当的sleep和block是性能的噩梦。利用好LinkedBlockingQueue,队列空闲时读队列的线程会释放cpu。利用消息触发后续线程工作,就没必要使用while(true)来不停的扫描。 ######@蓝水晶飞机 看到你要比牛逼,我就没有兴趣跟你说话了######回复 @不日小鸡 : 我就是装逼怎么啦,特么的装逼装出样子来的,起码也比你牛逼啊。######回复 @蓝水晶飞机 : 你说这话不能掩盖你没有回复我的问题又来回复我导致装逼失败的事实。 那你不是楼主你回复我干什么,还不是回答我的问题。 不要装逼了好么,装多就成傻逼了######回复 @不日小鸡 : 此贴楼主不是你,装什么逼。######回复 @王斌_ : 这些我都知道,我的意思是你这样回复可能会误导其他看帖子的人或者新手,让他们以为线程数就等于CPU数######

    引用来自“OS小小小”的评论 怎么 没人来呀

    @中山野鬼

    抬举我了。c++ 我还敢对不知深浅的人说,“权当我不懂”,java真心只是学过,没有实际工程上的经验。哈。而且我是c的思维,面对c适合的应用开发,是反对使用线程的。基本思维是,执行模块的生命周期不以任务为决定,同类的执行模块,可根据物理硬核数量,形成对应独立多个进程,但绝对不会同类的任务独立对应多个线程。哈。所以java这类面向线程的设计,没办法参与讨论。设计应用目标不同,系统组织策略自然有异。 唯一的建议是:永远不要依赖工具,特别是所谓的垃圾资源处理回收机制,无论它做的再好,一旦你依赖,必然你的代码,在不久的将来会因为系统设计规模的变大,而变的垃圾。哈。 听不懂的随便喷,希望听懂的,能记得这个观点,这不是我一个人的观点。

    ######给100万像素做插值运算进行染色特效,请问单线程怎么做比多线程快?###### @乌龟壳 : 几种方法都可以,第一是按照计算步骤,每个进程处理一个步骤,然后切换共享空间(这没有数据传递逻辑上的额外开销),就是流水思维。第二个是block的思维,同样的几个进程负责相同计算,但负责不同片区。同时存在另一类的进程是对前期并发处理完的工作进行边界处理。 你这个例子体现不出进程和线程的差异的。 如果非要考虑进程和线程在片内cache的差异,如果没记错(错了大家纠正哈),进程之间的共享是在二级缓存之间吧。即便线程能做到一级缓存之间的共享,但对于这种大批量像素的计算,用进程仍然是使用 dma,将数据成块载入一级缓存区域进行处理,而这个载入工作和计算工作是同步的。不会有额外太多的延迟。 你举的这个例子,还真好是我以前的老本行。再说了。像素计算,如今都用专用计算处理器了吧。还用x86或arm来处理,不累死啊。哈。 而且这种东西java不适合,同样的处理器,用c写,基本可以比java快1到2倍。因为c可以直接根据硬件特性和计算逻辑特点有效调度底层硬件驱动方式。而java即便你用了底层优化的官方库,仍然不能保证硬件与计算目标特性的高度整合。 ######回复 @中山野鬼 : 简单来说,你的多个进程处理结果进行汇总的时候,是不是要做内存复制操作?如果是多线程天然就不用,多进程用系统的共享内存机制也不用,问题是既然用了共享内存,和多线程就没区别了。######回复 @乌龟壳 : 两回事哦。共享空间是独立的,而线程如果我没记错,全局变量,包括文件内的(静态变量)是共享的。不同线程共享同一个进程内的变量嘛。这些和业务逻辑相关的东西,每个线程又是独立一套业务逻辑,针对c语言,这样去设计,不是没事找事嘛。面向对象语言,这块都帮你处理好了,自然没有关系。######既然有共享空间了,那你所说的进程和线程实际就是一回事了。###### @乌龟壳   ,数据分两种,一种和算法或处理相关的。一种是待处理的数据。 前者,不应该共享,后者属于数据加工流程,必然存在数据传递或流动,最低成本的传递/流动方式就是共享内存,交替使用权限的思路。 但这仅仅针对待加工的数据和辅助信息,而不针对程序本身。 进程不会搞混乱这些东西特别是(待加工数据的辅助信息),而线程,就各种乱吧。哈。 进程之间,虽然用共享空间,但它本质是数据传递/流动,当你采用多机(物理机器)并发处理时,进程移动到另外一个物理主机,则共享空间就是不能选择的传递/流动方式了。但线程就没有这些概念。 ######回复 @中山野鬼 : 是啊,java天然就不是像C一样对汇编的包装。######@乌龟壳 面向企业级的各种业务,java这些没问题的。而且更有优势,面向计算设备特性的设计开发,就不行了。哈。######回复 @中山野鬼 : 也算各有场景吧,java同样可以多进程可以分布式来降低多线程的风险。java也可以静态编译成目标机器码。总之事在人为。######回复 @乌龟壳 : 高手,啥都可以,低手,依赖这些,就是各种想当然。哈哈。######回复 @中山野鬼 : 那针对java的垃圾回收,这个东西是可以调节它算法的,不算依赖工具吧,哈。不然依赖C语言语法也算依赖工具咯。哈。;-p

    展开全文
  • 展开全部MQ Java Binding...MQSeries Java客户机服务器连接最快方式32313133353236313431303231363533e78988e69d8331333363353736MQ Java Binding方式,这种方式要求MQ Java应用和MQ Server在同一台机器上。使...

    展开全部

    MQ Java Binding方式使用JNI(Java Native Interface)类似于MQ 服务器应用程序。

    MQSeries Java客户机服务器连接最快的方式是32313133353236313431303231363533e78988e69d8331333363353736MQ Java Binding方式,这种方式要求MQ Java应用和MQ Server在同一台机器上。使用MQ Java Binding方式避免了建立网络连接的开销,因此,当连接对性能影响很大时,应当选用MQ Java Binding方式。

    MQ Java Client方式通过Server端定义的服务器连接通道连接,服务器方需要启动侦听程序。MQ Java Client方式用于Java客户程序和服务器不在同一台机器时进行连接。

    客户端连接,建立MQEnvironment类

    MQEnvironment.hostname

    以下是,客户端连接例子

    // ===========================================================================

    //

    // Licensed Materials - Property of IBM

    //

    // 5639-C34

    //

    // (c) Copyright IBM Corp. 1995,1999

    //

    // ===========================================================================

    // WebSphere MQ M'z Java f sample applet

    //

    // This sample runs as an applet using the appletviewer and HTML file,

    // using the command :-

    // appletviewer MQSample.html

    // Output is to the command line, NOT the applet viewer window.

    //

    // Note. If you receive WebSphere MQ error 2 reason 2059 and you are sure your

    // WebSphere MQ and TCP/IPsetup is correct,

    // you should click on the "Applet" selection in the Applet viewer window

    // select properties, and change "Network access" to unrestricted.

    import com.ibm.mq.*; // Include the WebSphere MQ classes for Java package

    public class MQSample extends java.applet.Applet

    {

    private String hostname = "your_hostname"; // define the name of your

    // host to connect to

    private String channel = "server_channel"; // define name of channel

    // for client to use

    // Note. assumes WebSphere MQ Server

    // is listening on the default

    // TCP/IPport of 1414

    private String qManager = "your_Q_manager"; // define name of queue

    // manager object to

    // connect to.

    private MQQueueManager qMgr; // define a queue manager object

    // When the class is called, this initialization is done first.

    public void init()

    {

    // Set up WebSphere MQ environment

    MQEnvironment.hostname = hostname; // Could have put the

    // hostname & channel

    MQEnvironment.channel = channel; // string directly here!

    MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY,//Set TCP/IPor server

    MQC.TRANSPORT_MQSERIES);//Connection

    } // end of init

    public void start()

    {

    try {

    // Create a connection to the queue manager

    qMgr = new MQQueueManager(qManager);

    // Set up the options on the queue we wish to open...

    // Note. All WebSphere MQ Options are prefixed with MQC in Java.

    int openOptions = MQC.MQOO_INPUT_AS_Q_DEF |

    MQC.MQOO_OUTPUT ;

    // Now specify the queue that we wish to open, and the open options...

    MQQueue system_default_local_queue =

    qMgr.accessQueue("SYSTEM.DEFAULT.LOCAL.QUEUE",

    openOptions);

    // Define a simple WebSphere MQ message, and write some text in UTF format..

    MQMessage hello_world = new MQMessage();

    hello_world.writeUTF("Hello World!");

    // specify the message options...

    MQPutMessageOptions pmo = new MQPutMessageOptions(); // accept the defaults,

    // same as

    // MQPMO_DEFAULT

    // constant

    // put the message on the queue

    system_default_local_queue.put(hello_world,pmo);

    // get the message back again...

    // First define WebSphere MQ message buffer to receive the message into..

    MQMessage retrievedMessage = new MQMessage();

    retrievedMessage.messageId = hello_world.messageId;

    // Set the get message options..

    MQGetMessageOptions gmo = new MQGetMessageOptions(); // accept the defaults

    // same as

    // MQGMO_DEFAULT

    // get the message off the queue..

    system_default_local_queue.get(retrievedMessage, gmo);

    // And prove we have the message by displaying the UTF message text

    String msgText = retrievedMessage.readUTF();

    System.out.println("The message is: " + msgText);

    // Close the queue

    system_default_local_queue.close();

    // Disconnect from the queue manager

    qMgr.disconnect();

    }

    // If an error has occurred in the above, try to identify what went wrong.

    // Was it WebSphere MQ error?

    < 1. WebSphere MQ classes for Java >} applet (2/3)

    >}zk

    62 WebSphere MQ 9C Java

    >}

    TBzkN]>;vr%D&CLr,|9Cs(==:

    1. ,S=SP\mw

    2. +{"Ek SYSTEM.DEFAULT.LOCAL.QUEUE

    3. YN!5XD{"

    catch (MQException ex)

    {

    System.out.println("WebSphere MQ error occurred : Completion code " +

    ex.completionCode +

    " Reason code " + ex.reasonCode);

    }

    // Was it a Java buffer space error?

    catch (java.io.IOException ex)

    {

    System.out.println("An error occurred whilst writing to the

    message buffer: " + ex);

    }

    } // end of start

    } // end of sample

    本回答由提问者推荐

    2Q==

    已赞过

    已踩过<

    你对这个回答的评价是?

    评论

    收起

    展开全文
  • 所以你说的是,一个不停add数据,一个不停get数据,但这样有一个问题,如果你数据添加过慢或过快,或者数据处理过慢或过快,都会出现队列空或者队列满情况,这种情况一旦出现,意味着一方要等另一方完成...

    62ba45842b374d39e7db782c0ed8bd42.png

    繁星点点滴滴

    一般数据的放和收对应的是2个线程或进程,以达到异步的目的使得吞吐量最大化。所以你说的是对的,一个不停的add数据,一个不停的get数据,但这样有一个问题,如果你数据添加过慢或过快,或者数据处理的过慢或过快,都会出现队列空或者队列满的情况,这种情况一旦出现,意味着一方要等另一方完成动作才能继续,降低吞吐量,所以一般是会有一个超时返回的。下面一个是无超时的消息队列getpublic Message receive() throws InterruptedException {                synchronized (queue) {                        if(queue.isEmpty()){                queue.wait(1000);            }            if(queue.isEmpty()){                return null;//timeout            }            Message message=queue.get(0);            queue.remove(0);            return message;        }    }

    展开全文
  • 还是有别的什么方式?已经搞好了,写了个死循环,谢谢各位。假设你单机模式下while(true){object obj = queue.take();//这里会阻塞//去做别处理}一般数据放和收对应的是2个线程或进程,以达到异步目的使得...

    我现在想做一个消息队列,一边在不停的放数据,一边在不停的take,怎么保证这个take一直在执行?,是不是要写一个死循环的?还是有别的什么方式?

    已经搞好了,写了个死循环,谢谢各位。

    假设你是单机模式下

    while(true){

    object obj = queue.take();//这里会阻塞的

    //去做别的处理

    }

    一般数据的放和收对应的是2个线程或进程,以达到异步的目的使得吞吐量最大化。所以你说的是对的,一个不停的add数据,一个不停的get数据,但这样有一个问题,如果你数据添加过慢或过快,或者数据处理的过慢或过快,都会出现队列空或者队列满的情况,这种情况一旦出现,意味着一方要等另一方完成动作才能继续,降低吞吐量,所以一般是会有一个超时返回的。

    下面一个是无超时的消息队列get

    public Message receive() throws InterruptedException {

    synchronized (queue) {

    if(queue.isEmpty()){

    queue.wait(1000);

    }

    if(queue.isEmpty()){

    return null;//timeout

    }

    Message message=queue.get(0);

    queue.remove(0);

    return message;

    }

    }

    展开全文
  • 什么是消息队列消息队列属于进程间通信一种方式,使用消息队列可以通过异步方式处理数据,借此可以提高系统性能。我们可以把消息当作存放数据容器,消息消费者可以从队列中获取数据,进行处理。常见消息队列...
  • 如果采用在MQ资源管理器中插入测试消息或者是通过另外一台MQ服务器往当前MQ服务器通过远程队例写消息过来,通过JAVA读取出会错,我这里疑点有两个:1、通过MQ资源管理器放入消息编码是什么?是否在读消息时候...
  • MQ什么用?MQ的优点和缺点都有哪些?开始今天起,我们会陆续开始一些新文章系列,和Spring系列并行。学习,也要换换脑子,一天天看源码,万一看吐子怎么办?隔壁小妹妹会嫌弃我。啥MQA:你能给我解释了...
  • 我们有一个日常工作,通过JMS连接到Websphere MQ并检索一组记录.此作业使用开箱即用JMS ItemReader.我们实现了自己ItemProcessor,但它除了记录之外没有做任何特殊事情.没有应该影响传入记...
  • 如果是通过JAVA将消息写入到MQ,再通过JAVA去读取消息,采用MQMessage读消息方法readUTF()去读取时候,就不会...1、通过MQ资源管理器放入消息编码是什么?是否在读消息时候需要指定读消息编码?我通过...
  • java调用MQ jms通讯取消息慢问题用java语言开发系统用到MQ,以前测试都正常今天客户返回有时候交易返回3秒以上有点慢,大多数情况下正常,然后本人测试发现每发一笔交易然后停顿2秒后在发第二笔交易,发多笔后,总...
  • 概述Redis不仅可作为缓存服务器,还...订阅者表示对一个或多个主题感兴趣,只接收感兴趣消息,而不知道(如果有话)发布者是什么。发布者和订阅者这种解耦可以实现更大可伸缩性和更动态网络拓扑。代码实现re...
  • 先来说一说我们为什么要用这个东西...Java中对Jms有了定义,这是Java消息统一接口。什么是ActiveMq呢?这这个接口一种实现,相当于数据库连接驱动一样,不同厂商有自己不同实现,我们尽快看怎么用代码实现吧...
  • Java Interview(MQ)

    2021-03-22 20:01:10
    MQ是一个FIFO队列:一端连接生产者,一端连接消费者; 优点: 异步:实现异步消息发送,提高系统吞吐量和响应速度 解耦:减少服务之间影响,提高系统稳定性和课扩展性 削峰:以稳定系统资源应对突发...
  • 1.消息队列(MQ啥? 1)消息队列一种跨进程通信机制,具有单向传递、单向依赖和异步处理特性,主要解决多个系统间消息异步、业务解耦、流量削峰等问题。 2)消息队列从字面上意思Message+Queue。...
  • 前言小伙伴们,国庆都过开心吗?...消费者组首先我们了解一个概念,什么是消费者组。消费者组你就可以把它理解为,给一组消费者起一个名字。假设我们有一个订单Topic名字OrderTopic,然后库存系统和积分系统都要...
  • 什么使用 MQ?在这里我就不多说了,无非就是削峰、解耦和异步。这里没有很多关于 MQ 理论和概念,只想手把手带你一起学习 RabbitMQ 六大使用模式!一、普通队列我们发送消息和接收消息时,只需要直接指定队列...
  • MySQL相关1、Mysql技术特点是什么?2、Heap表是什么?3、Mysql服务器默认端口是什么?4、与Oracle相比,Mysql有什么优势?5、如何区分FLOAT和DOUBLE?6、如何获取当前Mysql版本?7、Mysql中使用什么存储引擎?8...
  • 现在java分布式项目中,MQ基本都必备消息中间件。或许你曾接触过RabbitMQ, RocketMQ, Kafka, ActiveMQ。或许你只是对这些有所耳闻。今天,简单总结一下关于MQ的作用MQ的作用系统解耦异步调用流量削峰系统解耦...
  • 至于RockeMQ是什么,原理架构什么这里就不赘述了,这里只记录安装过程。一、系统环境service操作系统:centOS7 64位虚拟机JDK:1.7以上client操作系统:Windows 7 64位旗舰版1.1 安装Linux笔者在此安装是最小化...
  • 一、什么是ActiveMQ百度解释:ActiveMQ Apache出品,最流行,能力强劲开源消息总线。ActiveMQ 一个完全支持JMS1.1和J2EE 1.4规范 JMS Provider实现,尽管JMS规范出台已经很久事情了,但是JMS在当今...
  • 什么是消息队列消息队列属于进程间通信一种方式,使用消息队列可以通过异步方式处理数据,借此可以提高系统性能。我们可以把消息当作存放数据容器,消息消费者可以从队列中获取数据,进行处理。常见消息队列...
  • Java面试题 MQ消息队列

    千次阅读 2019-07-17 22:09:13
    消息队列(Message Queue,简称MQ),从字面意思上看,本质个队列,FIFO先入先出,只不过队列中存放内容message而已。其主要用途:不同进程Process/线程Thread之间通信。 2:为什么会产生消息队列? 1)不同...
  • 1.RabbitMq队列模式 2.RabbitMq工作队列模式 3.RabbitMq发布订阅模式-Fanout模式 什么是发布订阅fanout模式?fanout模式又称广播模式即就是在交换机接收到消息后向队列中发送消息没有任何规则,...
  • 什么使用MQ? 文章引用地址: 感谢前辈分享 ... 为什么使用MQ?...我们使用MQ为了我们业务,因为业务上有个什么场景,因此使用了MQMQ中进场使用三种场景,解耦,异步,削峰 首先...
  • 什么是JMS(记住不是一个协议,只是一个规范)Java消息服务(Java Message Service)即JMS,一个Java平台中关于面向消息中间件API,用于两个应用程序之间,或者分布式系统中发送消息,进行异步通信.它便于消息系统中...
  • ibm mq Oracle公司近九年前完成了收购Sun Microsystems过程。 那当时大新闻,今天也宣布了类似...” 这项宣布收购很可能会使许多Java开发人员想知道Java生态系统将要发生什么变化。 自从Oracle收购Sun ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 539
精华内容 215
关键字:

java的mq是什么

java 订阅