public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); System.setProperty("java.security.krb5.conf", "D:/project/lab-project/src/main/resources/kerberos/dev/krb5.conf"); System.setProperty("javax.security.auth.useSubjectCredsOnly", "false"); System.setProperty("java.security.auth.login.config", "D:/project/lab-project/src/main/resources/kerberos/dev/jaas.conf"); Configuration conf = new Configuration(); conf.set("hadoop.security.authentication", "kerberos"); try { UserGroupInformation.loginUserFromKeytab("c.dev.hdfs", "D:/project/lab-project/src/main/resources/kerberos/dev/ic.dev.hdfs.keytab"); System.out.println("鉴权ok"); UserGroupInformation.getCurrentUser().doAs(new PrivilegedAction<Object>() { @Override public Object run() { FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<>("connect-configs", new StringSchema(), getKafkaProperties()); consumer.setStartFromEarliest(); env.addSource(consumer).print(); try { env.execute("flink kafka test"); } catch (Exception e) { throw new RuntimeException(e); } return null; } }); } catch (IOException e) { System.out.println("连接异常"); throw new RuntimeException(e); } }
时间: 2024-02-10 10:35:16 浏览: 127
这段代码看起来是一个 Flink 程序,用于从 Kafka 消费数据。代码中涉及到了 Kerberos 认证,包括设置 Kerberos 配置、登录用户,以及设置 Jaas 配置等。在代码中,使用了 UserGroupInformation 类的 loginUserFromKeytab 方法来登录 Kerberos,并使用 doAs 方法来运行 Flink 应用程序。在 Flink 应用程序中,使用 FlinkKafkaConsumer 类来从 Kafka 中消费数据,并打印输出,最后通过 env.execute 方法来执行 Flink 应用程序。
需要注意的是,代码中的一些路径和配置信息需要根据实际情况进行修改,比如 krb5.conf 和 jaas.conf 的路径,以及 Kerberos principal 和 keytab 的路径等。同时,这段代码中的 Kerberos 认证需要与 Kafka 集群中的 Kerberos 认证设置相匹配,否则可能会导致认证失败。
相关问题
@Slf4j @SpringBootApplication @MapperScan({"org.jeecg.**.mapper", "com.sky.**.mapper"}) @EnableTransactionManagement() //@EnableFeignClients(basePackages = {"org.jeecg", "com.sky"}) @ComponentScan(basePackages = {"org.jeecg", "com.sky"}, excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = {DynamicDataSourceConfig.class, DynamicTenantInterceptor.class})) public class SkyPlatformSystemApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(SkyPlatformSystemApplication.class); } /** * 监听器:监听HTTP请求事件 * 解决RequestContextHolder.getRequestAttributes()空指针问题 * * @return */ @Bean public RequestContextListener requestContextListener() { return new RequestContextListener(); } public static void main(String[] args) throws UnknownHostException { // log.info("数据库密码:" + SecurityExtUtil.jiami("sky_mall")); ConfigurableApplicationContext application = SpringApplication.run(SkyPlatformSystemApplication.class, args); Environment env = application.getEnvironment(); String ip = InetAddress.getLocalHost().getHostAddress(); String port = env.getProperty("server.port"); String path = oConvertUtils.getString(env.getProperty("server.servlet.context-path")); log.info("\n-----------------------------------------------------------\n\t" + "Application Sky-Platform-Boot is running! Access URLs:\n\t" + "Local: \t\t\thttp://localhost:" + port + path + "/\n\t" + "External: \t\thttp://" + ip + ":" + port + path + "/\n\t" + "Swagger文档: \thttp://" + ip + ":" + port + path + "/doc.html\n" + "-----------------------------------------------------------"); }这是什么意思
这段代码是一个Java Spring Boot应用程序的入口类。它使用了Spring Boot的注解来配置和启动应用程序。
`@Slf4j` 是一个Lombok注解,用于自动生成日志记录器。它简化了在类中创建Logger对象的过程。
`@SpringBootApplication` 是一个组合注解,用于标记主应用程序类。它等效于使用`@Configuration`、`@EnableAutoConfiguration`和`@ComponentScan`这三个注解。
`@MapperScan` 用于扫描指定包下的Mapper接口,通常用于MyBatis配置。
`@EnableTransactionManagement` 启用Spring的事务管理功能。
`@EnableFeignClients` 用于启用Feign客户端,可以进行远程方法调用。
`@ComponentScan` 用于扫描指定包下的组件,包括控制器、服务、仓库等。
`extends SpringBootServletInitializer` 是为了支持将应用程序部署为WAR文件。
`configure()` 方法是为了配置SpringApplicationBuilder以支持WAR文件部署。
`@Bean` 注解用于声明一个bean,这里声明了一个RequestContextListener的实例。
`main()` 方法是应用程序的入口点,通过调用SpringApplication的静态方法`run()` 来启动应用程序。它还获取了应用程序的环境变量,并打印了应用程序的访问URL。
最后,使用`log.info()` 打印了应用程序运行时的访问URL信息。
springboot freemarker env.setVariable 在自定义标签里面 设置一个对象值
### 回答1:
在自定义标签中设置一个对象值,可以通过以下步骤完成:
1. 在自定义标签的类中,定义一个方法,该方法用于设置对象值。例如:
```
public void setObjectValue(Environment env, ObjectWrapper wrapper, TemplateModel[] args) throws TemplateModelException {
// 获取参数
String name = ((SimpleScalar) args[0]).getAsString();
Object value = wrapper.unwrap(args[1]);
// 设置对象值
env.setVariable(name, wrapper.wrap(value));
}
```
2. 在自定义标签类的构造函数中,将该方法注册到 Freemarker 中。例如:
```
public MyTag() {
// 注册 setObjectValue 方法
setTagName("setObjectValue");
registerMethod("setObjectValue", new Method() {
public Object exec(List arguments) throws TemplateModelException {
setObjectValue((Environment) arguments.get(0), (ObjectWrapper) arguments.get(1), (TemplateModel[]) arguments.get(2));
return null;
}
});
}
```
3. 在模板中使用自定义标签,并调用 setObjectValue 方法设置对象值。例如:
```
<@myTag.setObjectValue name="myObject" value=myValue />
```
其中,myTag 是自定义标签的名称,setObjectValue 是注册的方法名称,name 是变量名,value 是对象值。
### 回答2:
在Spring Boot中,可以使用FreeMarker模板引擎来进行页面的渲染,而在使用FreeMarker模板引擎的过程中,env.setVariable方法可用于在自定义标签中设置一个对象值。
具体的操作步骤如下:
1. 首先,在Spring Boot项目中引入FreeMarker的依赖。在pom.xml文件中添加以下代码:
```
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
```
2. 创建一个自定义标签的Java类,该类需要继承TemplateDirectiveModel接口,并重写其中的execute方法。在该方法中,使用env.setVariable方法来设置对象值。例如:
```
public class MyCustomTag implements TemplateDirectiveModel {
@Override
public void execute(Environment env, Map params, TemplateModel[] loopVars,
TemplateDirectiveBody body) throws TemplateException, IOException {
// 设置一个对象值
YourObject obj = new YourObject();
env.setVariable("obj", ObjectWrapper.DEFAULT_WRAPPER.wrap(obj));
// 其他操作...
}
}
```
3. 在FreeMarker的模板文件中使用该自定义标签,并获取设置的对象值。例如:
```
<@myCustomTag>
<p>${obj.property}</p>
</@myCustomTag>
```
在上述代码中,<@myCustomTag>为自定义标签的标签名,可以根据需要进行更改。`${obj.property}`表示获取设置的对象值的某个属性。
通过以上步骤,我们可以在自定义标签中使用env.setVariable方法来设置一个对象值,并在模板文件中获取该对象值进行渲染。
### 回答3:
在Spring Boot中使用Freemarker,可以通过env.setVariable方法在自定义标签中设置一个对象的值。
首先,在自定义标签的实现类中,定义一个方法,用于获取并设置对象的值。例如:
public class MyCustomTag extends TemplateDirectiveModel {
@Override
public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException {
// 获取对象值
Object value = getValueFromSomewhere();
// 设置对象值
env.setVariable("myObject", ObjectWrapper.DEFAULT_WRAPPER.wrap(value));
// 执行自定义标签的内容
body.render(env.getOut());
}
private Object getValueFromSomewhere() {
// 获取对象值的逻辑
// ...
return value;
}
}
然后,在模板中使用自定义标签,并使用"${myObject}"获取对象的值。例如:
<@myCustomTag></@myCustomTag>
${myObject}
以上代码中,在执行自定义标签的execute方法时,会调用getValueFromSomewhere方法获取对象的值,并使用env.setVariable方法将获取的值设置到环境变量"myObject"中。在模板中可以通过"${myObject}"来获取这个对象的值,并进行显示等操作。
总结:通过env.setVariable方法可以在自定义标签中设置一个对象的值,然后在模板中使用该对象的值进行相应的操作。
阅读全文