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

Spring+ActiveMQ

1. 环境搭建

1.1 env-version

JDK

1.8

Spring

2.7.13

Maven

3.6

ActiveMQ

5.15.2

1.2 docker-compose.yml

version: '3.8'services:activemq:image: rmohr/activemq:5.16.3container_name: activemqports:- "61616:61616"- "8161:8161"environment:- ACTIVEMQ_ADMIN_LOGIN=admin- ACTIVEMQ_ADMIN_PASSWORD=admin- ACTIVEMQ_CONFIG_MINMEMORY=512- ACTIVEMQ_CONFIG_MAXMEMORY=2048
#    volumes:
#     - ./data/activemq:/var/activemq/data
#     - ./conf/activemq.xml:/var/activemq/conf/activemq.xmlnetworks:- activemq-network    networks:activemq-network:driver: bridge

在这个docker-compose.yml文件中:

  • activemq服务使用了rmohr/activemq Docker镜像,这是一个社区维护的ActiveMQ镜像。请确保选择一个与你的Spring Boot版本兼容的ActiveMQ版本。

  • container_name设置了容器的名称。

  • ports映射了ActiveMQ的JMS端口(61616)和管理控制台端口(8161)到宿主机的相同端口。

  • environment部分设置了管理员账号和密码,以及JVM的最小和最大内存配置。这些可以根据需要进行调整。

  • volumes部分映射了宿主机的目录到容器内部,用于持久化ActiveMQ的数据和配置文件。你需要创建相应的目录并放置你的activemq.xml配置文件。

  • networks定义了一个自定义网络,以便ActiveMQ服务可以连接到其他可能需要的Docker服务。

在使用这个docker-compose.yml文件之前,请确保你已经创建了dataconf目录,并且在conf目录中放置了自定义的activemq.xml配置文件。如果不需要持久化存储,可以移除volumes部分。

1.3 添加依赖

<!-- ActiveMQ 依赖 -->
<!-- https://mvnrepository.com/artifact/org.apache.activemq/activemq-spring -->
<dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-spring</artifactId><version>5.15.4</version><!-- 排除依赖 --><exclusions><exclusion><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></exclusion>
</exclusions>
</dependency><!-- Spring Boot 与 JMS 集成的 starter -->
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-activemq -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-activemq</artifactId><version>2.7.12</version>
</dependency>

2. 工程结构

activemq/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   ├── com/
│   │   │   │   ├── xiaokai/
│   │   │   │   │   ├── ActiveMQApplication.java   // 应用程序的主类,通常包含main方法
│   │   │   │   │   ├── config/                   // 配置包
│   │   │   │   │   │   └── JmsConfig.java        // ActiveMQ的配置类
│   │   │   │   │   ├── event/                   // 事件包
│   │   │   │   │   │   ├── Eventinfo.java        // 事件信息类:构建消息、send topic
│   │   │   │   │   ├── listener/                // 监听器包
│   │   │   │   │   │   └── MessageListener.java  // 消息监听器类
│   │   │   │   │   ├── service/                 // 服务包
│   │   │   │   │   │   └── ActiveMQService.java   // ActiveMQ服务类
│   │   │   │   │   
│   │   │   ├── resources/                      // 资源文件
│   │   │   │   └── application.yml             // Spring配置文件
│   │   │   
│   │   ├── test/                                // 测试代码
│   │   │   ├── java/                           // 测试Java代码
│   │   │   │   ├── com/
│   │   │   │   │   ├── xiaokai/
│   │   │   │   │   └── ActiveMQTest.java        // ActiveMQ的测试类
└── pom.xml                                     // Maven构建配置文件(未在文件内容中列出)

ActiveMQApplication.java:项目的主类,通常包含启动Spring应用程序的main方法。

JmsConfig.java:配置ActiveMQ的Java配置类。

Eventinfo.java:可能用于表示事件信息的类。

MessageListener.java:消息监听器,用于监听并处理ActiveMQ消息。

ActiveMQService.java:服务类,可能包含与ActiveMQ交互的业务逻辑。

