| Andrew Cooke | Contents | Latest | RSS | Twitter | Previous | Next


Welcome to my blog, which was once a mailing list of the same name and is still generated by mail. Please reply via the "comment" links.

Always interested in offers/projects/new ideas. Eclectic experience in fields like: numerical computing; Python web; Java enterprise; functional languages; GPGPU; SQL databases; etc. Based in Santiago, Chile; telecommute worldwide. CV; email.

Personal Projects

Lepl parser for Python.

Colorless Green.

Photography around Santiago.

SVG experiment.

Professional Portfolio

Calibration of seismometers.

Data access via web services.

Cache rewrite.

Extending OpenSSH.

C-ORM: docs, API.

Last 100 entries

RAND on fighting online anarchy (2001); Now Is Cat Soft LLC's Chance To Save Up To 32% On Mail; NSA Hacked; Call Center Services for Cat Soft LLC; Very Good LRB Article on Brexit; Nussbaum on Anger; Credit Card Processing for Cat Soft LLC; Discover new movies on demand in our online cinema; Tasting; Credit Card Processing for Cat Soft LLC; Apple + Kiwi Jam; Hit Me; Increase Efficiency with GPS Vehicle Tracking for Cat Soft LLC; Sudoku - CSP + Chaos; Recycling Electronics In Santiago; Vector Displays in OpenGL; Call Center Services for Cat Soft LLC; And Anti-Aliased; OpenGL - Render via Intermediate Texture; And Garmin Connect; Using Garmin Forerunner 230 With Linux; Payroll Service Quotes for Cat Soft LLC; (Beating Dead Horse) StackOverflow; Current State of Justice in China; Now Is Cat Soft LLC's Chance To Save Up To 32% On Mail; Axiom of Determinacy; Ewww; Fee Chaos Book; Course on Differential Geometry; Increase Efficiency with GPS Vehicle Tracking for Cat Soft LLC; Okay, but...; Sparse Matrices, Deep Learning; Sounds Bad; Applebaum Rape; Tomato Chutney v4; Have to add...; Culturally Liberal and Nothing More; Weird Finite / Infinite Result; Your diamond is a beaten up mess; Maths Books; Good Bike Route from Providencia / Las Condes to Panul\; Iain Pears (Author of Complex Plots); Plum Jam; Excellent; More Recently; For a moment I forgot StackOverflow sucked; A Few Weeks On...; Chilean Book Recommendations; How To Write Shared Libraries; Jenny Erpenbeck (Author); Dijkstra, Coins, Tables; Python libraries error on OpenSuse; Deserving Trump; And Smugness; McCloskey Economics Trilogy; cmocka - Mocks for C; Concept Creep (Americans); Futhark - OpenCL Language; Moved / Gone; Fan and USB issues; Burgers in Santiago; The Origin of Icosahedral Symmetry in Viruses; autoenum on PyPI; Jars Explains; Tomato Chutney v3; REST; US Elections and Gender: 24 Point Swing; PPPoE on OpenSuse Leap 42.1; SuperMicro X10SDV-TLN4F/F with Opensuse Leap 42.1; Big Data AI Could Be Very Bad Indeed....; Cornering; Postcapitalism (Paul Mason); Black Science Fiction; Git is not a CDN; Mining of Massive Data Sets; Rachel Kaadzi Ghansah; How great republics meet their end; Raspberry, Strawberry and Banana Jam; Interesting Dead Areas of Math; Later Taste; For Sale; Death By Bean; It's Good!; Tomato Chutney v2; Time ATAC MX 2 Pedals - First Impressions; Online Chilean Crafts; Intellectual Variety; Taste + Texture; Time Invariance and Gauge Symmetry; Jodorowsky; Tomato Chutney; Analysis of Support for Trump; Indian SF; TP-Link TL-WR841N DNS TCP Bug; TP-Link TL-WR841N as Wireless Bridge; Sending Email On Time; Maybe run a command; Sterile Neutrinos; Strawberry and Banana Jam; The Best Of All Possible Worlds; Kenzaburo Oe: The Changeling

