java - oracle.AQ.AQOracleSQLException:无效的列类型
问题描述
我正在尝试通过 java 调用 DBMS_AQ,但在调用 enqueue 方法时出现以下异常。(Spring boot)。在入队时,我使用了一个用 java 制作的实体,它类似于队列有效负载数据的 dbms 对象。请帮忙。
@SpringBootTest(classes = OrderProvisioningApplication.class)
@RunWith(SpringRunner.class)
public class AqConnectionTest {
@Autowired
private DataSource dataSource;
@Test
public void AqConnectionPublishTest() throws Exception{
java.sql.Connection aqconn = dataSource.getConnection();
aqconn.setAutoCommit(false);
OracleConnection oracleConnection = aqconn.unwrap(OracleConnection.class);
AQSession aqsession = null;
// Register the Oracle AQ Driver
Class.forName("oracle.AQ.AQOracleDriver");
try {
AQEnqueueOption enqueueOption = new AQEnqueueOption();
enqueueOption.setVisibility(AQEnqueueOption.VISIBILITY_ONCOMMIT);
aqsession = AQDriverManager.createAQSession(oracleConnection);
AQQueue queue = aqsession.getQueue("somehost", "somename");
AQMessage msg = ((AQOracleQueue) queue).createMessage();
AQMessageProperty msgProp = new AQMessageProperty();
msgProp.setExpiration(AQMessageProperty.EXPIRATION_NEVER);
AQObjectPayload payload = msg.getObjectPayload();
SwscOrderEventMessageObject payloadData = new SwscOrderEventMessageObject(new BigDecimal(123456),
new BigDecimal(123456), "Hello", new Date(), new BigDecimal (123456), "ABC" , new Date());
payload.setPayloadData(payloadData);
msg.setObjectPayload(payload);
queue.startEnqueue();
queue.enqueue(enqueueOption, msg);
aqconn.commit();
System.out.println("Message succesfully enqueued..");
}
catch (Exception ex) {
ex.printStackTrace();
}
finally {
aqsession.close();
aqconn.close();
}
}
}
用于制作payload的实体如下:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SwscOrderEventMessageObject implements CustomDatum{
private BigDecimal headerId;
private BigDecimal lineId;
private String message;
private Date eShipConfirmDate;
private BigDecimal holdIn;
private String deliveryId;
private Date fileGenerationDate;
@Override
public Datum toDatum(OracleConnection arg0) throws SQLException {
// TODO Auto-generated method stub
return null;
}
}
以下正在发生的异常堆栈跟踪:
oracle.AQ.AQOracleSQLException: Invalid column type
at oracle.AQ.AQOracleQueue.enqueue(AQOracleQueue.java:1268)
at com.cisco.csit.shipconfirm.test.AqConnectionTest.AqConnectionPublishTest(AqConnectionTest.java:61)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:73)
at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:83)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
这是我在数据库中的队列:
BEGIN SYS.DBMS_AQADM.STOP_QUEUE ( QUEUE_NAME => 'ABC'); SYS.DBMS_AQADM.DROP_QUEUE ( QUEUE_NAME => 'ABC'); END;
BEGIN SYS.DBMS_AQADM.CREATE_QUEUE ( QUEUE_NAME => 'ABC ,
QUEUE_TABLE => 'XYZ ,
QUEUE_TYPE => SYS.DBMS_AQADM.NORMAL_QUEUE ,
MAX_RETRIES => 5 ,
RETRY_DELAY => 0 ,
RETENTION_TIME => 0 ); END;
解决方案
推荐阅读
- python - Python将文字反斜杠检测为续行字符
- java - 捕获特定异常子类型的列表,而不是未检查的异常
- sql - Oracle DB,对于每一行,删除表中任何类似的时间戳
- macos - macOS 上的 IntelliJ `introduce parameter` 快捷方式显示首选项
- typescript - 嵌套 Typescript 映射值类型
- java - 用于图像视图的 Whatsapp 无障碍服务 (Android Studio)
- spring - 使用 Atomikos 的 Spring 事务管理
- winforms - Visual Studio 社区 2019 中缺少 Windows 窗体 (.NET Core)
- mysql - 如何解决 MYSQL 8.0 中的 1290 错误代码
- python - PyTorch 安装失败找不到满足要求的版本