我想用Netty EventLoop
来测试:
我知道EmbeddedChannel
并且我在一些测试中使用它.但我想要的是单元测试和集成测试之间的问题,这些测试对于某些极端情况仍然是盲目的.断开连接 - 重新连接和ping方案会大量使用计划任务.我可以添加具有巨大延迟的确定性,但我不希望我的测试等待几秒或更长时间.因此,使用Netty EventLoop
看起来就像是解决方案.
我已经编写了至少对我有用的代码.
ScheduledFutureTask#nanoTime
为返回我的值.NioEventLoopGroup
所以我抓住任务截止日期.ScheduledFutureTask#nanoTime
.有趣的是,Netty代码只依赖于ScheduledFutureTask#nanoTime
(伟大的设计!)返回的值,所以这是一个非常有限的变化.我使用ByteBuddy来避免复制粘贴Netty代码,但这并不重要.
一个非常简单的测试就像InstrumentedNioEventLoopGroupTest
在调度1个任务时失败,因为它AbstractScheduledEventExecutor#pollScheduledTask(long)
有一个空队列.
我发现每个NioEventLoop
都有自己的任务队列,并且可能不会发生队列轮询,因为NioEventLoopGroup
等待a Selector
发出信号,这是有道理的.所以我将线程数NioEventLoopGroup
增加到2.我也尝试设置ioRatio
为1并安排更多任务,没有更好的结果.使用调试器,似乎我的任务总是"落在"未轮询的任务队列中.
有什么想法使这项工作?我正在使用Netty 4.1.24.Final.
ScheduledFutureTaskHack.java
package com.otcdlink.chiron.integration.harness;
import com.otcdlink.chiron.toolbox.ToStringTools;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.agent.ByteBuddyAgent;
import net.bytebuddy.dynamic.loading.ClassReloadingStrategy;
import net.bytebuddy.implementation.MethodDelegation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.concurrent.Future;
import java.util.function.LongSupplier;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static net.bytebuddy.matcher.ElementMatchers.isPackagePrivate; …
Run Code Online (Sandbox Code Playgroud) 我正在使用带有HTTPS和有效证书的Jetty,我不确定是否正确,因为密码套件似乎SSL_NULL_WITH_NULL_NULL
在服务器日志中.但是,客户端日志看起来不错.
长话故事:我正在附加一个期望Jetty-7.6.10的Java样本和两个用于创建密钥库和信任库的脚本.
JettyHttpsForStackOverflow
一起运行客户端和服务器,或单独运行以解除日志.
该create-chains.sh
脚本创建密钥库和信任库.密钥库包含以从临时密钥库生成的根证书颁发机构结束的链.它使用证书颁发机构和中间证书复制真实案例.
该create-single-autosigned.sh
脚本也创建密钥库和信任库,但具有自签名证书.
请注意,它SSL_NULL_WITH_NULL_NULL
显示为服务器的密码套件,包含两个证书链.
我认为服务器域名没有问题.对于在正确签名的证书中具有与专有名称匹配的域名的计算机上运行的服务器,我遇到了同样的问题.SSLLab确认我服务器上的SSL工作正常(B级),谷歌Chrome连接愉快.
我认为Jetty客户端没有问题.当我使用它时,它只是调用SSLContextFactory
我正在设置创建一个SSLSocket
.令人惊讶的是,在Jetty客户端日志中,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
似乎是正在使用的密码套件.
SSL_NULL_WITH_NULL_NULL
进入Jetty服务器日志是否正常?如果没有,那该怎么办呢?
create-single-autosigned.sh
#!/bin/bash
rm their-keystore.jks 2> /dev/null
rm my-keystore.jks 2> /dev/null
rm my-truststore.jks 2> /dev/null
echo "===================================================="
echo "Creating fake third-party chain ca2 -> ca1 -> ca ..."
echo "===================================================="
keytool -genkeypair -alias ca -dname cn=ca \
-validity 10000 -keyalg RSA -keysize 2048 \
-ext BasicConstraints:critical=ca:true,pathlen:10000 \
-keystore their-keystore.jks -keypass Keypass -storepass Storepass
keytool -genkeypair -alias …
Run Code Online (Sandbox Code Playgroud) 我正在尝试转换Ansible Playbook中列表项的某些字段。这是最简单的复制路径,跳过了转换。结果应与users
变量相同。
---
# Run with:
# ansible-playbook -i "localhost," loop3.yml
- hosts: localhost
connection: local
gather_facts: false
vars:
users:
- name: paul
uid: 1
- name: pete
uid: 2
tasks:
- set_fact:
args:
useritem:
name: '{{ item.name }}'
uid: '{{ item.uid }}'
with_items:
- users
register: sf_result
- debug: var=sf_result
- set_fact:
userslist: "{{ sf_result.results | map(attribute='ansible_facts.useritem') | list }}"
- debug: var=userslist
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
TASK [set_fact useritem={u'name': u'{{ item.name }}', u'uid': u'{{ item.uid }}'}] ***
fatal: [localhost]: …
Run Code Online (Sandbox Code Playgroud)