{"id":1591,"date":"2010-05-05T12:19:38","date_gmt":"2010-05-05T17:19:38","guid":{"rendered":"http:\/\/jianmingli.com\/wp\/?p=1591"},"modified":"2010-08-03T11:33:24","modified_gmt":"2010-08-03T16:33:24","slug":"oracle-oc4j-aq-tutorial-myaqtest","status":"publish","type":"post","link":"https:\/\/jianmingli.com\/wp\/?p=1591","title":{"rendered":"Oracle OC4J AQ JMS Test"},"content":{"rendered":"<span id=\"Overview\"><h2>Overview<\/h2><\/span>\n<p>* Download <a href=\"http:\/\/www.oracle.com\/technology\/tech\/java\/oc4j\/1013\/how_to\/how-to-connect-to-oemsjmsd\/how-to-connect-to-oemsjmsd.zip\">how-to-connect-to-oemsjmsd.zip<\/a><br \/>\n* Start JDev (10.1.3.3.0)<br \/>\n* Setup AQ<br \/>\n* Create Resource Adapter<br \/>\n* Create EAR and deploy EAR<br \/>\n* Test with a client<\/p>\n<span id=\"Setup_AQ\"><h2>Setup AQ<\/h2><\/span>\n<p>* Create MyAQUser.sql as follows:<\/p>\n<pre lang=\"sql\">\r\nDROP USER MyAQUser CASCADE;\r\n\r\nGRANT connect, resource,AQ_ADMINISTRATOR_ROLE TO MyAQUser IDENTIFIED BY MyAQUserPass;\r\nGRANT execute ON sys.dbms_aqadm TO MyAQUser;\r\nGRANT execute ON sys.dbms_aq    TO MyAQUser;\r\nGRANT execute ON sys.dbms_aqin  TO MyAQUser;\r\nGRANT execute ON sys.dbms_aqjms TO MyAQUser;\r\n\r\nconnect MyAQUser\/MyAQUserPass;\r\n-- Create table to hold the queue, then create queue.\r\n-- For topics multiple_consumers must be true\r\nBEGIN\r\n   DBMS_AQADM.CREATE_QUEUE_TABLE(\r\n        Queue_table => 'QTab',\r\n        Queue_payload_type => 'SYS.AQ$_JMS_MESSAGE',\r\n        sort_list => 'PRIORITY,ENQ_TIME',\r\n        multiple_consumers => false,\r\n        compatible => '8.1.5');\r\n\r\n   DBMS_AQADM.CREATE_QUEUE(\r\n      Queue_name => 'MY_QUEUE',\r\n      Queue_table => 'QTab');\r\n\r\n   DBMS_AQADM.START_QUEUE(\r\n      queue_name => 'MY_QUEUE');\r\n\r\n   DBMS_AQADM.CREATE_QUEUE_TABLE(\r\n        Queue_table => 'TTab',\r\n        Queue_payload_type => 'SYS.AQ$_JMS_MESSAGE',\r\n        sort_list => 'PRIORITY,ENQ_TIME',\r\n        multiple_consumers => true,\r\n        compatible => '8.1.5');\r\n\r\n   DBMS_AQADM.CREATE_QUEUE(\r\n      Queue_name => 'MY_TOPIC',\r\n      Queue_table => 'TTab');\r\n\r\n   DBMS_AQADM.START_QUEUE(\r\n      queue_name => 'MY_TOPIC');\r\nEND;\r\n\/\r\n<\/pre>\n<p>* Connect sys as sysdba<br \/>\n* @MyAQUser.sql<\/p>\n<span id=\"Resource_Adapter\"><h2>Resource Adapter<\/h2><\/span>\n<span id=\"Overview_1\"><h3>Overview<\/h3><\/span>\n<p>* Create an application called &#8216;MyAQTest&#8217;<br \/>\n* Create an empty project called &#8216;MyAQRA&#8217;<br \/>\n* Create ra.xml<br \/>\n* Create oc4j-ra.xml<br \/>\n* Rebuild all<\/p>\n<span id=\"ra.xml\"><h3>ra.xml<\/h3><\/span>\n<p>* Right click project:  New -> Deployment Profiles -> RAR File<br \/>\n* Deployment Profile Name: MyAQRA<br \/>\n* Replace ra.xml content with one from howto<br \/>\n* Globally replace:<br \/>\n&#8216;OEMSJMSDRADisplayName&#8217; with &#8216;My AQ JMS Resource Adapter&#8217;<br \/>\n&#8216;OEMSJMSDReference&#8217; with &#8216;MyAQJMSResourceProvider&#8217;<br \/>\n&#8216;MY_QUEUE&#8217; if a different queue name is used in &#8216;Setup AQ&#8217; section.<br \/>\n&#8216;MY_TOPIC&#8217; if a different queue name is used in &#8216;Setup AQ&#8217; section.<\/p>\n<span id=\"oc4j-ra.xml\"><h3>oc4j-ra.xml<\/h3><\/span>\n<p>* Right click project: New -> Deployment Descriptor -> OC4J Deployment Descriptor Wizard -> oc4j-ra.xml<br \/>\n* Replace content with that of howto<br \/>\n* Globally replace:<br \/>\n&#8216;OEMSJMSDRAInstanceName&#8217; with &#8216;MyAQConnector&#8217;<br \/>\n&#8216;OEMSJMSDRASubcontext&#8217; with &#8216;MyAQJMSCtx&#8217;<br \/>\n&#8216;OEMSJMSDReference&#8217; with &#8216;MyAQJMSResourceProvider&#8217;<\/p>\n<span id=\"EAR_Project\"><h2>EAR Project<\/h2><\/span>\n<span id=\"Overview_2\"><h3>Overview<\/h3><\/span>\n<p>* Create an empty project called &#8216;MyAQEAR&#8217;<br \/>\n* Create &#8216;data-sources.xml&#8217;<br \/>\n* Create &#8216;orion-application.xml&#8217;<br \/>\n* Create &#8216;oc4j-connectors.xml&#8217;<br \/>\n* Create a new Deployment Profile of EAR File type. Name it &#8216;MyAQEAR&#8217;<\/p>\n<span id=\"data-sources.xml\"><h3>data-sources.xml<\/h3><\/span>\n<p>* Right click project: New -> Deployment Descriptor -> OC4J Deployment Descriptor Wizard -> data-sources.xml<br \/>\n* Replace content with that of howto<br \/>\n* Move all proxy-interface elements inside connection-factory element.<br \/>\n* Globally replace:<br \/>\n&#8216;MyChannelDemoDataSourcePool&#8217; to &#8216;MyAQUserDSPool&#8217;<br \/>\n&#8216;MyChannelDemoDataSource&#8217; to &#8216;MyAQUserDS&#8217;<br \/>\n&#8216;oemsjmsdthin&#8217; to &#8216;MyAQUserDS&#8217;<br \/>\n&#8216;MyChannelDemoUser&#8217; to &#8216;MyAQUser&#8217;<br \/>\n&#8216;MyChannelDemoPassword&#8217; to &#8216;MyAQUserPass&#8217;<br \/>\n* Set url accordingly: &#8216;jdbc:oracle:thin:@localhost:1521:orcl&#8217;<\/p>\n<span id=\"orion-application.xml\"><h3>orion-application.xml<\/h3><\/span>\n<p>* Right click project: New -> Deployment Descriptor -> OC4J Deployment Descriptor Wizard -> orion-application.xml<br \/>\n* Replace content with that of howto<br \/>\n* Globally replace:<br \/>\n&#8216;OEMSJMSDReference&#8217; with &#8216;MyAQJMSResourceProvider&#8217;<br \/>\n&#8216;MyChannelDemoDataSource&#8217; to &#8216;MyAQUserDS&#8217;<\/p>\n<span id=\"oc4j-connectors.xml\"><h3>oc4j-connectors.xml<\/h3><\/span>\n<p>* Right click project: New -> Deployment Descriptor -> OC4J Deployment Descriptor Wizard -> oc4j-connectors.xml<br \/>\n* Replace content with that of howto<br \/>\n* Globally replace:<br \/>\n&#8216;OEMSJMSDRAInstanceName&#8217; with &#8216;MyAQConnector&#8217;<br \/>\n&#8216;OEMSJMSDRASubcontext&#8217; with &#8216;MyAQJMSCtx&#8217;<br \/>\n&#8216;OEMSJMSDRADeploy&#8217; to &#8216;MyAQRA&#8217;<br \/>\n&#8216;OEMSJMSDReference&#8217; with &#8216;MyAQJMSResourceProvider&#8217;<br \/>\n&#8216;MY_QUEUE&#8217; if a different queue name is used in &#8216;Setup AQ&#8217; section.<br \/>\n&#8216;MY_TOPIC&#8217; if a different queue name is used in &#8216;Setup AQ&#8217; section.<\/p>\n<span id=\"Deployment_Profile\"><h3>Deployment Profile<\/h3><\/span>\n<p>* Click Rebuild All button<br \/>\n* Create a new Deployment Profile of EAR File type. Name it &#8216;MyAQJMSResourceAdatper&#8217;<br \/>\n* Select MyAQRA.deploy in Application Assembly screen.<br \/>\n* Create a new File Group named &#8216;FG1&#8217; of Packaging type.<br \/>\n* click File Groups -> FG1 -> Filters<br \/>\n* Select &#8216;oc4j-connectors.xml&#8217; only.<\/p>\n<span id=\"Deploy_EAR\"><h3>Deploy EAR<\/h3><\/span>\n<p>* Right click MyAQJMSResourceAdatper.deploy<br \/>\n* Click Deploy to LocalApplicationServer<\/p>\n<span id=\"Test_Client\"><h2>Test Client<\/h2><\/span>\n<p>* Create a new Java Application Project called &#8216;MyAQJMSClient&#8217;<br \/>\n* Add to project class path<br \/>\nC:\\prog\\oracle\\product\\10.1.3.1\\OracleAS_1\\lib\\dms.jar<br \/>\nC:\\prog\\oracle\\product\\10.1.3.1\\OracleAS_1\\jdbc\\lib\\ojdbc14.jar<br \/>\nC:\\prog\\oracle\\product\\10.1.3.1\\OracleAS_1\\j2ee\\home\\jazn.jar<br \/>\nC:\\prog\\oracle\\product\\10.1.3.1\\OracleAS_1\\j2ee\\home\\oc4j.jar<br \/>\nC:\\prog\\oracle\\product\\10.1.3.1\\OracleAS_1\\j2ee\\home\\oc4jclient.jar<br \/>\nC:\\prog\\oracle\\product\\10.1.3.1\\OracleAS_1\\j2ee\\home\\lib\\adminclient.jar<br \/>\nC:\\prog\\oracle\\product\\10.1.3.1\\OracleAS_1\\j2ee\\home\\lib\\bcel.jar<br \/>\nC:\\prog\\oracle\\product\\10.1.3.1\\OracleAS_1\\j2ee\\home\\lib\\connector.jar<br \/>\nC:\\prog\\oracle\\product\\10.1.3.1\\OracleAS_1\\j2ee\\home\\lib\\javax77.jar<br \/>\nC:\\prog\\oracle\\product\\10.1.3.1\\OracleAS_1\\j2ee\\home\\lib\\jms.jar<br \/>\nC:\\prog\\oracle\\product\\10.1.3.1\\OracleAS_1\\j2ee\\home\\lib\\oc4j-internal.jar<br \/>\n* Create a new Java Class named &#8216;AbstractJMSClient&#8217;: New -> General -> Java Class<\/p>\n<pre lang=\"java\">\r\npackage myaqjmsclient;\r\n\r\nimport javax.jms.*;\r\nimport javax.naming.*;\r\n\r\npublic class AbstractJMSClient {\r\n    private static final String CONN_FACTORY =\r\n        \"java:comp\/env\/jms\/QueueConnectionFactory\";\r\n    private static final String HELLO_Q = \r\n        \"java:comp\/env\/jms\/helloQueue\";\r\n\r\n    private QueueConnectionFactory factory = null;\r\n\r\n    protected Queue getQueue() throws NamingException {\r\n        Context ctx = new InitialContext();\r\n        QueueConnectionFactory factory = getQueueConnectionFactory();\r\n        Queue q = (Queue) ctx.lookup(HELLO_Q);\r\n        return q;\r\n    }\r\n\r\n    protected QueueConnection getQueueConnection() throws NamingException,\r\n            JMSException {\r\n        return getQueueConnectionFactory().createQueueConnection();\r\n    }\r\n\r\n    private QueueConnectionFactory getQueueConnectionFactory()\r\n            throws NamingException {\r\n        Context ctx = new InitialContext();\r\n        factory = (QueueConnectionFactory) ctx.lookup(CONN_FACTORY);\r\n        return factory;\r\n    }\r\n}\r\n\r\n<\/pre>\n<p>* Create a new Java Class named &#8216;SendHelloAQ&#8217;: New -> General -> Java Class -> Extends &#8216;myaqjmsclient.AbstractJMSClient&#8217; and check &#8216;Generate Main Method&#8217;<\/p>\n<pre lang=\"java\">\r\npackage myaqjmsclient;\r\n\r\nimport javax.jms.*;\r\nimport javax.naming.NamingException;\r\n\r\npublic class SendHelloAQ extends AbstractJMSClient {\r\n    public static void main(String[] args) throws Exception {\r\n        SendHelloAQ sendHelloAQ = new SendHelloAQ();\r\n        sendHelloAQ.send();\r\n    }\r\n\r\n    public void send() throws JMSException, NamingException {\r\n        Queue q = getQueue();\r\n        QueueConnection connection = getQueueConnection();\r\n        connection.start();\r\n        QueueSession session = connection.createQueueSession(false,\r\n                Session.AUTO_ACKNOWLEDGE);\r\n        QueueSender sender = session.createSender(q);\r\n        TextMessage msg = session.createTextMessage();\r\n        msg.setText(\"Hello AQ!\");\r\n        sender.send(msg);\r\n\r\n        sender.close();\r\n        session.close();\r\n        connection.close();\r\n\r\n        System.out.println(\"Message Sent\");\r\n    }\r\n}\r\n<\/pre>\n<p>* Create a new Java Class named &#8216;ReceiveHelloAQ&#8217;: New -> General -> Java Class -> Extends &#8216;myaqjmsclient.AbstractJMSClient&#8217; and check &#8216;Generate Main Method&#8217;<\/p>\n<pre lang=\"java\">\r\npackage myaqjmsclient;\r\n\r\nimport javax.jms.*;\r\nimport javax.naming.NamingException;\r\n\r\npublic class ReceiveHelloAQ extends AbstractJMSClient {\r\n    public static void main(String[] args) throws Exception {\r\n        ReceiveHelloAQ receiveHelloAQ = new ReceiveHelloAQ();\r\n        receiveHelloAQ.receive();\r\n    }\r\n\r\n    public void receive() throws NamingException, JMSException {\r\n        Queue q = getQueue();\r\n        QueueConnection connection = getQueueConnection();\r\n        connection.start();\r\n        QueueSession session = connection.createQueueSession(false,\r\n                Session.AUTO_ACKNOWLEDGE);\r\n        QueueReceiver receiver = session.createReceiver(q);\r\n        TextMessage msg = (TextMessage)receiver.receiveNoWait();\r\n\r\n        if(msg != null)\r\n            System.out.println(\"Received: \" + msg.getText());\r\n        else\r\n            System.out.println(\"No message received\");\r\n\r\n        receiver.close();\r\n        session.close();\r\n        connection.close();\r\n    }\r\n}\r\n<\/pre>\n<p>* Create a new file named &#8216;jndi.properties&#8217;<\/p>\n<pre lang=\"dos\">\r\njava.naming.factory.initial=com.evermind.server.ApplicationClientInitialContextFactory\r\njava.naming.provider.url=ormi:\/\/localhost:12401\/MyAQJMSResourceAdatper\r\n# Or use opmn:ormi for automatic port determination\r\n#java.naming.provider.url=opmn:ormi:\/\/localhost\/MyAQJMSResourceAdatper:home\r\njava.naming.security.principal=oc4jadmin\r\njava.naming.security.credentials=welcome1\r\n<\/pre>\n<p>* Create a new &#8216;application-client.xml&#8217;: New -> Deployment Profiles -> Client JAR File -> Profile Name: MyAQJMSClient<\/p>\n<pre lang=\"xml\">\r\n<?xml version = '1.0' encoding = 'windows-1252'?>\r\n<application-client xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" \r\nxsi:schemaLocation=\"http:\/\/java.sun.com\/xml\/ns\/j2ee http:\/\/java.sun.com\/xml\/ns\/j2ee\/application-client_1_4.xsd\" version=\"1.4\" xmlns=\"http:\/\/java.sun.com\/xml\/ns\/j2ee\">\r\n    <display-name>MyAQJMSClient-app-client<\/display-name>\r\n    <resource-ref>\r\n        <res-ref-name>jms\/QueueConnectionFactory<\/res-ref-name>\r\n        <res-type>javax.jms.QueueConnectionFactory<\/res-type>\r\n        <res-auth>Container<\/res-auth>\r\n        <res-sharing-scope>Shareable<\/res-sharing-scope>\r\n    <\/resource-ref>\r\n    <resource-env-ref>\r\n        <resource-env-ref-name>jms\/helloQueue<\/resource-env-ref-name>\r\n        <resource-env-ref-type>javax.jms.Queue<\/resource-env-ref-type>\r\n    <\/resource-env-ref>\r\n<\/application-client>\r\n<\/pre>\n<p>* Create a new &#8216;orion-application-client.xml&#8217;: New -> Deployment Descriptors -> OC4J Deployment Descriptor Wizard -> orion-application-client.xml -> Version 10.0<\/p>\n<pre lang=\"xml\">\r\n<?xml version = '1.0' encoding = 'windows-1252'?>\r\n<orion-application-client xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" \r\nxsi:noNamespaceSchemaLocation=\"http:\/\/xmlns.oracle.com\/oracleas\/schema\/orion-application-client-10_0.xsd\">\r\n    <resource-ref-mapping \r\n      name=\"jms\/QueueConnectionFactory\"\r\n      location=\"MyAQJMSCtx\/MyQCF\"\/>\r\n    \r\n    <resource-env-ref-mapping \r\n      name=\"jms\/helloQueue\"\r\n      location=\"MyAQJMSCtx\/MyQ\"\/>\r\n    <!-- location=\"MyAQJMSCtx\/Topics\/Topics\/MY_QUEUE\" -->\r\n<\/orion-application-client>\r\n<\/pre>\n<p>* Run &#8216;SendHelloAQ.java&#8217; to send a message.<\/p>\n<pre lang=\"bash\">\r\nset ORA_AS_HOME=C:\\prog\\oracle\\product\\10.1.3.1\\OracleAS_1\r\nset JAVA_HOME=%ORA_AS_HOME%\\jdk\r\n\r\nset MY_CP=.;%ORA_AS_HOME%\\lib\\dms.jar;%ORA_AS_HOME%\\jdbc\\lib\\ojdbc14.jar;%ORA_AS_HOME%\\j2ee\\home\\jazn.jar;%ORA_AS_HOME%\\j2ee\\home\\oc4j.jar;%ORA_AS_HOME%\\j2ee\\home\\oc4jclient.jar;%ORA_AS_HOME%\\j2ee\\home\\lib\\adminclient.jar;%ORA_AS_HOME%\\j2ee\\home\\lib\\bcel.jar;%ORA_AS_HOME%\\j2ee\\home\\lib\\connector.jar;%ORA_AS_HOME%\\j2ee\\home\\lib\\javax77.jar;%ORA_AS_HOME%\\j2ee\\home\\lib\\jms.jar;%ORA_AS_HOME%\\j2ee\\home\\lib\\oc4j-internal.jar\r\n\r\n%JAVA_HOME%\/bin\/java -cp %MY_CP% myaqjmsclient.SendHelloAQ\r\n<\/pre>\n<p>* Run &#8216;ReceiveHelloAQ.java&#8217; to receive a message.<\/p>\n<pre lang=\"bash\">\r\nset ORA_AS_HOME=C:\\prog\\oracle\\product\\10.1.3.1\\OracleAS_1\r\nset JAVA_HOME=%ORA_AS_HOME%\\jdk\r\n\r\nset MY_CP=.;%ORA_AS_HOME%\\lib\\dms.jar;%ORA_AS_HOME%\\jdbc\\lib\\ojdbc14.jar;%ORA_AS_HOME%\\j2ee\\home\\jazn.jar;%ORA_AS_HOME%\\j2ee\\home\\oc4j.jar;%ORA_AS_HOME%\\j2ee\\home\\oc4jclient.jar;%ORA_AS_HOME%\\j2ee\\home\\lib\\adminclient.jar;%ORA_AS_HOME%\\j2ee\\home\\lib\\bcel.jar;%ORA_AS_HOME%\\j2ee\\home\\lib\\connector.jar;%ORA_AS_HOME%\\j2ee\\home\\lib\\javax77.jar;%ORA_AS_HOME%\\j2ee\\home\\lib\\jms.jar;%ORA_AS_HOME%\\j2ee\\home\\lib\\oc4j-internal.jar\r\n\r\n%JAVA_HOME%\/bin\/java -cp %MY_CP% myaqjmsclient.ReceiveHelloAQ\r\n<\/pre>\n<span id=\"References\"><h2>References<\/h2><\/span>\n<p>* <a href=\"http:\/\/blogs.oracle.com\/olaf\/2007\/07\/oc4j_configuring_and_using_aq.html\">http:\/\/blogs.oracle.com\/olaf\/2007\/07\/oc4j_configuring_and_using_aq.html<\/a><br \/>\n* <a href=\"http:\/\/www.oracle.com\/technology\/tech\/java\/oc4j\/1013\/how_to\/how-to-connect-to-oemsjmsd\/doc\/how-to-connect-to-oemsjmsd.html\">http:\/\/www.oracle.com\/technology\/tech\/java\/oc4j\/1013\/how_to\/how-to-connect-to-oemsjmsd\/doc\/how-to-connect-to-oemsjmsd.html<\/a><br \/>\n* <a href=\"http:\/\/www.oracle.com\/technology\/tech\/java\/oc4j\/1013\/how_to\/index.html\">http:\/\/www.oracle.com\/technology\/tech\/java\/oc4j\/1013\/how_to\/index.html<\/a><\/p>\n<p>* <a href=\"http:\/\/mike-lehmann.blogspot.com\/2006\/09\/simple-mdb-with-oracle-database-jms.html\">http:\/\/mike-lehmann.blogspot.com\/2006\/09\/simple-mdb-with-oracle-database-jms.html<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Overview * Download how-to-connect-to-oemsjmsd.zip * Start JDev (10.1.3.3.0) * Setup AQ * Create Resource Adapter * Create EAR and deploy EAR * Test with a client Setup AQ * Create MyAQUser.sql as follows: DROP USER MyAQUser CASCADE; GRANT connect, resource,AQ_ADMINISTRATOR_ROLE &hellip; <a href=\"https:\/\/jianmingli.com\/wp\/?p=1591\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[71,69],"tags":[582],"class_list":["post-1591","post","type-post","status-publish","format-standard","hentry","category-jms","category-oc4j","tag-jms"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8cRUO-pF","_links":{"self":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1591","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1591"}],"version-history":[{"count":16,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1591\/revisions"}],"predecessor-version":[{"id":1594,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1591\/revisions\/1594"}],"wp:attachment":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1591"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1591"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1591"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}