application.yml:Spring Boot的配置文件,用于配置应用程序的各种参数。

ActiveMQTest.java:用于测试ActiveMQ功能的测试类。

3. 示例代码

JmsConfig.java

package com.xiaokai.config;import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;import javax.jms.ConnectionFactory;/*** Author:yang* Date:2024-10-19 15:57*/
@Configuration
@EnableJms
public class JmsConfig {@Beanpublic ActiveMQConnectionFactory connectionFactory() {ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();connectionFactory.setBrokerURL("tcp://116.198.242.56:61616");connectionFactory.setUserName("admin");connectionFactory.setPassword("admin");return connectionFactory;}@Beanpublic DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory) {DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setSessionTransacted(true);return factory;}}

MessageListener.java

package com.xiaokai.listener;import lombok.extern.slf4j.Slf4j;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;/*** Author:yang* Date:2024-10-19 15:55*/
@Component
@Slf4j
public class MessageListener {// 监听队列test.queue@JmsListener(destination = "test.queue")public void onMessage(String message) {log.info("Received message: " + message);}}

ActiveMQService .java

package com.xiaokai.service;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;/*** Author:yang* Date:2024-10-19 16:01*/
@Service
@Slf4j
public class ActiveMQService {@Autowiredprivate JmsMessagingTemplate jmsMessagingTemplate;public void send(String message) {log.info("Sending message: {}", message);jmsMessagingTemplate.convertAndSend("test.queue", message);}
}

注:JmsMessagingTemplate作为Spring相关bean,封装了JmsTemplate 。总的来说JmsTemplate更底层,但是在使用过程中不需要过多关注底层实现。

@Autowired private JmsMessagingTemplate jmsMessagingTemplate; 
@Autowired private JmsTemplate jmsTemplate;

application.yml

spring:activemq:broker-url: tcp://116.198.242.56:61616user: adminpassword: admin

注:在JmsConfig.java配置文件中配置后,可以不需要配置文件,二者选其一。

测试:

package com.xiaokai;import com.xiaokai.service.ActiveMQService;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;/*** Author:yang* Date:2024-10-21 10:28*/
@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class ActiveMQTest {@Autowiredprivate ActiveMQService activeMQService;@Testpublic void testSend(){activeMQService.send("test");}
}

结果:

 Sending message: testStarted ActiveMQApplication in 1.368 seconds (JVM running for 1.799)Received message: test

注:在ActiveMQ提供的可视化控制台可以查看相关信息。

访问:http://116.198.242.56:8161/admin/index.jsp

4. 消息模型

4.1 P2P模型

bean

@Bean
public Destination queue() {return new ActiveMQQueue("test.queue");
}

消息监听器

@Component
@Slf4j
public class MessageListener {// 监听队列test.queue@JmsListener(destination = "test.queue")public void onMessage1(String message) {log.info("Received queue message1: " + message);}// 监听队列test.queue@JmsListener(destination = "test.queue")public void onMessage2(String message) {log.info("Received queue message2: " + message);}}

消息服务

@Service
@Slf4j
public class ActiveMQService {@Autowiredprivate JmsMessagingTemplate jmsMessagingTemplate;@Autowiredprivate Destination queue;// 发送点对点消息public void sendP2P(String message) {log.info("Sending queue message: {}", message);jmsMessagingTemplate.convertAndSend(queue, message);}}

application.yml

spring:activemq:broker-url: tcp://116.198.242.56:61616user: adminpassword: admin#    true表示使用发布/订阅模式,false表示使用点对点模式jms:pub-sub-domain: false

结论:点对点消息模式是将消息推送到queue中,消费者通过轮训的方式消费消息

4.2 发布/订阅模型

Bean

@Bean
public Destination topic() {return new ActiveMQTopic("test.topic");
}

消息监听器

@Component
@Slf4j
public class PubMessageListener {// 监听主题test.topic@JmsListener(destination = "test.topic")public void onMessage3(String message) {log.info("Received topic message1: " + message);}// 监听主题test.topic@JmsListener(destination = "test.topic")public void onMessage4(String message) {log.info("Received topic message2: " + message);}}

消息服务

@Service
@Slf4j
public class ActiveMQService {@Autowiredprivate JmsMessagingTemplate jmsMessagingTemplate;@Autowiredprivate Destination topic;// 发送发布订阅消息public void sendPubSub(String message) {log.info("Sending topic message: {}", message);jmsMessagingTemplate.convertAndSend(topic, message);}}

application.yml

spring:activemq:broker-url: tcp://116.198.242.56:61616user: adminpassword: admin#    true表示使用发布/订阅模式,false表示使用点对点模式jms:pub-sub-domain: true

注:需要将发布/订阅开关打开

结论:发送消息后,订阅主题的消费者都能收到同一条消息去消费。

5. 消息类型

5.1 普通消息

