使用ActiveMQ的Topic模式,生产者生产了两条消息,队列中有两条消息,消费者只消费一条就不再消费了

1、问题:使用ActiveMQ的Topic模式,消息队列中有两条消息,消费者只消费一条消息就不再消费了?
代码如下:
生产者代码

package com.babi.common.utils;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.Topic;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

/*
 * ACtiveMQ生产者
 * 
 */
public class UpgradeQMSender {
    // MQname
    private static final String MESSAGE_QUEUE = "mopark-upgrade";

    // 默认的ActiveMQ服务器端绑定的端口。
    private static final int PORT = 61616;


    /**
     * MQ发送消息
     * 
     * @param state
     * @param deviceID
     * @param versionId
     */
    public static void sendupgrade(String state, String deviceID, String versionId) {

        // ConnectionFactory :连接工厂,JMS 创建连接
        ConnectionFactory connectionFactory;

        // Connection :JMS 客户端到JMS Provider 的连接
        Connection connection = null;

        // Session: 一个发送或接收消息的线程
        Session session;

        // Destination :消息的目的地
        Topic topic;

        // MessageProducer:消息生产者。
        MessageProducer producer;

        // 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar
        connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
                ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:" + PORT);

        try {
            // 构造从工厂得到连接对象
            connection = connectionFactory.createConnection();

            // 启动
            connection.start();

            // 获取操作连接
            session = connection.createSession(Boolean.TRUE.booleanValue(), Session.AUTO_ACKNOWLEDGE);

            // 获取session注意参数值 liwenhui 是一个服务器的queue,须在在ActiveMq的console配置
            // destination = session.createQueue(MESSAGE_QUEUE);

            // 创建消息 
            topic = session.createTopic(MESSAGE_QUEUE);

            // 得到消息生成者,发送者
            producer = session.createProducer(topic);

            // 设置不持久化
            producer.setDeliveryMode(DeliveryMode.PERSISTENT);

            // 设置消息过期时间
            producer.setTimeToLive(1000 * 10 * 60);

            CommonLog.info(UpgradeQMSender.class, "state:" + state);
            CommonLog.info(UpgradeQMSender.class, "deviceID:" + deviceID);

            // 发送消息。
            sendupgradeMessage(session, producer, state, deviceID, versionId);

            session.commit();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != connection)
                    connection.close();
            } catch (Throwable ignore) {
            }
        }
    }

    /**
     * MQ调用方法
     * 
     * @param session
     * @param producer
     * @param state
     * @param deviceID
     * @param versionId
     */
    public static void sendupgradeMessage(Session session, MessageProducer producer, String state, String deviceID,
            String versionId) {
        MapMessage message = null;
        try {
            message = session.createMapMessage();
            message.setString("state", state);
            message.setString("deviceID", deviceID);
            message.setString("versionId", versionId);
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 发送消息到目的地方
        try {
            System.out.println(message);
            producer.send(message);
            CommonLog.info(UpgradeQMSender.class, "消息内容:" + message);
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

消费者代码:

package com.babi.lockservice;

import java.io.File;
import java.io.RandomAccessFile;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.Topic;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.ActiveMQPrefetchPolicy;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import org.springframework.jms.listener.DefaultMessageListenerContainer;

import com.babi.bean.Device;
import com.babi.common.CommonLog;
import com.babi.common.Params;
import com.babi.common.FileUpload.FileUploadFile;
import com.babi.common.FileUpload.FileUploadServer;
import com.babi.common.FileUpload.Filespilt;
import com.babi.common.FileUpload.RemoteFile;
import com.babi.dao.JedisUtils;
import com.babi.dao.LockDAO;

import io.netty.channel.ChannelHandlerContext;
import redis.clients.jedis.Jedis;

public class UpgradeConsumer {
    String LOCKKEY = null; // lockID:lockID
    LockDAO lockdao = new LockDAO(); // 数据库
    Device device = new Device(); // 车锁bean
    JedisUtils jedisUtils = new JedisUtils(); // redis工具类
    public RandomAccessFile randomAccessFile;
    FileUploadFile fileUploadFile;

    public void QMConsumer() throws JMSException {
        Connection connection = null; // 连接
        Session session = null; // 会话:接受或者发送消息的线程
        MessageConsumer consumer = null; // 消息接收者

        CommonLog.info(this.getClass(), "MQ消费者启动中......");
        try {
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
                    ActiveMQConnection.DEFAULT_PASSWORD, Params.MQ_HOST + ":" + Params.MQ_PORT);
            connection = connectionFactory.createConnection();

            connection.start();
            session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
            Topic topic = session.createTopic(Params.UPGRADEMQ_NAME);
            consumer = session.createConsumer(topic);
        } catch (Exception e) {
            throw new RuntimeException("创建MQ连接时发生了错误!");
        }
        try {
            // 注册监听器,注册后,列队的消息变化会自动触发监听器,接收消息并处理
                consumer.setMessageListener(new MessageListener() {
                    @Override
                    public void onMessage(Message message) {
                        try {
                            MapMessage mapMessage = (MapMessage) message;
                            if (mapMessage != null) {
                                message.acknowledge();
                                String action = mapMessage.getString("state");
                                String LOCKID = mapMessage.getString("deviceID");
                                String VersionId = mapMessage.getString("versionId");
                                LOCKKEY = "LOCK:" + LOCKID;
                                // 处理MQ发来的消息
                                if (LOCKID != null) {
                                    System.out.println("来自API的下行指令:action=" + action + ", LOCKID=" + LOCKID + ", imei="
                                            + lockdao.findImeiByLockId(LOCKID));
                                    CommonLog.info(this.getClass(), "来自API的下行指令:action=" + action + ", LOCKID=" + LOCKID
                                            + ", imei=" + lockdao.findImeiByLockId(LOCKID));
                                    jedisUtils.setutils(LOCKKEY, "LOCKACK", "FALSE");
                                    jedisUtils.setutils(LOCKKEY, "CMDSTATUS", " ");
                                    ChannelHandlerContext ctx = OSMap2Node.channelMap.get(LOCKID);

                                    if (action.equals(Integer.toString(SERVERCMD.LOCKUPGRADE.getIndex()))) {
                                        String FileUrl = download(VersionId);// 根据VersionId查找固件下载地址
                                        System.out.println("FileUrl" + FileUrl);
                                        String file_name = RemoteFile.downRemoteFile(FileUrl, "firmwareVersion");// 获取下载之后文件的保存的路径
                                        sendFileToLock(ctx, file_name);
                                    }
                                }

                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                    }
                });
//          }
        } catch (Exception e) {
            throw new RuntimeException("MQ接收消息并处理时发生了错误!");
        }

    }

    /**
     * 发送文件
     * 
     * @param ctx
     * @param file_name
     * @throws Exception
     */
    protected void sendFileToLock(ChannelHandlerContext ctx, String file_name) throws Exception {
        System.out.println("sendFileToLock" + file_name);
        File file = new File("./" + file_name);
        new Filespilt().split(file, ctx);

    }

    /**
     * 根据版本Id查找下载地址
     * 
     * @param VersionId
     * @return
     * @throws Exception
     */
    public String download(String VersionId) throws Exception {
        SqlRowSet rowSet = lockdao.findAddressByVersion(VersionId);
        String url = null;
        if (rowSet.next()) {
            url = rowSet.getString("download_address");
        }
        return url;
    }
}
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
ACTIVEMQ Topic消息 生产者 发布消息后 消费者收不到消息

<p> </p> <pre name="code" class="java">生产者 public class Producer { public static void main(String[] args) throws JMSException { ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); Connection connection = factory.createConnection(); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ActiveMQTopic topic= new ActiveMQTopic("testTopic"); MessageProducer producer = session.createProducer(topic); producer.setDeliveryMode(DeliveryMode.PERSISTENT); for(int i=0; i&lt;10; i++){ TextMessage message = session.createTextMessage(); message.setText("message_" + System.currentTimeMillis()); producer.send(message); System.out.println("Sent message: " + message.getText()); } // session.close(); // connection.stop(); // connection.close(); } } 发布消息的结果 Sent message: message_1341915173083 Sent message: message_1341915173085 Sent message: message_1341915173085 Sent message: message_1341915173086 Sent message: message_1341915173086 Sent message: message_1341915173086 Sent message: message_1341915173087 Sent message: message_1341915173087 Sent message: message_1341915173088 Sent message: message_1341915173088 消费者 public class Consumer { public static void main(String[] args) throws JMSException { ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); Connection connection = factory.createConnection(); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ActiveMQTopic topic= new ActiveMQTopic("testTopic"); // javax.jms.Topic topic = session.createTopic("myTopic.messages"); MessageConsumer consumer = session.createConsumer( topic); consumer.setMessageListener(new MessageListener() { public void onMessage(Message message) { TextMessage tm = (TextMessage) message; try { System.out.println("Received message: " + tm.getText()); } catch (JMSException e) { e.printStackTrace(); } } }); MessageConsumer comsumer2 = session.createConsumer(topic); comsumer2.setMessageListener(new MessageListener(){ public void onMessage(Message message) { TextMessage tm = (TextMessage) message; try { System.out.println("Received message: " + tm.getText()); } catch (JMSException e) { e.printStackTrace(); } } }); // session.close(); // connection.stop(); // connection.close(); } } <span>消费者运行程序后后获取不到生产者发布的消息,初识 ActiveMQ不太熟悉, 求解答</span></pre>   <p> </p>

activeMQ异步,订阅模式,如何解决消息丢失和重发

我们现在在做一个商城项目;使用activeMQ完成系统之间的信息同步,实用异步发 送,发布订阅模式,因为异步,所以使用的事listener监听,这样如果我配置消息 持久化,问题如下: 1. consumer返回给broker的ackknowldge是在onmessage方法后,所以不 会存在消息丢失,对吗? 2. 如果consumer在接收到消息但是未给broker应答,consumer宕机了,默认重发 数是6次,如果我consumer一直宕机,broker会在发送第一条发现连接不上的时候停止发送,还是一直发完6次?最后消息又会怎样? 3. 我的消息都比较重要,不允许丢失,要怎么处理? 各位大哥,我已经看各种博文两天两夜了,实在理解总结不了,请帮忙解惑,不要丢给我一堆连接叫我看,谢谢!

activemq中的topic队列在删除队列后消费者依然能够接收到请求

我在jmeter中对一个http接口进行了一百次请求![图片说明](https://img-ask.csdn.net/upload/202001/09/1578569643_727542.png) ![图片说明](https://img-ask.csdn.net/upload/202001/09/1578570841_912688.png) 接口如下: ``` java @GetMapping("send") public void send(String msg) { // 指定消息发送的目的地及内容 System.out.println(new Date().toString()); queueMessageService.setTopic("topic",msg); } ``` 调用的Bean ``` java @Component public class QueueMessageService { @Autowired private JmsMessagingTemplate jmsMessagingTemplate; public void setQueue(String queue,String msg){ jmsMessagingTemplate.convertAndSend(new ActiveMQQueue(queue),msg); } public void setTopic(String topic,String msg) { jmsMessagingTemplate.convertAndSend(new ActiveMQTopic(topic),msg); } } ``` 我使用了两个消费者用于接收请求 ```java @JmsListener(destination = "topic") public void receiveMessage(String message) throws InterruptedException { Thread.sleep(4000); System.out.println(hfnsTermService.getCount()); System.out.println(new Date().toString()+"topic接收:"+message); } @JmsListener(destination = "topic") public void readResponse(String message) throws InterruptedException { Thread.sleep(1000); for(HfnsTerm hfnsTerm:hfnsTermService.getHfnsTerm()){ System.out.println(hfnsTerm.getId()); } System.out.println(new Date().toString()+"topic1接收:"+message); } ``` ![图片说明](https://img-ask.csdn.net/upload/202001/09/1578570403_712572.png) ![图片说明](https://img-ask.csdn.net/upload/202001/09/1578570672_991950.png) 当我在请求还没完全接收完时在activemq控制台把topic队列进行了删除操作 ![图片说明](https://img-ask.csdn.net/upload/202001/09/1578570549_153369.png) 此时activemq中是没有topic队列的,但是我依然能够接收到topic队列中的消息 ![图片说明](https://img-ask.csdn.net/upload/202001/09/1578570782_702718.png) 请问这是为什么?

activemq 实现多个生产者 多个消费者 同时操作一个队列应该怎么弄 求指导

activemq 实现多个生产者 多个消费者 同时操作一个队列应该怎么弄 求指导

ActiveMQ怎么实现多个生产者向一个队列目标发送信息?求教,最好有代码demo

ActiveMQ怎么实现多个生产者向一个队列目标发送信息?求教,最好有代码demo

求解决:ActiveMQ在发布订阅模式下会递增式的重复接收消息

求解决:ActiveMQ在发布订阅模式下有多个consumer,consumer会递增式的重复接收消息 问题:springboot集成ActiveMQ实现了消费队列和发布订阅两种消息类型,发布订阅模式下有TopicConsumer1和TopicConsumer2,监听的destination都是alarm.topic,但这两个consumer会递增式的重复接收消息。我的实现代码如下: ------------------------------------------------------------- test入口类 @RunWith(SpringRunner.class) @SpringBootTest(classes = MessageCenterApplication.class) public class ActivemqTest { @Autowired private Producer producer; @Test public void testSendTopicMessage(){ for (int i = 0; i < 5; i++) { producer.sendTopicMessage(Destinations.ALARM_TOPIC, "here is a topic message, the number is " + i); } } /*输出结果如下,这个输出结果不是我所期望的 TopicConsumer1接收到的消息内容为:here is a topic message, the number is 0 TopicConsumer2接收到的消息内容为:here is a topic message, the number is 0 TopicConsumer2接收到的消息内容为:here is a topic message, the number is 1 TopicConsumer1接收到的消息内容为:here is a topic message, the number is 1 TopicConsumer2接收到的消息内容为:here is a topic message, the number is 1 TopicConsumer1接收到的消息内容为:here is a topic message, the number is 1 TopicConsumer2接收到的消息内容为:here is a topic message, the number is 2 TopicConsumer1接收到的消息内容为:here is a topic message, the number is 2 TopicConsumer2接收到的消息内容为:here is a topic message, the number is 2 TopicConsumer1接收到的消息内容为:here is a topic message, the number is 2 TopicConsumer2接收到的消息内容为:here is a topic message, the number is 2 TopicConsumer1接收到的消息内容为:here is a topic message, the number is 2 TopicConsumer2接收到的消息内容为:here is a topic message, the number is 3 TopicConsumer1接收到的消息内容为:here is a topic message, the number is 3 TopicConsumer2接收到的消息内容为:here is a topic message, the number is 3 TopicConsumer1接收到的消息内容为:here is a topic message, the number is 3 TopicConsumer2接收到的消息内容为:here is a topic message, the number is 3 TopicConsumer1接收到的消息内容为:here is a topic message, the number is 3 TopicConsumer2接收到的消息内容为:here is a topic message, the number is 3 TopicConsumer1接收到的消息内容为:here is a topic message, the number is 3 TopicConsumer2接收到的消息内容为:here is a topic message, the number is 4 TopicConsumer1接收到的消息内容为:here is a topic message, the number is 4 TopicConsumer2接收到的消息内容为:here is a topic message, the number is 4 TopicConsumer1接收到的消息内容为:here is a topic message, the number is 4 TopicConsumer2接收到的消息内容为:here is a topic message, the number is 4 TopicConsumer1接收到的消息内容为:here is a topic message, the number is 4 TopicConsumer2接收到的消息内容为:here is a topic message, the number is 4 TopicConsumer1接收到的消息内容为:here is a topic message, the number is 4 TopicConsumer2接收到的消息内容为:here is a topic message, the number is 4 TopicConsumer1接收到的消息内容为:here is a topic message, the number is 4*/ } ------------------------------------------------------------- Producer实现类 @Component public class Producer { @Autowired @Qualifier("jmsQueueMessagingTemplate") private JmsMessagingTemplate jmsQueueMessagingTemplate; @Autowired @Qualifier("jmsTopicMessagingTemplate") private JmsMessagingTemplate jmsTopicMessagingTemplate; /** * 使用queue消息类型(点对点) */ public void sendQueueMessage(String destination, final String message){ Queue queue = new ActiveMQQueue(destination); jmsQueueMessagingTemplate.convertAndSend(queue, message); } /** * 使用topic消息类型 */ public void sendTopicMessage(String destination, final String message){ Topic topic = new ActiveMQTopic(destination); jmsTopicMessagingTemplate.convertAndSend(topic, message); } } ------------------------------------------------------------- TopicConsumer1和TopicConsumer2的实现代码 @Component public class TopicConsumer1 { @JmsListener(destination = Destinations.ALARM_TOPIC, containerFactory = "jmsListenerContainerFactory4Topic") public void receive(String message){ System.out.println("TopicConsumer1接收到的消息内容为:" + message); } } @Component public class TopicConsumer2 { @JmsListener(destination = Destinations.ALARM_TOPIC, containerFactory = "jmsListenerContainerFactory4Topic") public void receive(String message){ System.out.println("TopicConsumer2接收到的消息内容为:" + message); } } ------------------------------------------------------------- jmsTopicMessagingTemplate对应的bean的配置 @Configuration public class JmsMessagingConfig { @Autowired @Qualifier(value = "jmsQueueTemplate") private JmsTemplate jmsQueueTemplate; @Autowired @Qualifier(value = "jmsTopicTemplate") private JmsTemplate jmsTopicTemplate; @Bean(name = "jmsQueueMessagingTemplate") public JmsMessagingTemplate jmsQueueMessagingTemplate(){ return new JmsMessagingTemplate(jmsQueueTemplate); } @Bean(name = "jmsTopicMessagingTemplate") public JmsMessagingTemplate jmsTopicMessagingTemplate(){ return new JmsMessagingTemplate(jmsTopicTemplate); } } ------------------------------------------------------------ jmsTopicTemplate对应的bean的配置 @Configuration public class JmsConfig { private final JmsProperties jmsProperties; private final ObjectProvider<DestinationResolver> destinationResolver; private final ObjectProvider<MessageConverter> messageConverter; public JmsConfig(JmsProperties jmsProperties, ObjectProvider<DestinationResolver> destinationResolver, ObjectProvider<MessageConverter> messageConverter) { this.jmsProperties = jmsProperties; this.destinationResolver = destinationResolver; this.messageConverter = messageConverter; } @ConfigurationProperties(prefix = "spring.activemq") @Bean(name = "jmsQueueTemplate") @Primary public JmsTemplate jmsQueueTemplate(PooledConnectionFactory pooledConnectionFactory) { JmsTemplate template = new JmsTemplate(pooledConnectionFactory); // 设置为使用queue消息类型 template.setPubSubDomain(false); DestinationResolver destinationResolver = (DestinationResolver) this.destinationResolver.getIfUnique(); if (destinationResolver != null) { template.setDestinationResolver(destinationResolver); } MessageConverter messageConverter = (MessageConverter) this.messageConverter.getIfUnique(); if (messageConverter != null) { template.setMessageConverter(messageConverter); } // deliveryMode, priority, timeToLive 的开关,要生效,必须配置为true,默认false template.setExplicitQosEnabled(true); // DeliveryMode.NON_PERSISTENT=1:非持久 ; DeliveryMode.PERSISTENT=2:持久 template.setDeliveryMode(DeliveryMode.PERSISTENT); // 默认不开启事务 // 如果不启用事务,则会导致XA事务失效; // 作为生产者如果需要支持事务,则需要配置SessionTransacted为true template.setSessionTransacted(true); return template; } @ConfigurationProperties(prefix = "spring.activemq") @Bean(name = "jmsTopicTemplate") public JmsTemplate jmsTopicTemplate(PooledConnectionFactory pooledConnectionFactory) { JmsTemplate template = new JmsTemplate(pooledConnectionFactory); // 设置为使用topic消息类型 template.setPubSubDomain(true); DestinationResolver destinationResolver = (DestinationResolver) this.destinationResolver.getIfUnique(); if (destinationResolver != null) { template.setDestinationResolver(destinationResolver); } MessageConverter messageConverter = (MessageConverter) this.messageConverter.getIfUnique(); if (messageConverter != null) { template.setMessageConverter(messageConverter); } // deliveryMode, priority, timeToLive 的开关,要生效,必须配置为true,默认false template.setExplicitQosEnabled(true); // DeliveryMode.NON_PERSISTENT=1:非持久 ; DeliveryMode.PERSISTENT=2:持久 template.setDeliveryMode(DeliveryMode.PERSISTENT); // 默认不开启事务 // 如果不启用事务,则会导致XA事务失效; // 作为生产者如果需要支持事务,则需要配置SessionTransacted为true template.setSessionTransacted(true); return template; } @ConfigurationProperties(prefix = "spring.activemq") @Bean(name = "jmsListenerContainerFactory4Topic") public DefaultJmsListenerContainerFactory jmsListenerContainerFactory4Topic(PooledConnectionFactory pooledConnectionFactory) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(pooledConnectionFactory); // 设置为使用topic消息类型 factory.setPubSubDomain(true); //如果单独配置了分布式事务,则启用 // if (this.transactionManager != null) { // factory.setTransactionManager(transactionManager); // } else { factory.setSessionTransacted(Boolean.valueOf(true)); // } JmsProperties.Listener listener = jmsProperties.getListener(); factory.setAutoStartup(listener.isAutoStartup()); if (listener.getAcknowledgeMode() != null) { factory.setSessionAcknowledgeMode(Integer.valueOf(listener.getAcknowledgeMode().getMode())); } String concurrency = listener.formatConcurrency(); if (concurrency != null){ factory.setConcurrency(concurrency); } return factory; } @ConfigurationProperties(prefix = "spring.activemq") @Bean(name = "jmsListenerContainerFactory4Queue") public DefaultJmsListenerContainerFactory jmsListenerContainerFactory4Queue(PooledConnectionFactory pooledConnectionFactory) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(pooledConnectionFactory); // 设置为使用queue消息类型 factory.setPubSubDomain(false); //如果单独配置了分布式事务,则启用 // if (this.transactionManager != null) { // factory.setTransactionManager(transactionManager); // } else { factory.setSessionTransacted(Boolean.valueOf(true)); // } JmsProperties.Listener listener = jmsProperties.getListener(); factory.setAutoStartup(listener.isAutoStartup()); if (listener.getAcknowledgeMode() != null) { factory.setSessionAcknowledgeMode(Integer.valueOf(listener.getAcknowledgeMode().getMode())); } String concurrency = listener.formatConcurrency(); if (concurrency != null){ factory.setConcurrency(concurrency); } return factory; } } -------------------------------------------------------------------------------------- yml配置文件的配置 spring: #jms配置,配合activemq一起配置 jms: listener: concurrency: 1 max-concurrency: 50 #activemq配置 activemq: #默认使用spring-boot-starter-activemq内嵌的activemq,除非明确指定了broker-url in-memory: false user: system password: manager broker-url: auto+nio://192.168.137.5:61616 pool: enabled: true max-connections: 500

ActiveMQ的topic消息突然丢失,必须重启服务才能再收到

有没有哪位大神遇到过这种情况,监听ActiveMQ的topic消息时,服务刚启动时是好的,可以收到消息,但几个小时以后就突然收不到了,也不报错,必须重启服务才能再收到消息。我使用的是spring boot集成activemq,但我觉得跟这个关系不大,因为我单独跑mq也遇到同样的问题,求大神解答

集群应用在接收到ActiveMq topice消息接收重复消息问题

集群应用在接收到ActiveMq topic消息接收重复消息问题 例如 应用A有 A_1及A_2两台机器 ,想问一下,两台同时监听topic后, 怎么处理同一条消息给两台重复接收的问题

关于activemq 队列持久化消息传送速度的问题?

我使用两种方法测试activemq在队列模式下使用kahadb持久化消息传送速度,结果上来看两种方法测出来的速度相差很大,一个一万多条每秒,一个五千左右每秒。 两种测试方法的测试机器是一样的,测试用例相同,activemq的配置也是一样的,谁能给分析下为什么速度差很多??? 做服务器机器叫server,方法一:先脚本启动10个消费者,当20秒没有收到消息就退出,再脚本启动10个生产者,几下开始时间T1秒,每个生产者发送10万条消息,并监视是否消费者进程都退出了,若果退出几下时间T2秒,用总的生产数量/(T2-T1-20)(消费者设置20秒超时退出),得到一万多条每秒,CPU大概300左右,io 读写11000k每秒。 方法二:单独测试生产者或者消费者速度,脚本启动十个生产者,每个发送10万条到server,测试结果大概每秒五千条消息,CPU 120左右io读写8500k每秒。 为什么这两种测试情况速度会相差很大呢?没有币给悬赏了,谢谢大家。

ActiveMQ生产者能查看当前消费者的ID或者查看有多少个消费者吗?

最近刚接触ActiveMQ,想实现一个类似QQ好友上线提醒这样的功能,有什么方法可以获取当前连接的消费者呢?网上查资料好像JMX好像可以实现,但是我是用C#写的,C#有什么办法实现吗?各位大神求指教,小弟感激不尽!

ActiveMQ的生产者推送速度为什么变慢?

有个MQ的生产者反馈向MQ推送消息时,推送速度会逐渐变慢,从MQ服务本身查看内存、CPU、连接数、GC等情况,未看到异常情况,并且消息也没有堆积,各位大佬是否遇到过类似问题,谢谢!

动态监听activemq 的topic!!!!!

现springboot整合的active目前,监听话题使用的是@JmsListener,但是目前想动态里面参数,一愁莫展,所以想问哈各位,有没有啥方法达到动态修改@JmsListener的参数,或则其他具体点的方法达到动态监听,要哭了!!!!

RabbitMQ能否实现类似于ActiveMQ的消息选择(过滤)器

AcitveMQ可以通过selector,配合前端的Stomp的header中的selector实现消息的过滤。 RabbitMQ生产者(JAVA)能否实现类似的效果,使得前端 ``` var headers = {ack: 'client', 'selector': "location = 'Europe'"}; client.subscribe("/queue/test", message_callback, headers); ``` 选择器生效,过滤出想要的信息。

activemq中生产者和消费者的brokerURL必须一样吗

我想实现两个mq之前互相发消息,先把消息发到mq1上,然后再把mq1上的消息发到mq2上,再消费掉mq2的消息,不知道该怎么实现

activemq 删除过期消息

activemq5.14 ,配置了过期时间如下: ``` <plugins> <!-- 86,400,000ms = 1 day --> <timeStampingBrokerPlugin ttlCeiling="10000" zeroExpirationOverride="10000"/> </plugins> ``` 然后那些已经过期的消息,将会保存在data/kahadb目录下,越积越多。不知道配置什么可以删除。请各位帮忙看看怎么解决。

关于ActiveMQ 消息吞吐量的如何优化?

最近公司想对公司应用结构进行优化,对现在架构中很多耗费资源严重且耗时比较长的应用间大数据量同步通信的接口进行优化,讨论决定引入消息中间件,网上浏览了一圈最后锁定ActiveMQ,在网上看到很多关于ActiveMQ的测试分析文档,大部分测试结果 AMQ的每秒吞吐量大概都在2000以上甚至更多,但是我在公司服务器上面测试的数据并不是很理想,有点让人头疼,不能够达到峰值,甚至在多线程下速度极速下降,效率方面有点不能让人接受,想看看有没有更好的优化配置。 下面是我的Amq的配置: [size=large;] 单机服务器:CPU :8个 内存:16G 系统:Linux Red Hat Amq版本:5.5.1 [/size] ${activemq_base}/conf/activemq.xml :配置 [code="java"][color=blue]<broker xmlns="http://activemq.apache.org/schema/core" brokerName="pure_master" destroyApplicationContextOnStop="true" persistent="true" useJmx="true"> <destinationPolicy> <policyMap> <policyEntries> <policyEntry topic=">" producerFlowControl="false" memoryLimit="16mb" optimizedDispatch="true"> <dispatchPolicy> <strictOrderDispatchPolicy /> </dispatchPolicy> <subscriptionRecoveryPolicy> <lastImageSubscriptionRecoveryPolicy /> </subscriptionRecoveryPolicy> </policyEntry> <policyEntry queue=">" producerFlowControl="false" memoryLimit="16mb" optimizedDispatch="true"> </policyEntry> </policyEntries> </policyMap> </destinationPolicy> <managementContext> <managementContext createConnector="false"/> </managementContext> <persistenceAdapter> <kahaDB directory="/opt/activemq_data/kahadb_master" indexWriteBatchSize="1000" journalMaxFileLength="32mb" enableIndexWriteAsync="true" enableJournalDiskSyncs="false"/> </persistenceAdapter> <systemUsage> <systemUsage sendFailIfNoSpaceAfterTimeout="3000"> <memoryUsage> <memoryUsage limit="128 mb"/> </memoryUsage> <storeUsage> <storeUsage limit="15 gb" name="dbstore"/> </storeUsage> <tempUsage> <tempUsage limit="128 mb"/> </tempUsage> </systemUsage> </systemUsage> <transportConnectors> <transportConnector name="openwire" uri="tcp://192.168.2.215:61616"/> </transportConnectors> </broker> <import resource="jetty.xml"/>[/color][/code] JVM设置: [code="java"][color=black] /opt/java/jdk1.6.0_29/bin/java -server -Xmx2g -Xms2g -XX:SurvivorRatio=8 -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -XX:ErrorFile=/opt/mqdata/logfile/dump.log -XX:+UseParNewGC -XX:MaxTenuringThreshold=1 -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.2.215 -Dorg.apache.activemq.UseDedicatedTaskRunner=true -Djava.util.logging.config.file=logging.properties -Dcom.sun.management.jmxremote -Dactivemq.classpath=/opt/work/activemq/conf; -Dactivemq.home=/opt/work/activemq -Dactivemq.base=/opt/work/activemq -jar /opt/work/activemq/bin/run.jar start[/color][/code] 单机模式下测试流程: 只对queue进行测试, 1、broker和producer、consumer 都是分离开得 ,一台服务器专门做broker的主机服务器。 2、使用activemq在example下提供的例子在另一台服务器(8核,16G)进行消息生产 3、1个producer 没有consumer 的情况下,消息大小:1K,非持久化消息,每秒大概在2500左右,1000W以后大概每秒1500/s左右 4、1个peoducer 没有consumer,消息大小:1K,持久化消息(kaha),每秒 1200-1500左右,内存到1G左右时,缩减到800-1000左右/s 5、1个producer,1个consumer,消息大小:1K,持久化消息(kaha),每秒1200左右,持续稳定在这个状况 6、5个producer,5个consumer,消息大小:1K,持久化消息(kaha)、每秒在1000左右/s 持续 7、p:1,c:1, 消息大小:1024K,持久化消息,每秒在700-900/s 8、p:5,c:5,消息大小:1024,持久化消息,每秒大概在700左右/s [size=small;]二、:Pure Master-Slave 模式[/size] 配置: 硬件配置:主从都一样,8 CPU,16G内存 Master 配置与单机模式一样 Slave 只是在<broker> 中增加了masterConnectorURI="tcp://192.168.2.215:61616" shutdownOnMasterFailure="false" ActiveMQ 内存分配为2G 只对queue进行测试, 1、1个producer 没有consumer 的情况下,消息大小:1K,持久化消息,每秒大概在1000左右,内存过半(1G)时,大概在500-700左右 2、1个producer,1个consumer,消息大小:1K,持久化消息(kaha),每秒800-1000左右,持续稳定在这个状况 3、5个producer,5个consumer,消息大小:1K,持久化消息(kaha)、每秒在500-800左右/s 持续 4、p:1,c:1, 消息大小:1024K,持久化消息,每秒在700左右/s 5、p:5,c:5,消息大小:1024,持久化消息,每秒大概在500左右/s 这是我现在的测试结果. 但是这个结果让我不是很满意,想问问大家在配置ActiveMQ 的时候 我是否有配置有耗时的地方,还可以在那些方面进行优化。 公司的方案倾向于Pure Master-Slave模式但是这种模式有 双向存储的性能消耗,也想问问大家在应用方面那种模式更好一些,初步预算在生产环境为两个服务器。 希望大家能帮忙解决下问题 ,谢谢啊

Activemq如何设置多个不同类型的消费者

多个web项目之间共用一个activemq可以实现,消息共享吗?访问同一个消息队列每个项目根据定义的不同类型的消费者同时对同一个消息进行单次消费。

利用ajax客户端就行activeMQ消息中间件的消息收发,如何设置topic的持久订阅啊?

利用ajax客户端进行activeMQ消息中间件的消息收发,如何设置topic的持久订阅啊?具体语法怎么写啊?

写了两个Java web应用,用activeMQ向另一个应用发消息,要每发两条才能收到一条消息!!!

如果接收消息的应用用main方法的形式接受消息,每条都能收到,就正常。用tomcat跑的话,要每发两条才收到一条。我要疯了!

linux下利用/proc进行进程树的打印

在linux下利用c语言实现的进程树的打印,主要通过/proc下的目录中的进程文件,获取status中的进程信息内容,然后利用递归实现进程树的打印

设计模式(JAVA语言实现)--20种设计模式附带源码

课程亮点: 课程培训详细的笔记以及实例代码,让学员开始掌握设计模式知识点 课程内容: 工厂模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式、原型模型、代理模式、单例模式、适配器模式 策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式 课程特色: 笔记设计模式,用笔记串连所有知识点,让学员从一点一滴积累,学习过程无压力 笔记标题采用关键字标识法,帮助学员更加容易记住知识点 笔记以超链接形式让知识点关联起来,形式知识体系 采用先概念后实例再应用方式,知识点深入浅出 提供授课内容笔记作为课后复习以及工作备查工具 部分图表(电脑PC端查看):

Python数据分析与挖掘

92讲视频课+16大项目实战+源码+¥800元课程礼包+讲师社群1V1答疑+社群闭门分享会=99元 &nbsp; 为什么学习数据分析? &nbsp; &nbsp; &nbsp; 人工智能、大数据时代有什么技能是可以运用在各种行业的?数据分析就是。 &nbsp; &nbsp; &nbsp; 从海量数据中获得别人看不见的信息,创业者可以通过数据分析来优化产品,营销人员可以通过数据分析改进营销策略,产品经理可以通过数据分析洞察用户习惯,金融从业者可以通过数据分析规避投资风险,程序员可以通过数据分析进一步挖掘出数据价值,它和编程一样,本质上也是一个工具,通过数据来对现实事物进行分析和识别的能力。不管你从事什么行业,掌握了数据分析能力,往往在其岗位上更有竞争力。 &nbsp;&nbsp; 本课程共包含五大模块: 一、先导篇: 通过分析数据分析师的一天,让学员了解全面了解成为一个数据分析师的所有必修功法,对数据分析师不在迷惑。 &nbsp; 二、基础篇: 围绕Python基础语法介绍、数据预处理、数据可视化以及数据分析与挖掘......这些核心技能模块展开,帮助你快速而全面的掌握和了解成为一个数据分析师的所有必修功法。 &nbsp; 三、数据采集篇: 通过网络爬虫实战解决数据分析的必经之路:数据从何来的问题,讲解常见的爬虫套路并利用三大实战帮助学员扎实数据采集能力,避免没有数据可分析的尴尬。 &nbsp; 四、分析工具篇: 讲解数据分析避不开的科学计算库Numpy、数据分析工具Pandas及常见可视化工具Matplotlib。 &nbsp; 五、算法篇: 算法是数据分析的精华,课程精选10大算法,包括分类、聚类、预测3大类型,每个算法都从原理和案例两个角度学习,让你不仅能用起来,了解原理,还能知道为什么这么做。

广工操作系统课程设计(文档+代码+可执行文件)

实现作业调度(先来先服务)、进程调度功能(时间片轮转) 实现内存管理功能(连续分配)。 实现文件系统功能(选作) 这些功能要有机地连接起来

Only老K说-爬取妹子图片(简单入门)

安装第三方请求库 requests 被网站禁止了访问 原因是我们是Python过来的 重新给一段 可能还是存在用不了,使用网页的 编写代码 上面注意看匹配内容 User-Agent:请求对象 AppleWebKit:请求内核 Chrome浏览器 //请求网页 import requests import re //正则表达式 就是去不规则的网页里面提取有规律的信息 headers = { 'User-Agent':'存放浏览器里面的' } response = requests.get

linux“开发工具三剑客”速成攻略

工欲善其事,必先利其器。Vim+Git+Makefile是Linux环境下嵌入式开发常用的工具。本专题主要面向初次接触Linux的新手,熟练掌握工作中常用的工具,在以后的学习和工作中提高效率。

Python代码实现飞机大战

文章目录经典飞机大战一.游戏设定二.我方飞机三.敌方飞机四.发射子弹五.发放补给包六.主模块 经典飞机大战 源代码以及素材资料(图片,音频)可从下面的github中下载: 飞机大战源代码以及素材资料github项目地址链接 ————————————————————————————————————————————————————————— 不知道大家有没有打过飞机,喜不喜欢打飞机。当我第一次接触这个东西的时候,我的内心是被震撼到的。第一次接触打飞机的时候作者本人是身心愉悦的,因为周边的朋友都在打飞机, 每

Python数据清洗实战入门

本次课程主要以真实的电商数据为基础,通过Python详细的介绍了数据分析中的数据清洗阶段各种技巧和方法。

2019 Python开发者日-培训

本次活动将秉承“只讲技术,拒绝空谈”的理念,邀请十余位身处一线的Python技术专家,重点围绕Web开发、自动化运维、数据分析、人工智能等技术模块,分享真实生产环境中使用Python应对IT挑战的真知灼见。此外,针对不同层次的开发者,大会还安排了深度培训实操环节,为开发者们带来更多深度实战的机会。

apache-jmeter-5.1.1(Requires Java 8+).zip

。Apache JMeter 5.1.1 (Requires Java 8+),需要jdk8以上的版本。

数通HCNP中文理论全套教材.rar

内涵HCNP-IENP中文理论书-内文,

Python可以这样学(第四季:数据分析与科学计算可视化)

董付国老师系列教材《Python程序设计(第2版)》(ISBN:9787302436515)、《Python可以这样学》(ISBN:9787302456469)配套视频,在教材基础上又增加了大量内容,通过实例讲解numpy、scipy、pandas、statistics、matplotlib等标准库和扩展库用法。

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

我以为我对Mysql事务很熟,直到我遇到了阿里面试官

太惨了,面试又被吊打

2019 AI开发者大会

2019 AI开发者大会(AI ProCon 2019)是由中国IT社区CSDN主办的AI技术与产业年度盛会。多年经验淬炼,如今蓄势待发:2019年9月6-7日,大会将有近百位中美顶尖AI专家、知名企业代表以及千余名AI开发者齐聚北京,进行技术解读和产业论证。我们不空谈口号,只谈技术,诚挚邀请AI业内人士一起共铸人工智能新篇章!

图书管理系统(Java + Mysql)我的第一个完全自己做的实训项目

图书管理系统 Java + MySQL 完整实训代码,MVC三层架构组织,包含所有用到的图片资源以及数据库文件,大三上学期实训,注释很详细,按照阿里巴巴Java编程规范编写

Python数据挖掘简易入门

&nbsp; &nbsp; &nbsp; &nbsp; 本课程为Python数据挖掘方向的入门课程,课程主要以真实数据为基础,详细介绍数据挖掘入门的流程和使用Python实现pandas与numpy在数据挖掘方向的运用,并深入学习如何运用scikit-learn调用常用的数据挖掘算法解决数据挖掘问题,为进一步深入学习数据挖掘打下扎实的基础。

C/C++学习指南全套教程

C/C++学习的全套教程,从基本语法,基本原理,到界面开发、网络开发、Linux开发、安全算法,应用尽用。由毕业于清华大学的业内人士执课,为C/C++编程爱好者的教程。

微信公众平台开发入门

本套课程的设计完全是为初学者量身打造,课程内容由浅入深,课程讲解通俗易懂,代码实现简洁清晰。通过本课程的学习,学员能够入门微信公众平台开发,能够胜任企业级的订阅号、服务号、企业号的应用开发工作。 通过本课程的学习,学员能够对微信公众平台有一个清晰的、系统性的认识。例如,公众号是什么,它有什么特点,它能做什么,怎么开发公众号。 其次,通过本课程的学习,学员能够掌握微信公众平台开发的方法、技术和应用实现。例如,开发者文档怎么看,开发环境怎么搭建,基本的消息交互如何实现,常用的方法技巧有哪些,真实应用怎么开发。

三个项目玩转深度学习(附1G源码)

从事大数据与人工智能开发与实践约十年,钱老师亲自见证了大数据行业的发展与人工智能的从冷到热。事实证明,计算机技术的发展,算力突破,海量数据,机器人技术等,开启了第四次工业革命的序章。深度学习图像分类一直是人工智能的经典任务,是智慧零售、安防、无人驾驶等机器视觉应用领域的核心技术之一,掌握图像分类技术是机器视觉学习的重中之重。针对现有线上学习的特点与实际需求,我们开发了人工智能案例实战系列课程。打造:以项目案例实践为驱动的课程学习方式,覆盖了智能零售,智慧交通等常见领域,通过基础学习、项目案例实践、社群答疑,三维立体的方式,打造最好的学习效果。

2021考研数学张宇基础30讲.pdf

张宇:博士,全国著名考研数学辅导专家,教育部“国家精品课程建设骨干教师”,全国畅销书《张宇高等数学18讲》《张宇线性代数9讲》《张宇概率论与数理统计9讲》《张宇考研数学题源探析经典1000题》《张宇考

专为程序员设计的数学课

<p> 限时福利限时福利,<span>15000+程序员的选择!</span> </p> <p> 购课后添加学习助手(微信号:csdn590),按提示消息领取编程大礼包!并获取讲师答疑服务! </p> <p> <br> </p> <p> 套餐中一共包含5门程序员必学的数学课程(共47讲) </p> <p> 课程1:《零基础入门微积分》 </p> <p> 课程2:《数理统计与概率论》 </p> <p> 课程3:《代码学习线性代数》 </p> <p> 课程4:《数据处理的最优化》 </p> <p> 课程5:《马尔可夫随机过程》 </p> <p> <br> </p> <p> 哪些人适合学习这门课程? </p> <p> 1)大学生,平时只学习了数学理论,并未接触如何应用数学解决编程问题; </p> <p> 2)对算法、数据结构掌握程度薄弱的人,数学可以让你更好的理解算法、数据结构原理及应用; </p> <p> 3)看不懂大牛代码设计思想的人,因为所有的程序设计底层逻辑都是数学; </p> <p> 4)想学习新技术,如:人工智能、机器学习、深度学习等,这门课程是你的必修课程; </p> <p> 5)想修炼更好的编程内功,在遇到问题时可以灵活的应用数学思维解决问题。 </p> <p> <br> </p> <p> 在这门「专为程序员设计的数学课」系列课中,我们保证你能收获到这些:<br> <br> <span> </span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">①价值300元编程课程大礼包</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">②应用数学优化代码的实操方法</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">③数学理论在编程实战中的应用</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">④程序员必学的5大数学知识</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">⑤人工智能领域必修数学课</span> </p> <p> <br> 备注:此课程只讲程序员所需要的数学,即使你数学基础薄弱,也能听懂,只需要初中的数学知识就足矣。<br> <br> 如何听课? </p> <p> 1、登录CSDN学院 APP 在我的课程中进行学习; </p> <p> 2、登录CSDN学院官网。 </p> <p> <br> </p> <p> 购课后如何领取免费赠送的编程大礼包和加入答疑群? </p> <p> 购课后,添加助教微信:<span> csdn590</span>,按提示领取编程大礼包,或观看付费视频的第一节内容扫码进群答疑交流! </p> <p> <img src="https://img-bss.csdn.net/201912251155398753.jpg" alt=""> </p>

DDR5_Draft_Spec_Rev05c.pdf

DDR5 spec

Java面试史上最全的JAVA专业术语面试100问 (前1-50)

前言: 说在前面, 面试题是根据一些朋友去面试提供的,再就是从网上整理了一些。 先更新50道,下一波吧后面的也更出来。 求赞求关注!! 废话也不多说,现在就来看看有哪些面试题 1、面向对象的特点有哪些? 抽象、继承、封装、多态。 2、接口和抽象类有什么联系和区别? 3、重载和重写有什么区别? 4、java有哪些基本数据类型? 5、数组有没有length()方法?String有没有length()方法? 数组没有length()方法,它有length属性。 String有length()方法。 集合求长度用

网络工程师小白入门--【思科CCNA、华为HCNA等网络工程师认证】

本课程适合CCNA或HCNA网络小白同志,高手请绕道,可以直接学习进价课程。通过本预科课程的学习,为学习网络工程师、思科CCNA、华为HCNA这些认证打下坚实的基础! 重要!思科认证2020年2月24日起,已启用新版认证和考试,包括题库都会更新,由于疫情原因,请关注官网和本地考点信息。题库网络上很容易下载到。

C/C++跨平台研发从基础到高阶实战系列套餐

一 专题从基础的C语言核心到c++ 和stl完成基础强化; 二 再到数据结构,设计模式完成专业计算机技能强化; 三 通过跨平台网络编程,linux编程,qt界面编程,mfc编程,windows编程,c++与lua联合编程来完成应用强化 四 最后通过基于ffmpeg的音视频播放器,直播推流,屏幕录像,

Python界面版学生管理系统

前不久上传了一个控制台版本的学生管理系统,这个是Python界面版学生管理系统,这个是使用pycharm开发的一个有界面的学生管理系统,基本的增删改查,里面又演示视频和完整代码,有需要的伙伴可以自行下

2019数学建模A题高压油管的压力控制 省一论文即代码

2019数学建模A题高压油管的压力控制省一完整论文即详细C++和Matlab代码,希望对同学们有所帮助

4小时玩转微信小程序——基础入门与微信支付实战

这是一个门针对零基础学员学习微信小程序开发的视频教学课程。课程采用腾讯官方文档作为教程的唯一技术资料来源。杜绝网络上质量良莠不齐的资料给学员学习带来的障碍。 视频课程按照开发工具的下载、安装、使用、程序结构、视图层、逻辑层、微信小程序等几个部分组织课程,详细讲解整个小程序的开发过程

相关热词 c#中如何设置提交按钮 c#帮助怎么用 c# 读取合并单元格的值 c#带阻程序 c# 替换span内容 c# rpc c#控制台点阵字输出 c#do while循环 c#调用dll多线程 c#找出两个集合不同的
立即提问