【问题标题】:Using Kafka Producer inside oracle DB在 oracle DB 中使用 Kafka Producer
【发布时间】:2021-03-08 05:22:12
【问题描述】:

我正在尝试使用自定义 java 类直接将消息从 Oracle 发布到 Kafka 代理,因为我在 oracle 中上传了所需的库并使用 oracle 函数/过程调用 java 函数。基本的 java 函数工作正常,但 Kafka 正在初始化并使用的函数抛出未捕获的异常。即使我将整个函数体放在 try-catch 块中,但仍然没有将我的自定义异常作为消息。

我正在使用具有 JVM 版本 1.8 的 Oracle 12C。

此消息在 java 函数调用时在 oracle SQL 提示符上弹出(java.lang.NoClassDefFound 错误)。

我为我的自定义类创建了一个 jar 文件,并将它与它的受人尊敬的库一起上传到 oracle DB。 我使用以下命令上传了库文件。

loadjava -u <user>/<Password>@DB -resolve <library>.jar 

请告诉如何从 oracle 内部初始化 Kafka Producer 并开始发送消息

如何调试在 oracle DB 中加载的 java 函数。

下面给出了我的自定义类

public class KafkaPublisher { 
static ProducerRecord<String, String> PR = null; 
static Producer<String, String> producer = null; 
static Properties prop = new Properties(); 

public static void init() { 
prop.put("bootstrap.servers", "111.11.11.11:9092"); 
prop.put("acks", "1"); 
prop.put("retries", "0"); 
prop.put("batch.size", "16384"); 
prop.put("linger.ms", "1"); 
prop.put("buffer.memory", "33554432"); 
prop.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); 
prop.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); 

} 

public static String push(String data) { 
String response = "No responce"; 
init(); 
try { 
producer = new KafkaProducer<String, String>(prop); 
PR = new ProducerRecord<String, String>("topic1", data); 
Future<RecordMetadata> future = producer.send(PR); 
RecordMetadata rMetaData = future.get(); 
response = "Current Offset: " + rMetaData.offset(); 
} catch (Exception e) { 
response = "Message: " + e.getMessage() + " Cause: " + e.getCause(); 
} 
return response; 
} 

public static String getProperties(String msg) { 
return "My message: " + msg + prop.toString(); 
} 
}

function getProperties(String msg) 工作正常,但功能 推送(字符串数据)不起作用。

【问题讨论】:

  • NoClassDefFoundError 应该告诉您找不到哪个类。这将指示哪个库丢失/未正确加载。
  • @MichalBorowiecki 除了这个 oracle 没有显示任何其他消息这就是为什么调试变得很糟糕......
  • @rahul 你找到解决方案了吗?

标签: java oracle apache-kafka kafka-producer-api loadjava


【解决方案1】:

您将哪些库加载到数据库中? 对我来说,我缺少 slf4j-simple jar 库。

您还需要向您的 dbuser 授予这些权限:

exec dbms_java.grant_permission( <DB_USER>, 'SYS:javax.management.MBeanServerPermission', 'createMBeanServer', '' )
exec dbms_java.grant_permission( <DB_USER>, 'SYS:javax.management.MBeanTrustPermission', 'register', '' )
exec dbms_java.grant_permission( <DB_USER>, 'SYS:javax.management.MBeanPermission', '*', '*' )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-15
    • 2018-02-22
    • 2018-03-23
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多