        普通消息如上述案例,生产者生产消息后,由消费者消费消息,中间不需要做额外的事情。

5.2 延迟消息

延迟消息指在生产者生产带有延迟时间的消息后,broker接收到消息后,并不立即投送到队列或者主题,而是到达延迟时间后,再将消息投送到队列、主题。

配置ActiveMQ支持延迟消息: 修改ActiveMQ的配置文件activemq.xml,确保<broker>标签包含schedulerSupport="true"属性。这允许ActiveMQ的计划任务功能,从而支持延迟消息。

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" schedulerSupport="true">

修改配置后,需要重启ActiveMQ服务器以使更改生效。

发送延迟消息

// 发送延迟消息
public void sendDelay(String message) {HashMap<String, Object> properties = new HashMap<>();properties.put(ScheduledMessage.AMQ_SCHEDULED_DELAY, 10000);log.info("Sending delay queue message: {}", message);jmsMessagingTemplate.convertAndSend(queue, message, properties);
}

消息监听器

...

5.3 事务消息

        没啥用,用ActiveMQ实现事务消息还不如不用,辣鸡(狗头保命)

相关文章:

Spring+ActiveMQ

1. 环境搭建 1.1 env-version JDK 1.8 Spring 2.7.13 Maven 3.6 ActiveMQ 5.15.2 1.2 docker-compose.yml version: 3.8services:activemq:image: rmohr/activemq:5.16.3container_name: activemqports:- "61616:61616"- "8161:8161"environment…...

Linux 常用命令总汇

查询所有wifi nmcli dev wifi list 链接wifi sudo nmcli dev wifi connect XXXX password XXXX 查询本机IP ifconfig 查询联网情况 ping www.baidu.com 进入.bash gedit ~/.bashrc sudo dpkg -i XXX.deb 安装超级终端 sudo apt install terminator 超级终端常用…...

fmql之Linux RTC

模拟i2c&#xff0c;连接rtc芯片。 dts&#xff1a; /{ // 根节点i2c_gpio: i2c-gpio {#address-cells <1>;#size-cells <0>;compatible "i2c-gpio";// MIO56-SDA, MIO55-SCL // 引脚编号gpios <&portc 2 0&portc 1 0 >;i2c-gp…...

Flask-SocketIO 简单示例

用于服务端和客户端通信&#xff0c;服务端主动给客户端发送消息 前提&#xff1a; 确保安装了socket库&#xff1a; pip install flask-socketio python-socketio服务端代码 from flask import Flask from flask_socketio import SocketIO import threading import timeap…...

Vue 3 的组件式开发(2)

1 Vue 3 组件的插槽 插槽&#xff08;Slot&#xff09;是Vue组件中的一个重要概念&#xff0c;它允许父组件向子组件中插入HTML结构或其他组件&#xff0c;从而实现内容的自定义和复用。以下是对Vue 3组件插槽的详细讲解&#xff1a; 1.1 插槽的基本概念 插槽可以被视为子组…...

python 爬虫 入门 四、线程,进程,协程

目录 一、进程 特征&#xff1a; 使用&#xff1a; 初始代码 进程改装代码 二、线程 特征&#xff1a; 使用&#xff1a; 三、协程 后续&#xff1a;五、抓取图片、视频 线程和进程大部分人估计都知道&#xff0c;但协程就不一定了。 一、进程 进程是操作系统分配资…...

cloak斗篷伪装下的独立站

随着互联网的不断进步&#xff0c;越来越多的跨境电商卖家开始认识到独立站的重要性&#xff0c;并纷纷建立自己的独立站点。对于那些有志于进入这一领域的卖家来说&#xff0c;独立站是什么呢&#xff1f;独立站是指个人或小型团队自行搭建和运营的网站。 独立站能够帮助跨境…...

【Nas】X-DOC:在Mac OS X 中使用 WOL 命令唤醒局域网内 PVE 主机

【Nas】X-DOC&#xff1a;在Mac OS X 中使用 WOL 命令唤醒局域网内 PVE 主机 1、Mac OS X 端2、PVE 端&#xff08;Debian Linux&#xff09; 1、Mac OS X 端 &#xff08;1&#xff09;安装 wakeonlan 工具 brew install wakeonlan&#xff08;2&#xff09;唤醒 PVE 命令 …...

u盘装win10系统提示“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”解决方法

我们在u盘安装原版win10 iso镜像时&#xff0c;发现在选择硬盘时提示了“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”&#xff0c;直接导致了无法继续安装下去。出现这种情况要怎么解决呢&#xff1f;下面小编分享u盘安装win10系统提示“windows无法安装到这个磁盘…...

Linux系统之dc计算器工具的基本使用

Linux系统之dc计算器工具的基本使用 一、DC工具介绍二、dc命令的基本用法2.1 dc命令的help帮助信息2.2 dc命令基本用法2.3 dc命令常用操作符 三、dc命令的基本使用3.1dc命令的用法步骤3.2 简单数学计算3.3 通过文件来计算3.4 使用--expression计算3.5 使用dc命令进行高精度计算…...

使用Python计算相对强弱指数(RSI)进阶

使用Python计算相对强弱指数&#xff08;RSI&#xff09;进阶 废话不多说&#xff0c;直接上主题&#xff1a;> 代码实现 以下是实现RSI计算的完整代码&#xff1a; # 创建一个DataFramedata {DATE: date_list, # 日期CLOSE: close_px_list, # 收盘价格 }df pd.DataF…...

vue 解决:npm ERR! code ERESOLVE 及 npm ERR! ERESOLVE could not resolve 的方案

1、问题描述&#xff1a; 其一、需求为&#xff1a; 想要安装项目所需依赖&#xff0c;成功运行 vue 项目&#xff0c;想要在浏览器中能成功访问项目地址 其二、问题描述为&#xff1a; 在 package.json 文件打开终端平台&#xff0c;通过执行 npm install 命令&#xff0c…...

Android 原生开发与Harmony原生开发浅析

Android系统 基于Linux ,架构如下 底层 (Linux )> Native ( C层) > FrameWork层 (SystemService) > 系统应用 (闹钟/日历等) 从Android发版1.0开始到现在15,经历了大大小小的变革 从Android6.0以下是个分水岭,6.0之前权限都是直接卸载Manifest中配置 6.0开始 则分普…...

VIVO售后真好:屏幕绿线,4年免费换屏

只要亮屏就有。这也太影响使用了。 本来想换趁机换手机&#xff0c;看了VIVO发布的X200&#xff0c;决定等明年的X200 ULTRA。手头这个就准备修。 查了一下价格&#xff0c;换屏1600&#xff0c;优惠1100。咸鱼上X70 PRO也就800。能不能简单维修就解决呢&#xff1f;于是联系…...

数据类型【MySQL】

文章目录 建立表查看表删除表数据类型floatcharvarcharchar&&varchar 时间日期类型enum和setenum和set查找 建立表 mysql> create table if not exists user1(-> id int ,-> name varchar (20) comment 用户名 ,-> password char (32) comment 用户名的…...

流媒体协议.之(RTP,RTCP,RTSP,RTMP,HTTP)(二)

继续上篇介绍&#xff0c;本篇介绍一下封装RTP的数据格式&#xff0c;如何将摄像头采集的码流&#xff0c;音频的码流&#xff0c;封装到rtp里&#xff0c;传输。 有自己私有协议例子&#xff0c;有rtp协议&#xff0c;参考代码。注意不是rtsp协议。 一、私有协议 玩过tcp协议…...

在 Kakarot ZkEVM 上使用 Starknet Scaffold 构建应用

Starknet 和 EVM 我们所知的智能合约世界一直围绕着以太坊虚拟机&#xff08;EVM&#xff09;&#xff0c;其主要语言是 Solidity。 尽管 Starknet 通过 STARKs 为以太坊开辟了新的可能性&#xff0c;但其缺点是它有一个不同的虚拟机 (CairoVM)&#xff0c;这要求开发者学习 …...

DBeave如何连接达梦数据库,设置达梦驱动,真酷

前言 我们在使用DBeaver连接数据库时&#xff0c;默认可以连接常用的数据库&#xff0c;如mysql数据库&#xff0c;postgresql数据库&#xff0c;oracle数据库。但是&#xff0c;我们的国产数据库达梦数据库&#xff0c;默认在IDEA里面没有驱动&#xff0c;所以还得配置一下才…...

2024年全球 MoonBit 编程创新赛-零基础早鸟教程-使用wasm4八小时开发井子棋小游戏

前言 本篇文章主要分享 “2024年全球 MoonBit 编程创新赛 游戏赛道”参赛过程中九宫棋游戏的开发技巧和心得。以此抛砖引玉。首先介绍下 MoonBit。 月兔语言 MoonBit 是一个用于云计算和边缘计算的 WebAssembly 端到端的编程语言工具链。 您可以访问 https://try.moonbitlang.…...

机器学习4

第3章 线性模型 3.1 线性模型的基本形式 3.1.1 线性模型的核心公式 线性模型通过属性的线性组合进行预测&#xff0c;其核心公式为&#xff1a; [ f(x) \omega_1 X_1 \omega_2 X_2 … \omega_d X_d b ] 其中&#xff1a; ω 1 , ω 2 , . . . , ω d \omega_1, \omega_…...

Python数值计算(33)——simpson 3/8积分公式

1. 背景知识 既然前的Simpson可以通过使用三个点构造二次曲线近似积分&#xff0c;那么&#xff0c;如果点数增加到了4个&#xff0c;然后不就可以构造三次多项式的曲线&#xff0c;实现对目标值的积分吗&#xff1f; 如果采用和上一节介绍的同样的方法&#xff0c;我们可以推…...

<项目代码>YOLOv8路面垃圾识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…...

Java中的注解(白金版)

Spring中常用注解 Springboot中@Validated注解的使用 Swagger中常用注解 @Validate...

actor模型

Actor模型&#xff08;Actor Model&#xff09;是一种用于并发计算的数学模型和编程概念&#xff0c;它最早由计算机科学家 Carl Hewitt 等人提出&#xff0c;用于简化对多线程或并发系统的设计和实现。Actor模型在并发编程、分布式系统、消息传递系统等领域具有广泛应用。 核…...

合约门合同全生命周期管理系统:企业智能合同管理的新时代

合约门合同全生命周期管理系统&#xff1a;企业智能合同管理的新时代 1. 引言 随着现代企业的快速发展&#xff0c;合同管理的复杂性日益增加。无论是采购合同、销售合同还是合作协议&#xff0c;合同管理已成为企业运营中至关重要的一环。传统的手工合同管理方式往往效率低下…...

vscode如何debug环境配置?torchrun与deepspeed库又该如何配置?

文章目录 前言一、vscode命令参数传递1、验证参数py文件2、第一种vscode调用方法(launch.json配置)3、第二种vscode调用方法(launch.json配置)二、deepspeed运行py文件代码(deepspeed_test.py)三、deepspeed命令调用(无法debug)四、deepspeed使用vscode进行调试(能debug)五、vs…...

Qt元对象系统 —— 信号与槽

信号与槽讨论的是Qt对象之间的连接与交互。我们就是使用这种方式实现了一个简单的异步调用。换而言之&#xff0c;信号与槽让我们可以不必考虑复杂的调用。只需要当我们需要在程序中表达&#xff1a;“希望在程序中通知一个事件而且按照我们设定的方式给出回应”的时候&#xf…...

单细胞配色效果模拟器 | 简陋版(已有颜色数组)

目的&#xff1a;假设你有一组颜色了&#xff0c;怎么模拟查看它们在单细胞DimPlot中的美学效果呢&#xff1f;要足够快&#xff0c;还要尽可能有模拟效果。 1. 尝试1: 随机矩阵&#xff0c;真的UMAP降维后绘图&#xff08;失败&#xff09; 造一个随机矩阵&#xff0c;使用S…...

面向对象编程中类与类之间的关系(一)

目录 1.引言 2."有一个"关系 3."是一个"关系(继承) 4.“有一个”与“是一个”的区别 5.not-a关系 6.层次结构 7.多重继承 8.混入类 1.引言 作为程序员&#xff0c;必然会遇到这样的情况&#xff1a;不同的类具有共同的特征&#xff0c;至少看起来彼…...

streamlit 实现 flink SQL运行界面

实现效果 streamlit flink-playground.py 文件如下&#xff1a; import streamlit as st import io import contextlib import sys import os import uuid import subprocess from jinja2 import Templatest.set_page_config(layout"wide")# 设置页面标题 st.title…...

门户网站开发是什么/google登录入口

基于Matlab的湘江水质重金属污染预测模型研究 安徽农业科学 。 J o arn a l o f A n h u i A g fi &#xff0e;S c i &#xff0e; 2 0 1 2。 4 0 ( 9) &#xff1a; 5 4 9 6— 5 4 9 8 责任编辑杨莹莹责任校对况玲玲 基于 Ma t l a b的湘江水质重金属污染预测模型研究 宁 可 …...

微信运营服务商/长沙官网seo

一&#xff0c;次最小生成树 定义&#xff1a;设T是图G的最小生成树&#xff0c;如果T1满足ω(T1)min{ω(T’)| T’∈Not(T)},则T1是G的次小生成树。 解释&#xff1a;除了最小生成树外&#xff0c;另外一个生成树的权值和最小的生成树&#xff0c;定义为次最小生成树。 经典题…...

评价淘宝网购物 经验和教训 对网站建设的建议和意见/百度热议

WebVies类介绍 [WebResourceRequest]添加于API21&#xff0c;封装了一个Web资源的请求信息&#xff0c;包含&#xff1a;请求地址&#xff0c;请求方法&#xff0c;请求头&#xff0c;是否主框架&#xff0c;是否用户点击&#xff0c;是否重定向- [WebResourceResponse]封装了…...

网页设计与制作简答题/网站优化服务

VARCHART XGantt是一个交互式的甘特图控件&#xff0c;其模块化的设计让您可以创建满足您和您的客户所需求的应用程序。&#xff08;我们领先的甘特图控件VARCHART XGantt可用于.NET&#xff0c;ActiveX和ASP.NET应用程序。&#xff09;除此之外&#xff0c;同时还具有一个稳定…...

外贸b2c网站建设公司/深圳百度推广公司

对于一个对IT行业一知半解的人来讲&#xff0c;选择学哪一门编程语言真的很难&#xff0c;然而仔细分析人 为什么那么多人学Java&#xff1f;简单概括就是功力深厚&#xff0c;无人撼动。 首先&#xff0c;Java诞生于互联网蓬勃发展的时期&#xff0c;那时C语言一家独大&…...

中国建设银行网站会员登录/腾讯云域名注册官网

如何为企业量身制定行之有效的考核体系&#xff1f;如何有效激发员工的创业激情&#xff1f;如何通过企业绩效管理助推集团战略落地&#xff1f;阿米巴通过“81”绩效量化技术&#xff0c;解决了“考核什么”和“怎么考核”的技术问题&#xff0c;让员工不但要对过程负责&#…...