© 2006-2015 Andrew Cooke (site) / post authors (content).

Mule + Java Interfaces

From: "andrew cooke" <andrew@...>

Date: Fri, 13 Jan 2006 15:53:20 -0300 (CLST)

These are some notes I wrote at work to clarify how messaging with Mule
could (should?) work in our system.  One of the side issues here is that
it's unclear what J2EE buys us.


Consider two services implemented as:

class edu.noao.nsa.msg.SomeMessage {
  // serializable data transfer object with getters/setters

interface edu.noao.nsa.serviceA.ServiceA {
  public SomeResponse doSomething(SomeMessage message);

class edu.noao.nsa.serviceA.impl.ServiceA {
  // implements the functionality as a simple bean

@Local interface edu.noao.nsa.serviceA.ejb.ServiceALocal
extends ServiceA {}

@Remote interface edu.noao.nsa.serviceA.ejb.ServiceARemote
extends ServiceA {}

@Stateless class edu.noao.nsa.serviceA.ejb.ServiceA
extends ServiceAImpl {
  // do injection from @Resource here

class edu.noao.nsa.serviceB.impl.ServiceB {
  private ServiceA serviceA; // plus getters/setters
  public Object someProcess(...) {
    response = serviceA.doSomething(message);

note the package structure:

 +- noao
     +- nsa
         +- msg
         |   +- serializable message beans
         +- serviceA
         |   +- ServiceA as interface
         |   +- impl
         |   |   +- ServiceA implemented as bean
         |   +- ejb
         |   |   +- wrappers for EJB3
         |   +- test etc
         +- serviceB
             +- ServiceB as interface
             +- impl
             |   +- ServiceB implemented as bean
             +- ejb
                 +- wrappers for EJB3

Now for testing we can write Java unit tests on the impl classes.  We can
even connect together services (using Spring) to test more than one
service at a time.

Note - testing service together may seem more like integration testing,
but in the VOI we follow this same pattern down inside the VOI.  So the
VOI itself is composed of sub-services (components) that plug together as
required.  These then test as described above, but can still be deployed

The EJB wrappers do two things:
- provide Local/Remote interfaces
- do the necessary injection via @Resource

So as monolithic Java code, that just works.  Either in J2EE or in some
Spring based container.  What extra work needs to be done to deploy the
services on separate machines?

First we need to implement a proxy that intercepts the message from
serviceB.  We already have a set of MessageSender implementations which
send a message to Mule.  So the code is:

class edu.noao.nsa.serviceA.mule.ServiceAMsgProxy implements ServiceA {
  private MessageSender messageSender;
  public void setMessageSender...;
  public MessageSender getMessageSender...;
  public SomeResponse doSomething(SomeMessage message) {
    return (SomeResponse)getSender().sendSynchronous(message);

That's it.

Seriously.  No more Java code.  That will send the message object to Mule,
which can be configured to send the message anywhere, via any messaging
system (JMS / convert it to XML / send it as an email / SOAP /
in-memory/VM etc).

This proxy is injected into ServiceB.  ServiceB sees the same interface as
before and talks to it as before.

At the ServiceA end, no extra code is needed at all.  Instead you either:
- deploy ServiceA within Mule, in which case routing is trivial
  (practically automatic)
- deploy ServiceA in EJB, in which case you configure Mule to call the EJB
  (we extend Mule to call EJBs - this was a strange ommission in Mule, but
extension - adding a new "provider" - is quite simple).

So the advantages are:
- Write and test pure Java code
- Type checking of inter-service contracts via interfaces
- No messaging code appears in the "business logic"
- All routing decisions are isolated in Mule
- Only a single, simple proxy at the sender is required
- No interface at all is required at the receiver
- The final deployment structure is not fixed in the design
- Progressively more complex messaging technologies can be configured -
Mule provides synchronous transport over asynchronous messaging

One disadvantage is organising the build so that the cross-dependencies
work OK.  This reflects the cross-dependencies in the contracts that each
service relies on - it's not an artifact of bad engineering, but a
reflection that services do depend on each other via their interfaces, and
that this should be verified as early as possible.

I suspect the best build solution is to use two passes - once to generate
the interfaces and a second time to compile code that depends on all the
interfaces available.


[Fwd: (Strictly limited) circular dependencies with M2]

From: "andrew cooke" <andrew@...>

Date: Sat, 14 Jan 2006 11:25:32 -0300 (CLST)

---------------------------- Original Message ----------------------------
Subject: (Strictly limited) circular dependencies with M2
From:    "andrew cooke" <andrew@...>
Date:    Sat, January 14, 2006 11:14
To:      users@...


I have been asked to configure Maven 2 for our new project at work.  The
project architecture is a set of services, each of which will be a
separate sub-project in Maven 2.

However, each service depends on the *external interfaces* of the services
it connects to.

I know that generally circular dependencies are a "bad thing", so I want
to explain carefully why the dependency we have is not:

 Each service has a contract that it implements.  A calling (dependent)
 service depends on this contract.  If the contract is broken, the system
 will fail.

 Since the contract is critical, it makes sense to test it as early as
 possible.  Preferably at compile time.  We can do this (to a limited
 extent) by expressing the contract as an interface.  So any code that
 uses service X compiles againts the interface that X provides.

 We can then insert proxies and messaging so that the services can exist
 on different machines, etc.  More details at

Of course, we do not want "deep" dependencies of one service on another,
so the external interfaces are restricted to:

 - Java interfaces that the service implements
 - Data transfer objects (serializable, simple beans)

How should this be structured?  Since the data transfer objects are shared
between services and have some additional constraints from the messaging
technology (serializable; it would also be useful to have a carefully
designed inheritance hierarchy for simplifying routing decisions based on
class) I think they should go into a separate "messaging" project.  The
interfaces that each service provides, however, belong in the appropriate

So we have the package structure:

  +- messaging
  |   +- data transfer objects
  +- service 1
  |   +- external interface
  |   +- implementation
  +- service 2
  .   +- external interface
  .   +- implementation

To build this I need to:

 - compile messaging (data transfer objects)
 - compile external interfaces for each service
 - package external interfaces and message objects
   (necessary for the messaging system)
 - compile implementations for each service
 - package each service (both interface and implementation)

(I may also need to package services as ejb3 beans)

If I do this, all dependencies are resolved correctly.

My question, then, is how do I do this with Maven 2?  Sorry I had to write
so much to ask it, and further apopolgies if this is really obvious.  I've
looked around the documentation, but can't see how this level of control
is provided.


[Fwd: RE: (Strictly limited) circular dependencies with M2]

From: "andrew cooke" <andrew@...>

Date: Sat, 14 Jan 2006 13:40:37 -0300 (CLST)

---------------------------- Original Message ----------------------------
Subject: RE: (Strictly limited) circular dependencies with M2
From:    "Allison, Bob" <robert.allison@...>
Date:    Sat, January 14, 2006 13:25

The normal way of handling this kind of dependency tree is to put the
common stuff (each service's interface and DTOs) is a separate project.
Then each service's project depends on this common stuff project.

Make sense?

[Fwd: RE: (Strictly limited) circular dependencies with M2]

From: "andrew cooke" <andrew@...>

Date: Sat, 14 Jan 2006 13:42:02 -0300 (CLST)

---------------------------- Original Message ----------------------------
Subject: RE: (Strictly limited) circular dependencies with M2
From:    "andrew cooke" <andrew@...>
Date:    Sat, January 14, 2006 13:32

It makes sense, but it seems a bit ugly.  I guess there's nothing to stop
the two projects sharing the same Java package namespace.  Hmmm.

OK, I guess I'll go with that.  It seems like Maven is being a bit
intrusive, though.  On the other hand, I guess it will drive home to
everyone the distinction between the two.


[Fwd: New, clean, elegeant, succint, correct, consistent, tidy, compact, ordered, directed, cycle-free and generally wonderful maven structure]

From: "andrew cooke (noao)" <acooke@...>

Date: Thu, 23 Feb 2006 19:54:43 -0300 (CLST)

I don't think I'm breaking any rules by forwarding this from work...

---------------------------- Original Message ----------------------------
Subject: New, clean, elegeant, succint, correct, consistent, tidy,
compact,      ordered, directed, cycle-free and generally wonderful maven
From:    "andrew cooke (noao)" <acooke@...>

This is how I've left CVS.  PLease shout if it doesn't make sense.

You can get the new tree by doing "cvs checkout nsa-maven".  DON'T try
doing an update into your old tree ;o)

A note on package contents

messaging-iface contains (should contain?  Evan?) message beans (which are
built from simple serializable objects) and interfaces to the services
that messaging implements (messaging itself may be empty at the moment,
but remains as a placeholder in case it is needed in the future).

Other service iface classes define the interfaces that the service
provides, in terms of the message objects.

So a very simple interface looks like:

package edu.noao.nsa.<name>
import edu.noao.nsa.messaging.MyBean

public Interface MyService {
  // argument is a message bean from messaging-iface
  public void doSomething(MyBean msg);


This is the dependency tree - code can only refer to code for which there
is a path going *up*.

So, for example, nothing can refer to code in the messaging package.
However, everything except toolkit and mulex can refer to the
messaging-iface package, which contains the message POJOs and the
interfaces that the messaging infrastructure provides.

Another example - the generic <name> package (ie any typical future
package) only has access to <name>-iface (which it implements) and
messaging-iface.  So it can do its own work, create message objects and
send messages (but nothing else).

There is one complication.  The old messaging code was not written with
this structure in mind.  For now, every service depends on messaging-old.
However, this will be phased out once we have scavenged that code for
anything that might be useful and people have eliminated dependencies.

Oh, and "toolkit" is a placeholder for common (service-independent)
utility code, currently empty.

 \- messaging-iface------\    messaging-old
    |                     |   :
    |\-security-iface----\|   :
    |  |                  |   :
    |   \-security........|...:
    |                     |   :
    |\-dataservice-iface-\|   :
    |  |                  |   :
    |   \-dataservice.....|...:
    |                     |   :
    |\-logging-iface-----\|   :
    |  |                  |   :
    |   \-logging.........|...:
    |                     |   :
    |\-voi-iface---------\|   :
    |  |                  |   :
    |   \-voi.............|...:
    |                     |   :
     \-<name>-iface------\|   :
       |                  |   :
        \-<name>..........|...:   mulex
                          |   :   |

[Fwd: Suggested naming standard/structure for a service]

From: "andrew cooke" <andrew@...>

Date: Thu, 23 Feb 2006 19:57:17 -0300 (CLST)

In fact, I think the J2EE remote interface should also be in -iface.

---------------------------- Original Message ----------------------------
Subject: Suggested naming standard/structure for a service
From:    "andrew cooke (noao)" <acooke@...>

[not sure anyone but alvaro cares about this, but fyi]

trying to get the security/npa code into a format consistent with
everything we've discussed so far, this is what i think the final "new
proposal alert" code will look like:

in nsa-maven/maven/newproposalalert-iface:
          +-NewProposalAlertIface (interface provided to messaging,
              taking and returning message beans as arguments)

in nsa-maven/maven/newproposalalert:
        +-NewProposalAlert (local interface, expressed in local classes
        |   relevant to internal logic)
        | +-ejb (optional)
        | | +-NewProposalAlertBean (ejb imp. of NewProposalAlertIface,
        | |     has NewProposalAlert implementation hard-wired, perhaps
        | |     by extending NewProposalAlertImpl)
        | +-spring
        |   +-NewProposalAlertBean (spring imp. of NewProposalAlertIface,
        |       receives a NewProposalAlert implementation - an instance
        |       of NewProposalAlterImpl - via spring injection; unpacks
        |       message and calls NewProposalAlert; packages result)
          +-NewProposalAlterImpl (implementation of NewProposalAlert)

in nsa-maven/maven/messaging-iface:
the message beans that appear in NewProposalAlterIface

Comment on this post