Avatar
0
Thành Lê Văn Teacher
Sự khác biệt giữa Message Và Event là gì?
Xin chào mọi người. Mọi người cho em hỏi sự khác biệt giữa Message và Event là gì ạ?<p> Khi nào mình sẽ dùng Message và khi nào dùng Event ạ ? </p>
Answer
Avatar
0
Phạm Quang Beginner
Phạm Quang Beginner
Mapping data JSON
em gặp 1 bài toán yêu cầu lấy dữ liệu từ URL rồi hiển thị output ra như trên, chỉ lấy trường cha, trường con và type<p> input: </p> <p> "name": { </p> <p> "key": "name", </p> <p> "type": "string-object", </p> <p> "type_view": "text", </p> <p> "field_default": 1, </p> <p> "count": 184259, </p> <p> "type_al": "string" </p> <p> }, </p> <p> OUTPUT: "name"{"type":"string-object"} </p> <p> input: </p> <p> "emails": { </p> <p> "key": "emails", </p> <p> "type": "array-object", </p> <p> "type_view": "emails", </p> <p> "list_field": { </p> <p> "value": { </p> <p> "key": "value", </p> <p> "type": "string", </p> <p> "type_view": "string", </p> <p> "type_al": "string" </p> <p> }, </p> <p> "tags": { </p> <p> "key": "tags", </p> <p> "type": "array-object", </p> <p> "type_view": "chon-nhieu", </p> <p> "type_al": "string" </p> <p> }, </p> <p> "hash": { </p> <p> "key": "hash", </p> <p> "type": "string", </p> <p> "type_view": "string", </p> <p> "type_al": "string" </p> <p> }, </p> <p> "encrypt": { </p> <p> "key": "encrypt", </p> <p> "type": "string", </p> <p> "type_view": "string", </p> <p> "type_al": "string" </p> <p> }, </p> <p> "encrypt_vccorp": { </p> <p> "key": "encrypt_vccorp", </p> <p> "type": "string", </p> <p> "type_view": "string", </p> <p> "type_al": "string" </p> <p> }, </p> <p> OUTPUT: </p> <p> "emails": { </p> <p> "list_field": { </p> <p> field1_String_1 </p> <p> filed2_array-object </p> <p> field3_string_2 </p> <p> field4_string_3 </p> <p> field_string_4 </p> <p> }, </p>
Answer
Avatar
1
Shi Shi Beginner
Shi Shi Beginner
Call chéo db microservices
xin chào mọi người, mọi người có thể giải thích giúp em tại sao không lên call chéo db trong microservice không ạ. Em cảm ơn.
Answer
Avatar
1
Shi Shi Beginner
Shi Shi Beginner
giải quyết bài toán file lớn
xin chào mọi người, <ol start="1"> <li>em muốn hỏi là thường các big tech khi có bài toán download file dung lượng lớn bị timeout họ sẽ giải quyết theo kiểu nào ạ.</li> <li>một câu hỏi nữa em muốn hỏi là khi lượng request nhiều cùng call vào api xuất file lớn đó thì giải pháp thường dùng nhất của họ tránh chết hệ thống là gì, mọi người có thể giải thích chi tiết một chút giúp em được không ạ, em cảm ơn.</li></ol>
Answer
Avatar
1
c4ih0xjtex5id51b Beginner
hỏi về native query
Mọi người cho em hỏi hiện tại em muốn thêm OPTION(RECOMPILE) vào cuối câu native query nhưng mà do đang dùng jpa nên cái pagination nó tự add offset vào cuối thành ra cái OPTION(RECOMPILE) lại đứng trước offset :( Em xin hướng giải quyết ạ
Answer
Avatar
1
Shi Shi Beginner
Shi Shi Beginner
jwt in java
em chào mọi người, mọi người cho e hỏi e dùng thuật ES256 để gen token <p> nhưng khi có token để verify ví dụ như này </p> <p> public key : <div class="markdown-block position-relative overflow-auto source-"> <pre> MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE02Ar8685UapqDlOT8TneixaeR2Uu0tRu0R8WTG5ATA7j3Nk9x6poNYiH/Ez6jhwQg/ocioHsjzOOStUeSN8aIg== </pre> </div>và token : </p> <div class="markdown-block position-relative overflow-auto source-"> <pre> eyJhbGciOiJFUzI1NiJ9.eyJzdWIiOiJ0ZXN0LW5vYyIsImF1dGgiOiJCSV9FWFBPUlQiLCJlbWFpbCI6ImFiYy5jb20udm4iLCJmdWxsX25hbWUiOiJCVSBOT0MiLCJST0xFX0pXVCI6IkJJX0VYUE9SVCIsIk1OVl9KV1QiOiJ0ZXN0LW5vY19ub2MiLCJleHAiOjk5OTk5OTk5OTk5OTk5fQ.xdtY5Rbay7I5733gBOzSoPFrADCwqE7PhuNGd0zdkyB81wbGunFny2CjagQfgVr_kg0RviUmusjGmjiVk3zB_Q </pre> </div><p> thì khi verify tại sao e thêm 1 ký tự bất kỳ vào cuối token nó vẫn verify thành công ạ, nhưng thêm đến ký tự thứ 2 vào cuối hoặc chỉ thêm ký tự . vào cuối thì verify thất bại, nếu theo nguyên tắc e làm sai khác token đi so với bán đầu nó phải verify thất bại luôn chứ ạ, mong mọi người giải đáp giúp e, e cảm ơn. </p> <div class="markdown-block position-relative overflow-auto"> <pre> <span class="pl-k">public</span> <span class="pl-k">class</span> GenToken { <span class="pl-k">public</span> <span class="pl-k">static</span> <span class="pl-k">void</span> main(String[] args) <span class="pl-k">throws</span> Exception { KeyPair keyPair = generateECKeyPair(); String publicKeyBase64 = Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded()); String privateKeyBase64 = Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded()); String jwtToken = createJwtToken(publicKeyBase64, privateKeyBase64); } <span class="pl-k">private</span> <span class="pl-k">static</span> KeyPair generateECKeyPair() <span class="pl-k">throws</span> NoSuchAlgorithmException, InvalidAlgorithmParameterException { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(<span class="pl-s">"EC"</span>); ECGenParameterSpec ecGenParameterSpec = <span class="pl-k">new</span> ECGenParameterSpec(<span class="pl-s">"secp256r1"</span>); keyPairGenerator.initialize(ecGenParameterSpec); <span class="pl-k">return</span> keyPairGenerator.generateKeyPair(); } <span class="pl-k">private</span> <span class="pl-k">static</span> String createJwtToken(String publicKeyBase64, String privateKeyBase64) { Date expirationDate = <span class="pl-k">new</span> Date(99999999999999999L); <span class="pl-k">return</span> Jwts.builder() .setSubject(<span class="pl-s">"test-noc"</span>) .claim(<span class="pl-s">"auth"</span>, <span class="pl-s">"EXPORT"</span>) .claim(<span class="pl-s">"email"</span>, <span class="pl-s">"abc.com.vn"</span>) .claim(<span class="pl-s">"full_name"</span>, <span class="pl-s">"BU"</span>) .claim(<span class="pl-s">"ROLE_JWT"</span>, <span class="pl-s">"EXPORT"</span>) .claim(<span class="pl-s">"MNV_JWT"</span>, <span class="pl-s">"test-manv"</span>) .setExpiration(expirationDate) .signWith( SignatureAlgorithm.ES256, getPrivateKey(privateKeyBase64) ) .compact(); } <span class="pl-k">private</span> <span class="pl-k">static</span> PrivateKey getPrivateKey(String privateKeyBase64) { <span class="pl-k">try</span> { byte[] keyBytes = Base64.getDecoder().decode(privateKeyBase64); KeyFactory keyFactory = KeyFactory.getInstance(<span class="pl-s">"EC"</span>); <span class="pl-k">return</span> keyFactory.generatePrivate(new PKCS8EncodedKeySpec(keyBytes)); } <span class="pl-k">catch</span> (Exception e) { <span class="pl-k">throw</span> <span class="pl-k">new</span> RuntimeException("Error loading <span class="pl-k">private</span> key", e); } } </pre> </div><p> còn đây là class verify token của e </p> <div class="markdown-block position-relative overflow-auto"> <pre> <span class="pl-k">public</span> <span class="pl-k">class</span> JwtProcess { SignatureAlgorithm algorithm; <span class="pl-k">private</span> PublicKey getPublicKey(String publicKeyBase64) <span class="pl-k">throws</span> Exception { algorithm = SignatureAlgorithm.ES256; byte[] decoded = Base64.getDecoder().decode(publicKeyBase64); X509EncodedKeySpec spec = <span class="pl-k">new</span> X509EncodedKeySpec(decoded); KeyFactory kf = KeyFactory.getInstance(algorithm.isRsa() ? <span class="pl-s">"RSA"</span> : <span class="pl-s">"EC"</span>); <span class="pl-k">return</span> kf.generatePublic(spec); } <span class="pl-k">public</span> <span class="pl-k">boolean</span> verifyToken(String token, String publicKeyBase64) { <span class="pl-k">try</span> { PublicKey publicKey = getPublicKey(publicKeyBase64); Jwts.parserBuilder().setSigningKey(publicKey).build().parseClaimsJws(token); <span class="pl-k">return</span> true; } <span class="pl-k">catch</span> (Exception e) { e.printStackTrace(); <span class="pl-k">throw</span> <span class="pl-k">new</span> ObjectException(<span class="pl-s">"</span> Could <span class="pl-k">not</span> verify JWT token integrity! <span class="pl-s">"</span>); } } <span class="pl-k">public</span> JwtClaims decodeToken(String token, String publicKey) <span class="pl-k">throws</span> Exception { Claims claims = Jwts.parser() .setSigningKey(getPublicKey(publicKey)) .parseClaimsJws(String.valueOf(token)).getBody(); <span class="pl-k">return</span> <span class="pl-k">new</span> JwtClaims( claims.getSubject(), claims.get(<span class="pl-s">"auth"</span>).toString(), claims.get(<span class="pl-s">"email"</span>).toString(), claims.get(<span class="pl-s">"full_name"</span>).toString(), claims.get(<span class="pl-s">"ROLE_JWT"</span>).toString(), claims.get(<span class="pl-s">"MNV_JWT"</span>).toString(), claims.get(<span class="pl-s">"exp"</span>).toString() ); } } </pre> </div>
Answer
Avatar
0
Khoi Nguyen Beginner
Khoi Nguyen Beginner
Thiết kế base Authenticate and Authorization
Em muốn thiết kế 1 base Authenticate and Authorization để dùng lại cho các project ạ. Mọi người đóng góp cho em về ERD của em với ạ. Em cảm ơn. <img src="/api/v1/media/06699a9d2eef4742423e778fa350d0a1abf91a2a3097f4f3758df998656e999b.png" alt="ERD.png">
Answer
Avatar
0
monkey Enlightened
monkey Enlightened
Fix issue 'parent.relativePath' of POM points at abc instead of org.youngmonkeys:ezyplatform-parent, please verify your project structure
I got an issue: 'parent.relativePath' of POM org.youngmonkeys:elearning:1.0.0 (/Users/abc/Downloads/elearning/pom.xml) points at ab. instead of org.youngmonkeys:ezyplatform-parent, please verify your project structure.
Answer
Avatar
0
monkey Enlightened
monkey Enlightened
Khi scroll xuống cuối mà gặp cái footer thì nó phải dừng lại
Mình muốn khi scroll xuống cuối mà gặp cái footer thì nó phải dừng lại để tránh bị chui xuống hoặc đè lên cái footer cho trang này: <a href="https://ezyplatform.com/market/items/ezysmashers/docs/get-started" target="_blank">https://ezyplatform.com/market/items/ezysmashers/docs/get-started</a>
Answer
Avatar
0
Shi Shi Beginner
Shi Shi Beginner
connection pool in java
em chào anh, em có một câu hỏi a có thể giải thích giúp em với được không ạ <p> bài toán của em là dự án e có 2 người code </p> <p> 1 người code sử dụng jpa để kết nối với postgres có sử dụng </p> <div class="markdown-block position-relative overflow-auto"> <pre> spring.datasource.hikari.maximum-pool-size=10 </pre> </div><p> nhưng người 2 sử dụng jdbc và tự tạo một class tạo connection pool riêng như này để lấy ra connection </p> <div class="markdown-block position-relative overflow-auto"> <pre> <span class="pl-s">@Component</span> <span class="pl-k">public</span> <span class="pl-k">class</span> ConnectionPoolHiraki { <span class="pl-k">private</span> <span class="pl-k">static</span> HikariDataSource ds; <span class="pl-k">static</span> <span class="pl-k">void</span> createPool() { HikariConfig config = <span class="pl-k">new</span> HikariConfig(); config.setDriverClassName(<span class="pl-s">"org.postgresql.Driver"</span>); config.setJdbcUrl( <span class="pl-s">"jdbc:postgresql://localhost:5432/postgres"</span> ); config.setUsername(<span class="pl-s">"postgres"</span>); config.setPassword(<span class="pl-s">"postgres"</span>); config.setMinimumIdle(5); config.setMaxLifetime(1800000); config.setMaximumPoolSize(20); ds = <span class="pl-k">new</span> HikariDataSource( config ); } <span class="pl-k">public</span> <span class="pl-k">static</span> <span class="pl-k">synchronized</span> Connection getPool() <span class="pl-k">throws</span> SQLException { <span class="pl-k">if</span> (ds == null) createPool(); <span class="pl-k">return</span> ds.getConnection(); } } </pre> </div>hoặc nếu không dùng class đó thì em dùng class <div class="markdown-block position-relative overflow-auto"> <pre> <span class="pl-s">@Component</span> <span class="pl-k">public</span> <span class="pl-k">class</span> PostgresFactory { <span class="pl-s">@Value</span>(<span class="pl-s">"${postgres.servers.url}"</span>) <span class="pl-k">private</span> String dataBaseUrl; <span class="pl-s">@Value</span>(<span class="pl-s">"${postgres.user}"</span>) <span class="pl-k">private</span> String dataBaseUser; <span class="pl-s">@Value</span>(<span class="pl-s">"${postgres.password}"</span>) <span class="pl-k">private</span> String dataBasePassword; <span class="pl-k">private</span> <span class="pl-k">static</span> PostgresFactory ourInstance; <span class="pl-k">public</span> <span class="pl-k">static</span> PostgresFactory getInstance() { <span class="pl-k">if</span> (ourInstance == null) { <span class="pl-k">synchronized</span> (PostgresFactory .class) { <span class="pl-k">if</span> (ourInstance == null) { ourInstance = <span class="pl-k">new</span> PostgresFactory(); } } } <span class="pl-k">return</span> ourInstance; } <span class="pl-k">private</span> PostgresFactory() { } </pre> </div> <p> vậy câu hỏi e muốn hỏi anh thì trường hợp này lên xử lý thế nào ạ, nếu em dùng class ConnectionPoolHiraki thì lại tạo ra </p> <p> 1 pool connection song song với pool đc tạo từ jpa </p> <p> nhưng nếu sử dụng class PostgresFactory nó lại tạo mới connection đến db mỗi lần vào thì giờ e đang chưa biết lên thống nhất như nào cho ổn nhất ạ </p>
Answer
Avatar
0
Tran Duy Tung Beginner
Tran Duy Tung Beginner
Cấu hình Async và Cluster cho Kafka
Em chào anh ạ. <p> Hiện tại em đang làm 1 project kết nối giữa kafka và mongodb, em đang thực hiện như sau: </p> <ol start="1"> <li>, application.yml</li> </ol> <div class="markdown-block position-relative overflow-auto source-java"> <pre> spring: mongo: enabled: false hosts: - host: 192.168.101.43 port: 27017 username: chatbot password: chatbot@vtcc authSource: chatbot_platform kafka: bootstrap: servers: 192.168.101.43:9092, 192.168.101.69:9092 topic: name: notification orderName: order topic-json: name: notification orderName: order consumer: group: myGroup orderGroup: orderGroup username: kafka password: 123456aA@ </pre> </div>2., AsyncConfig<div class="markdown-block position-relative overflow-auto source-java"> <pre> <span class="pl-s">@Configuration</span> <span class="pl-k">public</span> <span class="pl-k">class</span> AsyncConfig { <span class="pl-s">@Bean</span>(name = <span class="pl-s">"asyncTask"</span>) <span class="pl-k">public</span> ThreadPoolTaskExecutor asyncTask() { ThreadPoolTaskExecutor executor = <span class="pl-k">new</span> ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); // Số lượng luồng cố định executor.setMaxPoolSize(50); // Số lượng luồng tối đa executor.setQueueCapacity(100); // Số lượng tác vụ chờ trong hàng đợi executor.setThreadNamePrefix(<span class="pl-s">"asyncTask-"</span>); executor.setKeepAliveSeconds(60); executor.initialize(); <span class="pl-k">return</span> executor; } <span class="pl-s">@Bean</span> <span class="pl-k">public</span> ExecutorService asyncExecutor() { <span class="pl-k">return</span> Executors.newCachedThreadPool(); } } </pre> </div>3., Kafka config<div class="markdown-block position-relative overflow-auto source-java"> <pre> <span class="pl-s">@EnableKafka</span> <span class="pl-s">@Configuration</span> <span class="pl-k">public</span> <span class="pl-k">class</span> KafkaConsumerConfig { <span class="pl-s">@Value</span>(<span class="pl-s">"${spring.kafka.bootstrap.servers}"</span>) private String bootstrapAddress; <span class="pl-s">@Value</span>(<span class="pl-s">"${spring.kafka.consumer.group}"</span>) private String consumerGroup; <span class="pl-s">@Value</span>(<span class="pl-s">"${spring.kafka.consumer.orderGroup}"</span>) private String orderGroup; <span class="pl-s">@Value</span>(<span class="pl-s">"${spring.kafka.username}"</span>) private String username; <span class="pl-s">@Value</span>(<span class="pl-s">"${spring.kafka.password}"</span>) private String password; <span class="pl-s">@Bean</span> <span class="pl-k">public</span> ConsumerFactory&lt;String, String&gt; smartNotificationConsumerFactory() { Map&lt;String, Object&gt; props = <span class="pl-k">new</span> HashMap&lt;&gt;(); props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); props.put(ConsumerConfig.GROUP_ID_CONFIG, orderGroup); props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); props.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, <span class="pl-s">"30000"</span>); <span class="pl-k">if</span> (username != null && password != null) { props.put(<span class="pl-s">"security.protocol"</span>, <span class="pl-s">"SASL_PLAINTEXT"</span>); props.put(<span class="pl-s">"sasl.mechanism"</span>, <span class="pl-s">"PLAIN"</span>); props.put(<span class="pl-s">"sasl.jaas.config"</span>, "org.apache.kafka.common.security.plain.PlainLoginModule required username="" + username + <span class="pl-s">""</span> password="" + password + <span class="pl-s">"";"</span>); } <span class="pl-k">return</span> <span class="pl-k">new</span> DefaultKafkaConsumerFactory&lt;&gt;(props); } <span class="pl-s">@Bean</span> <span class="pl-k">public</span> ConcurrentKafkaListenerContainerFactory&lt;String, String&gt; smartNotificationKafkaListenerContainerFactory( <span class="pl-s">@Qualifier</span>(<span class="pl-s">"asyncTask"</span>) ThreadPoolTaskExecutor executor) { ConcurrentKafkaListenerContainerFactory&lt;String, String&gt; factory = <span class="pl-k">new</span> ConcurrentKafkaListenerContainerFactory&lt;&gt;(); factory.setConsumerFactory(smartNotificationConsumerFactory()); factory.setConcurrency(3); <span class="pl-k">return</span> factory; } } </pre> </div>Vì là lần đầu tiên làm nên em không rõ là với những cấu hình trên thì đã đáp ứng được async và kết nối theo cụm cluster đến kafka chưa ạ. Và làm cách nào để có thể kiểm tra đưọc ạ.<p> Em cảm ơn anh! </p>
Answer
Avatar
0
vm5j9xlxja4j0rwc Beginner
Cho em hỏi về api document của viettel post ạ
Cho em hỏi về api document của viettel post ạ, quy trình lấy token như thế nào ạ. Em cảm ơn
Answer